public float FatorCromossomo(int index, semaforoTemporario configuracao, semaforoTemporario proximaConfiguracao) { var ruasEntrada = Semaforos[index].RuasOrigem; var ruasDestino = Semaforos[index].RuasDestino; float somatorioLivre = Ruas.Where(x => ruasEntrada.Contains(x.Id)).Select(x => (x.Comprimento * x.EspacoOcupado.Count) - x.EspacoOcupado.Sum()).Sum(); float somatorioOcupado = Ruas.Where(x => ruasEntrada.Contains(x.Id)).Select(x => x.EspacoOcupado.Sum()).Sum(); float espacoLivreProximo = Ruas.Where(x => ruasDestino.Contains(x.Id)).Select(x => (x.Comprimento * x.EspacoOcupado.Count) - x.EspacoOcupado.Sum()).Sum(); float fator1 = (somatorioLivre + somatorioOcupado) / (somatorioOcupado + configuracao.aberto); float fator2 = (espacoLivreProximo - (somatorioOcupado / configuracao.aberto)); if (fator2 < 0) { fator2 *= -1; } fator2 = fator2 - proximaConfiguracao.aberto; var retorno = fator1 - fator2; if (retorno < 0) { retorno = 0; } if (configuracao.aberto <= maxValue && configuracao.fechado >= minValue) { retorno += 30; } else { retorno = 0; } return(retorno); }
public List <semaforoTemporario> ConverteCromossomoParaSemaforo(List <string> Cromossomo) { var retorno = new List <semaforoTemporario>(); int qtdGenesCromossomo = Cromossomo.Count / Semaforos.Count; // numeros de genes por cromossomo int pat = 0; // posicao atual for (int i = 0; i < Semaforos.Count; i++) { StringBuilder sm = new StringBuilder(); for (int j = 0; j < qtdGenesCromossomo; j++) { sm.Append(Cromossomo[pat + j]); } pat += qtdGenesCromossomo; var semaforo = new semaforoTemporario { aberto = Convert.ToInt32(sm.ToString().Substring(0, qtdGenesCromossomo / 2), 2), fechado = Convert.ToInt32(sm.ToString().Substring(qtdGenesCromossomo / 2), 2) }; retorno.Add(semaforo); } return(retorno); }