private Percurso PercursoRandom() { var lista = new List <int>(); Percurso retorno = null; var random = new Random(); do { retorno = new Percurso(Help.cidades.Count + 1); lista.Clear(); retorno.InsereRotaArr(0); for (int i = 1; i < Help.cidades.Count; i++) { var posicao = -1; do { posicao = random.Next(1, Help.cidades.Count); if (lista.IndexOf(posicao) >= 0) { posicao = -1; } else { retorno.AdicionaRotasArr((sbyte)posicao); lista.Add(posicao); } } while (posicao == -1); } retorno.AdicionaRotasArr(0); } while (RotasUtilizadasGenetico.IndexOf(retorno.MontaRotasNumArr()) >= 0); RotasUtilizadasGenetico.Add(retorno.MontaRotasNumArr()); return(retorno); }
private void CalculaForcaBruta() { MelhoresResultados = new List <Percurso>(); var fatorial = MathNet.Numerics.SpecialFunctions.Factorial(Help.cidades.Count - 1); var cidades = new sbyte[Help.cidades.Count - 1]; var aux = 1; for (int i = 0; i < cidades.Length; i++) { cidades[i] = (sbyte)aux; aux++; } var menorDistancia = int.MaxValue; if (Inicial == 0) { Inicial = 1; } if (Final == 0) { Final = int.Parse(fatorial.ToString()); } var varAuxilio = 0; for (int i = Inicial; i <= Final; i++) { var percurso = new Percurso(Help.cidades.Count + 1); var comb = new sbyte[cidades.Length]; var disponiveis = cidades; var repanterior = int.Parse(fatorial.ToString()); //niveis for (int j = 0; j < cidades.Length; j++) { decimal rep = repanterior / (cidades.Length - j); var modPosicao = i % repanterior; if (modPosicao == 0) { modPosicao = i; while (modPosicao > repanterior) { modPosicao -= int.Parse(repanterior.ToString()); } } repanterior = int.Parse(rep.ToString()); if ((rep == 1) && (j == (cidades.Length - 2))) { modPosicao = varAuxilio; varAuxilio++; if (varAuxilio > 1) { varAuxilio = 0; } comb[j] = disponiveis[modPosicao]; } else { if (TotalDisponivel(ref disponiveis) == 1) { comb[j] = disponiveis[0]; } else { comb[j] = disponiveis[decimal.ToInt16(Math.Ceiling(modPosicao / rep)) - 1]; } } AtualizaDisponiveis(ref disponiveis, comb[j]); } percurso.AdicionaRotasArr(comb); percurso.InsereRotaArr(0); percurso.AdicionaRotasArr(0); if (percurso.distancia < menorDistancia) { menorDistancia = percurso.distancia; if (MelhoresResultados.Count() >= QuantidadeResultados) { MelhoresResultados.Remove(MelhoresResultados.ElementAt(QuantidadeResultados - 1)); } MelhoresResultados.Insert(0, percurso); } percurso = null; } }
private Percurso PercursoAleatorio() { var fatorial = MathNet.Numerics.SpecialFunctions.Factorial(Help.cidades.Count - 1); var cidades = new sbyte[Help.cidades.Count - 1]; var aux = 1; for (int i = 0; i < cidades.Length; i++) { cidades[i] = (sbyte)aux; aux++; } var random = -1; do { random = new Random().Next(1, int.Parse(fatorial.ToString())); } while (NumerosUtilizadosGenetico.IndexOf(random) >= 0); NumerosUtilizadosGenetico.Add(random); var varAuxilio = 0; var percurso = new Percurso(Help.cidades.Count + 1); var comb = new sbyte[cidades.Length]; var disponiveis = cidades; var repanterior = int.Parse(fatorial.ToString()); //niveis for (int j = 0; j < cidades.Length; j++) { decimal rep = repanterior / (cidades.Length - j); var modPosicao = random % repanterior; if (modPosicao == 0) { modPosicao = random; while (modPosicao > repanterior) { modPosicao -= int.Parse(repanterior.ToString()); } } repanterior = int.Parse(rep.ToString()); if ((rep == 1) && (j == (cidades.Length - 2))) { modPosicao = varAuxilio; varAuxilio++; if (varAuxilio > 1) { varAuxilio = 0; } comb[j] = disponiveis[modPosicao]; } else { if (TotalDisponivel(ref disponiveis) == 1) { comb[j] = disponiveis[0]; } else { comb[j] = disponiveis[decimal.ToInt16(Math.Ceiling(modPosicao / rep)) - 1]; } } AtualizaDisponiveis(ref disponiveis, comb[j]); } percurso.AdicionaRotasArr(comb); percurso.InsereRotaArr(0); percurso.AdicionaRotasArr(0); return(percurso); }