Example #1
0
        public TabuSolution(TabuSolution ts, Node a, int routeIndex)
        {
            rutas = new List <List <Node> >();
            foreach (List <Node> lst in ts.rutas)
            {
                rutas.Add(new List <Node>());
                foreach (Node n in lst)
                {
                    rutas[rutas.Count - 1].Add(n);
                }
            }

            depot     = ts.depot;
            fitness   = ts.fitness;
            capacidad = ts.capacidad;
            feasible  = ts.feasible;

            int indexRouteNode = GetIdRuta(a);

            rutas[indexRouteNode].Remove(a);
            rutas[routeIndex].Add(a);

            ReordenarNodosRutasMinimizandoCapacidad();
            ReordenarNodosRutasMinimizandoDistancia();
        }
Example #2
0
        public Solution RunTS(int maxNumIterations)
        {
            List <double> lstMinFitness     = new List <double>();
            int           maxLengthTabuList = 10;
            int           numRutas          = Filecvrp.NumRutas;
            List <Node>   lstNodes          = Filecvrp.LstNodes;
            Node          depot             = Filecvrp.LstNodes.Where(e => e.Id == Filecvrp.IdNodeDepot).First();
            TabuSolution  ts = new TabuSolution(numRutas, lstNodes, depot, Filecvrp.Capacity);

            ts.CalculateFitness();
            TabuSolution tsBestSolution = ts;
            List <Node>  tabuList       = new List <Node>();
            Random       r = new Random();

            for (int i = 0; i < maxNumIterations; i++)
            {
                TabuSolution mejorsolucioncandidata        = null;
                double       fitnessmejorsolucioncandidata = double.MaxValue;
                Node         selectedNode = null;
                foreach (Node n in lstNodes)
                {
                    if (n.Id != depot.Id && !tabuList.Contains(n))
                    {
                        int          routeIndex   = r.Next(0, numRutas);
                        TabuSolution solcandidata = new TabuSolution(ts, n, routeIndex);
                        solcandidata.CalculateFitness();
                        if (solcandidata.Feasible && solcandidata.Fitness < fitnessmejorsolucioncandidata)
                        {
                            fitnessmejorsolucioncandidata = solcandidata.Fitness;
                            mejorsolucioncandidata        = solcandidata;
                            selectedNode = n;
                        }
                    }
                }

                ts = mejorsolucioncandidata;


                if (ts.Fitness < tsBestSolution.Fitness)
                {
                    tsBestSolution = ts;
                }
                lstMinFitness.Add(tsBestSolution.Fitness);

                tabuList.Add(selectedNode);
                if (tabuList.Count > maxLengthTabuList)
                {
                    tabuList.RemoveAt(0);
                }
            }

            Solution s = new Solution();

            s.LstMinFitness    = lstMinFitness;
            s.BestRutas        = tsBestSolution.Rutas;
            s.FitnessBestRutas = tsBestSolution.Fitness;
            return(s);
        }