private void Mutar(QAP qap) { int tamSubcadena = qap.GetTamProblema() / 4; List <int> localizacionesEnUnidades = qap.GetLocalizacionesEnUnidades(); int inicio = rand.Next(0, qap.GetTamProblema() - tamSubcadena + 1); int fin = inicio + tamSubcadena; List <int> subcadena = new List <int>(); for (int i = inicio; i < fin; i++) { subcadena.Add(localizacionesEnUnidades[i]); } int index; while (subcadena.Count != 0) { index = rand.Next(0, subcadena.Count); localizacionesEnUnidades[inicio + subcadena.Count - 1] = subcadena[index]; subcadena.RemoveAt(index); } qap.SetLocalizacionesEnUnidades(localizacionesEnUnidades); }
private Tuple <QAP, QAP> CruzarPosicion(int pos1, int pos2) { QAP c1 = poblacionP[pos1]; QAP c2 = poblacionP[pos2]; List <int> genesc1 = c1.GetLocalizacionesEnUnidades(); List <int> genesc2 = c2.GetLocalizacionesEnUnidades(); List <int> genesComunes = new List <int>(); List <int> restos = new List <int>(); for (int i = 0; i < c1.GetTamProblema(); i++) { if (genesc1[i] == genesc2[i]) { genesComunes.Add(genesc1[i]); } else { genesComunes.Add(-1); restos.Add(genesc1[i]); } } List <int> nuevosgenesc1 = new List <int>(genesComunes); List <int> nuevosgenesc2 = new List <int>(genesComunes); Shuffle <int>(restos); for (int i = 0, j = 0; i < nuevosgenesc1.Count; i++) { if (nuevosgenesc1[i] == -1) { nuevosgenesc1[i] = restos[j]; j++; } } Shuffle <int>(restos); for (int i = 0, j = 0; i < nuevosgenesc2.Count; i++) { if (nuevosgenesc2[i] == -1) { nuevosgenesc2[i] = restos[j]; j++; } } llamadasFuncionObjetivo += 2; QAP uno = new QAP(c1.GetTamProblema(), nuevosgenesc1, c1.GetFlujosUnidades(), c1.GetDistanciasLocalizaciones()); QAP dos = new QAP(c2.GetTamProblema(), nuevosgenesc2, c2.GetFlujosUnidades(), c2.GetDistanciasLocalizaciones()); return(new Tuple <QAP, QAP>(uno, dos)); }
public Greedy(QAP qap) { tamProblema = qap.GetTamProblema(); localizacionesEnUnidades.AddRange(qap.GetLocalizacionesEnUnidades()); flujosUnidades.AddRange(qap.GetFlujosUnidades()); distanciasLocalizaciones.AddRange(qap.GetDistanciasLocalizaciones()); }
public ES(QAP qap) { tamProblema = qap.GetTamProblema(); localizacionesEnUnidades.AddRange(qap.GetLocalizacionesEnUnidades()); flujosUnidades.AddRange(qap.GetFlujosUnidades()); distanciasLocalizaciones.AddRange(qap.GetDistanciasLocalizaciones()); coste = qap.GetCoste(); ResolverES(); }
private Tuple <QAP, QAP> CruzarPMX(int pos1, int pos2) { QAP c1 = poblacionP[pos1]; QAP c2 = poblacionP[pos2]; List <int> genesc1 = c1.GetLocalizacionesEnUnidades(); List <int> genesc2 = c2.GetLocalizacionesEnUnidades(); int corteDcha = r.Next(1, genesc1.Count); int corteIzq = r.Next(0, corteDcha); List <int> genesH1 = new List <int>(); List <int> genesH2 = new List <int>(); List <int> cadenaCentralH1 = new List <int>(); List <int> cadenaCentralH2 = new List <int>(); for (int i = 0; i < genesc1.Count; i++) { if (i < corteIzq || i > corteDcha) { genesH1.Add(-1); genesH2.Add(-1); } else { genesH1.Add(genesc2[i]); genesH2.Add(genesc1[i]); cadenaCentralH1.Add(genesc2[i]); cadenaCentralH2.Add(genesc1[i]); } } for (int i = 0; i < genesc1.Count; i++) { if (i < corteIzq || i > corteDcha) { genesH1[i] = genesc1[i]; while (cadenaCentralH1.Contains(genesH1[i])) { genesH1[i] = (cadenaCentralH2[cadenaCentralH1.IndexOf(genesH1[i])]); } genesH2[i] = genesc2[i]; while (cadenaCentralH2.Contains(genesH2[i])) { genesH2[i] = (cadenaCentralH1[cadenaCentralH2.IndexOf(genesH2[i])]); } } } llamadasFuncionObjetivo += 2; QAP uno = new QAP(c1.GetTamProblema(), genesH1, c1.GetFlujosUnidades(), c1.GetDistanciasLocalizaciones()); QAP dos = new QAP(c2.GetTamProblema(), genesH2, c2.GetFlujosUnidades(), c2.GetDistanciasLocalizaciones()); return(new Tuple <QAP, QAP>(uno, dos)); }
public GRASP(string ruta) { for (int x = 0; x < 25; x++) { potencialDistanciaLocalizaciones.Clear(); potencialFlujoUnidades.Clear(); LCl.Clear(); LCu.Clear(); LRCl.Clear(); LRCu.Clear(); Costes.Clear(); S.Clear(); QAP qap = new QAP(ruta); tamProblema = qap.GetTamProblema(); flujosUnidades = qap.GetFlujosUnidades(); distanciasLocalizaciones = qap.GetDistanciasLocalizaciones(); ResolverPotenciales(potencialFlujoUnidades, potencialDistanciaLocalizaciones); for (int i = 0; i < tamProblema; i++) { LCu.Add(item: new Tuple <int, int>(i, potencialFlujoUnidades[i])); LCl.Add(item: new Tuple <int, int>(i, potencialDistanciaLocalizaciones[i])); } for (int i = 0; i < tamProblema; i++) { localizacionesEnUnidades.Add(-1); } Etapa1(); Etapa2(); localizacionesEnUnidades.Clear(); for (int i = 0; i < tamProblema; i++) { localizacionesEnUnidades.Add(-1); } foreach (Tuple <int, int> s in S) { localizacionesEnUnidades[s.Item1] = s.Item2; } bool error = false; if (localizacionesEnUnidades.Contains(-1)) { error = true; } OptimizacionBL(); if (x == 0) { bestSolution = new QAP(solucion); } else { if (bestSolution.CalcularCoste() > solucion.CalcularCoste()) { bestSolution.SetQAP(solucion); } } } }