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(); }
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); }