Example #1
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);
        }