コード例 #1
0
ファイル: ILS.cs プロジェクト: juliofgx17/Metaheuristicas-UNI
        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);
        }
コード例 #2
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));
        }
コード例 #3
0
 public Greedy(QAP qap)
 {
     tamProblema = qap.GetTamProblema();
     localizacionesEnUnidades.AddRange(qap.GetLocalizacionesEnUnidades());
     flujosUnidades.AddRange(qap.GetFlujosUnidades());
     distanciasLocalizaciones.AddRange(qap.GetDistanciasLocalizaciones());
 }
コード例 #4
0
        public ES(QAP qap)
        {
            tamProblema = qap.GetTamProblema();

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

            ResolverES();
        }
コード例 #5
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));
        }
コード例 #6
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);
                    }
                }
            }
        }