Example #1
0
        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);
        }
Example #2
0
 public Greedy(QAP qap)
 {
     tamProblema = qap.GetTamProblema();
     localizacionesEnUnidades.AddRange(qap.GetLocalizacionesEnUnidades());
     flujosUnidades.AddRange(qap.GetFlujosUnidades());
     distanciasLocalizaciones.AddRange(qap.GetDistanciasLocalizaciones());
 }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        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();
        }
Example #6
0
        private void OptimizacionBL()
        {
            QAP           qap = new QAP(tamProblema, localizacionesEnUnidades, flujosUnidades, distanciasLocalizaciones);
            BusquedaLocal bl  = new BusquedaLocal(qap);

            solucion = bl.ResolverBL();
        }
Example #7
0
        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));
        }
Example #8
0
        public ES(QAP qap)
        {
            tamProblema = qap.GetTamProblema();

            localizacionesEnUnidades.AddRange(qap.GetLocalizacionesEnUnidades());
            flujosUnidades.AddRange(qap.GetFlujosUnidades());
            distanciasLocalizaciones.AddRange(qap.GetDistanciasLocalizaciones());
            coste = qap.GetCoste();

            ResolverES();
        }
Example #9
0
        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();
                 *
                 * }*/
            }
        }
Example #10
0
        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();
        }
Example #11
0
        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++;
            }
        }
Example #12
0
        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;
                }
            }
        }
Example #13
0
        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;
        }
Example #14
0
        public QAP GetQAP()
        {
            QAP qap = new QAP(tamProblema, localizacionesEnUnidades, flujosUnidades, distanciasLocalizaciones);

            return(qap);
        }
Example #15
0
        public ILS(string ruta)
        {
            bestSolution = new QAP(ruta);

            EjecutarILS();
        }
Example #16
0
        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);
                    }
                }
            }
        }
Example #17
0
        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));
        }
Example #18
0
        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();
        }