public void AplicarAlgoritmoDasEconomias()
        {
            var sede     = Vertices.First(v => v.Identificador == "Sede");
            var corAtual = Cores.First(c => c.Nome == "Vermelho");

            const int distanciaMaxima             = 30;
            var       maiorCustoDeArestaParaASede = Arestas.Where(a => a.Antecessor == sede).OrderByDescending(a => a.Custo).First().Custo;

            var economias        = ObterListaDeEconomias();
            var verticesPassados = new List <Vertice>();

            while (economias.Any())
            {
                var economiaAtual = economias.First();
                var valorTotalIndoEVoltandoParaSede = economiaAtual.ArestaJK.Custo * 2 + economiaAtual.ArestaKI.Custo * 2;
                var valorPegandoAtalho = economiaAtual.ArestaIJ.Custo + economiaAtual.ArestaJK.Custo + economiaAtual.ArestaKI.Custo;

                if (valorTotalIndoEVoltandoParaSede > valorPegandoAtalho)
                {
                    CustoTotal += economiaAtual.ArestaIJ.Custo;

                    economiaAtual.ArestaIJ.Cor = corAtual.Hexadecimal;

                    if (verticesPassados.Contains(economiaAtual.ArestaIJ.Antecessor) || verticesPassados.Contains(economiaAtual.ArestaIJ.Sucessor))
                    {
                        var verticeReferencia      = verticesPassados.Contains(economiaAtual.ArestaIJ.Antecessor) ? economiaAtual.ArestaIJ.Antecessor : economiaAtual.ArestaIJ.Sucessor;
                        var arestasASeremRemovidas = Arestas.Where(a => a.Antecessor == verticeReferencia || a.Sucessor == verticeReferencia);
                        economias.RemoveAll(a => arestasASeremRemovidas.Contains(a.ArestaIJ));
                    }

                    verticesPassados.Add(economiaAtual.ArestaIJ.Antecessor);
                    verticesPassados.Add(economiaAtual.ArestaIJ.Sucessor);
                }
                else
                {
                    CustoTotal += valorTotalIndoEVoltandoParaSede;

                    economiaAtual.ArestaJK.Cor = corAtual.Hexadecimal;
                    economiaAtual.ArestaKI.Cor = corAtual.Hexadecimal;

                    var arestaJKContraria = Arestas.First(a => a.Antecessor == economiaAtual.ArestaJK.Sucessor && a.Sucessor == economiaAtual.ArestaJK.Antecessor);
                    arestaJKContraria.Cor = corAtual.Hexadecimal;

                    var arestaKIContraria = Arestas.First(a => a.Antecessor == economiaAtual.ArestaKI.Sucessor && a.Sucessor == economiaAtual.ArestaKI.Antecessor);
                    arestaKIContraria.Cor = corAtual.Hexadecimal;
                }

                Economias.Add(economiaAtual);
                economias.Remove(economiaAtual);
            }
        }
        public void PintarArestasDeIdaEVolta()
        {
            var arestasDaOrigem = Arestas.Where(a => a.Antecessor.Identificador == "Sede").ToList();
            var corLaranja      = Cores.First(c => c.Nome == "Laranja");

            foreach (var aresta in arestasDaOrigem)
            {
                aresta.Cor = corLaranja.Hexadecimal;

                var arestaNova = new Aresta()
                {
                    Codigo     = Arestas.Last().Codigo + 1,
                    Custo      = aresta.Custo,
                    Antecessor = aresta.Sucessor,
                    Sucessor   = aresta.Antecessor,
                    Cor        = corLaranja.Hexadecimal
                };

                Arestas.Add(arestaNova);
            }
        }
        private List <Economia> ObterListaDeEconomias()
        {
            var economias           = new List <Economia>();
            var sede                = Vertices.First(v => v.Identificador == "Sede");
            var arestasLigadasASede = Arestas.Where(a => a.Antecessor == sede || a.Sucessor == sede);

            foreach (var aresta in Arestas)
            {
                var i = aresta.Antecessor;
                var j = aresta.Sucessor;
                var arestasAPartirDaSede = arestasLigadasASede.Where(a => a.Antecessor == i || a.Sucessor == i || a.Antecessor == j || a.Sucessor == j);

                var economia = new Economia()
                {
                    ArestaIJ = aresta,
                    ArestaJK = arestasAPartirDaSede.First(a => a.Antecessor == j || a.Sucessor == j),
                    ArestaKI = arestasAPartirDaSede.First(a => a.Antecessor == i || a.Sucessor == i)
                };

                economias.Add(economia);
            }

            return(economias.OrderByDescending(e => e.Valor).ToList());
        }
Пример #4
0
 public Aresta ObtenhaAresta(int Id)
 {
     return(Arestas.Where(x => x.Id == Id).FirstOrDefault());
 }
Пример #5
0
 public Aresta ObtenhaAresta(int idOrigem, int idDestino)
 {
     return(Arestas.Where(x => x.Origem == idOrigem && x.Destino == idDestino).FirstOrDefault());
 }
Пример #6
0
 public Aresta GetAresta(int Id)
 {
     return(Arestas.Where((x) => x.Id == Id).FirstOrDefault());
 }