private void EjecutarILS() { QAP qap = new QAP(bestSolution); BusquedaLocal bl = new BusquedaLocal(qap); qap = bl.ResolverBL(); QAP best = new QAP(qap); for (int i = 0; i < 24; i++) { Mutar(qap); bl = new BusquedaLocal(qap); qap = bl.ResolverBL(); if (qap.GetCoste() < best.GetCoste()) { best = new QAP(qap); } else { qap = new QAP(best); } } bestSolution = new QAP(best); }
public Greedy(QAP qap) { tamProblema = qap.GetTamProblema(); localizacionesEnUnidades.AddRange(qap.GetLocalizacionesEnUnidades()); flujosUnidades.AddRange(qap.GetFlujosUnidades()); distanciasLocalizaciones.AddRange(qap.GetDistanciasLocalizaciones()); }
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 void EjecutarILS() { QAP qap = new QAP(bestSolution); ES es = new ES(qap); qap = es.GetQAP(); QAP best = new QAP(qap); for (int i = 0; i < 24; i++) { Mutar(qap); es = new ES(qap); qap = es.GetQAP(); if (qap.GetCoste() < best.GetCoste()) { best = new QAP(qap); } else { qap = new QAP(best); } } bestSolution = new QAP(best); }
private void ReemplazamientoGeneracional() { poblacionH = poblacionI; QAP peorH = poblacionH[0]; int it = 0; for (int i = 0; i < poblacion.Count; i++) { if (poblacionH[i].GetCoste() > peorH.GetCoste()) { peorH = poblacionH[i]; it = i; } } poblacionH[it] = new QAP(mejorPob); poblacion.Clear(); poblacion.AddRange(poblacionH); poblacionH.Clear(); poblacionP.Clear(); }
private void OptimizacionBL() { QAP qap = new QAP(tamProblema, localizacionesEnUnidades, flujosUnidades, distanciasLocalizaciones); BusquedaLocal bl = new BusquedaLocal(qap); solucion = bl.ResolverBL(); }
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 ES(QAP qap) { tamProblema = qap.GetTamProblema(); localizacionesEnUnidades.AddRange(qap.GetLocalizacionesEnUnidades()); flujosUnidades.AddRange(qap.GetFlujosUnidades()); distanciasLocalizaciones.AddRange(qap.GetDistanciasLocalizaciones()); coste = qap.GetCoste(); ResolverES(); }
protected void Evolucionar() { mutados = 0; llamadasFuncionObjetivo = 0; for (int i = 0; i < numIteraciones && llamadasFuncionObjetivo < maxLlamadasFuncionObjetivo; i++) { QAP mejor = poblacion[0]; for (int j = 0; j < poblacion.Count; j++) { if (poblacion[j].GetCoste() < mejor.GetCoste()) { mejor = poblacion[j]; } } mejorPob = new QAP(mejor); if (estacionario) { SeleccionEstacionario(); CruceEstacionario(); MutacionEstacionario(); ReemplazamientoEstacionario(); } else { if (memetico && i % ciclosMeme == 0) { AplicarMemetico(); } SeleccionGeneracional(); CruceGeneracional(); MutacionGeneracional(); ReemplazamientoGeneracional(); } /*if (i % 100 == 0) * { * Console.WriteLine("Iteracion " + i); * Console.WriteLine("Mejor sol " + GetBestSolution().GetCoste()); * Console.WriteLine(); * * Console.WriteLine(); * * }*/ } }
static void Main(string[] args) { Stopwatch sw = new Stopwatch(); Console.WriteLine("Introduzca ruta del archivo."); string ruta = Console.ReadLine(); QAP qap = new QAP(ruta); sw.Start(); ES es = new ES(qap); sw.Stop(); Console.WriteLine("ES: " + es.GetQAP().GetCoste() + " - tiempo: " + sw.Elapsed); sw.Restart(); BMB bmb = new BMB(25, ruta); sw.Stop(); Console.WriteLine("BMB: " + bmb.GetQAP().GetCoste() + " - tiempo: " + sw.Elapsed); sw.Restart(); GRASP g = new GRASP(ruta); sw.Stop(); Console.WriteLine("GRASP: " + g.GetQAP().GetCoste() + " - tiempo: " + sw.Elapsed); sw.Restart(); ILS ils = new ILS(ruta); sw.Stop(); Console.WriteLine("ILS: " + ils.GetQAP().GetCoste() + " - tiempo: " + sw.Elapsed); sw.Restart(); ILS_ES ie = new ILS_ES(ruta); sw.Stop(); Console.WriteLine("ILS-ES: " + ie.GetQAP().GetCoste() + " - tiempo: " + sw.Elapsed); Console.WriteLine(); Console.WriteLine("Listo ;)"); Console.ReadKey(); }
private void Mutar(int i, int j, QAP qap) { { List <int> lista = qap.GetLocalizacionesEnUnidades(); int temp = lista[i]; int temp2 = lista[j]; lista[j] = temp; lista[i] = temp2; qap.CalcularCoste(); llamadasFuncionObjetivo++; mutados++; } }
private void AplicarMemetico() { int llam; if (mejorPorcentajeMeme) { List <QAP> copia = new List <QAP>(); copia.AddRange(poblacion); List <int> mejores = new List <int>(); QAP mejor = copia[0]; int indicemejor = 0; for (int i = 0; i < porcentajeMeme * numCromosomas; i++) { for (int j = 0; j < copia.Count; j++) { if (mejor.GetCoste() < copia[i].GetCoste()) { mejor = copia[i]; indicemejor = i; } } mejores.Add(indicemejor); copia.Remove(mejor); } for (int i = 0; i < mejores.Count; i++) { bl.SetQAP(poblacion[mejores[i]]); llam = llamadasFuncionObjetivo; poblacion[mejores[i]].SetQAP(bl.ResolverBL(ref llam)); llamadasFuncionObjetivo = llam; } } else { for (int i = 0; i < porcentajeMeme * numCromosomas; i++) { bl.SetQAP(poblacion[i]); llam = llamadasFuncionObjetivo; poblacion[i].SetQAP(bl.ResolverBL(ref llam)); llamadasFuncionObjetivo = llam; } } }
public BMB(int numMultiarranque, string ruta) { QAP qap = new QAP(ruta); BusquedaLocal bl = new BusquedaLocal(qap); QAP best = bl.ResolverBL(); for (int i = 1; i < numMultiarranque; i++) { qap = new QAP(ruta); bl = new BusquedaLocal(qap); qap = bl.ResolverBL(); if (qap.GetCoste() < best.GetCoste()) { best.SetQAP(qap); } } solucion = best; }
public QAP GetQAP() { QAP qap = new QAP(tamProblema, localizacionesEnUnidades, flujosUnidades, distanciasLocalizaciones); return(qap); }
public ILS(string ruta) { bestSolution = new QAP(ruta); EjecutarILS(); }
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); } } } }
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)); }
private void ReemplazamientoEstacionario() { poblacionH = poblacionI; int it1 = 0; int it2 = 0; for (int i = 0; i < poblacion.Count; i++) { if (poblacion[i].GetCoste() > poblacion[it1].GetCoste()) { it1 = i; } } if (it1 == 0) { it2 = 1; } for (int i = 0; i < poblacion.Count; i++) { if (poblacion[i].GetCoste() > poblacion[it2].GetCoste() && i != it1) { it2 = i; } } if (poblacionH[0].GetCoste() < poblacion[it1].GetCoste() && poblacionH[1].GetCoste() < poblacion[it2].GetCoste()) { poblacion[it1] = new QAP(poblacionH[0]); poblacion[it2] = new QAP(poblacionH[1]); } else if (poblacionH[1].GetCoste() < poblacion[it1].GetCoste() && poblacionH[0].GetCoste() < poblacion[it2].GetCoste()) { poblacion[it1] = new QAP(poblacionH[1]); poblacion[it2] = new QAP(poblacionH[0]); } else { if (poblacionH[0].GetCoste() < poblacion[it1].GetCoste()) { poblacion[it1] = new QAP(poblacionH[0]); } else if (poblacionH[0].GetCoste() < poblacion[it2].GetCoste()) { poblacion[it2] = new QAP(poblacionH[0]); } else if (poblacionH[1].GetCoste() < poblacion[it1].GetCoste()) { poblacion[it1] = new QAP(poblacionH[1]); } else if (poblacionH[1].GetCoste() < poblacion[it2].GetCoste()) { poblacion[it2] = new QAP(poblacionH[1]); } } poblacionI.Clear(); poblacionH.Clear(); poblacionP.Clear(); }