///// <summary> ///// A naive selection method. ///// </summary> ///// <param name="problem"></param> ///// <param name="route"></param> ///// <param name="X"></param> ///// <param name="Y"></param> ///// <param name="x"></param> ///// <param name="y"></param> ///// <param name="exceptions"></param> ///// <returns></returns> //private int? SelectY( // IProblem problem, FixedSymmetricRoute route, EdgeSet X, EdgeSet Y, EdgeList x, EdgeList y, HashSet<int> exceptions) //{ // int from = x.Last.To; // // search an edge with weight smaller than g. // // VERY NAIVE METHOD! // List<int> test_list = new List<int>(); // float best_extra = float.MaxValue; // int? best_customer = null; // for (int other_customer = 0; other_customer < problem.Size; other_customer++) // { // if (other_customer != from && exceptions != null && !exceptions.Contains(other_customer)) // { // if (!x.Contains(from, other_customer) // && !route.Contains(from, other_customer)) // //&& !Y.Contains(from, other_customer)) // //&& !X.Contains(from, other_customer)) // { // float extra = problem.Weight(from, other_customer); // if (y.Weight + extra < x.Weight) // { // if (x.Count < 3) // { // best_customer = other_customer; // best_extra = extra; // break; // } // test_list.Add(other_customer); // if (extra < best_extra) // { // best_customer = other_customer; // best_extra = extra; // if (x.Count < 3) // { // break; // } // } // } // } // } // } // return best_customer; //} /// <summary> /// Selects with special priority. /// </summary> /// <param name="problem"></param> /// <param name="route"></param> /// <param name="X"></param> /// <param name="Y"></param> /// <param name="x"></param> /// <param name="y"></param> /// <param name="exceptions"></param> /// <returns></returns> private int? SelectY( IProblem problem, FixedSymmetricRoute route, EdgeSet X, EdgeSet Y, EdgeList x, EdgeList y, HashSet<int> exceptions) { int from = x.Last.To; // search an edge with weight smaller than g. //float best_priority = float.MinValue; int? best_customer = null; foreach (Edge edge in _sparse_set.GetFor(from)) { if (exceptions == null || !exceptions.Contains(edge.To)) { if (edge.From != edge.To && !x.Contains(edge) && !y.Contains(edge) && !route.Contains(edge.From, edge.To) //&& !Y.Contains(from, other_customer)) && !X.Contains(from, edge.To)) { double extra = edge.Weight; if (y.Weight + extra < x.Weight) { //if (x.Count < 2) //{ best_customer = edge.To; break; //} //// calculate priority. //int? x_other = this.SelectX(problem, route, X, Y, x, edge.To, null); //float priority = float.MinValue; //if (x_other != null) //{ // float x_other_weight = problem.Weight(edge.To, x_other.Value); // priority = x_other_weight - extra; //} //if (priority > best_priority) //{ // best_customer = edge.To; // best_priority = priority; //} } } } } return best_customer; }
private int? SelectX( IProblem problem, FixedSymmetricRoute route, EdgeSet X, EdgeSet Y, EdgeList x, int customer, HashSet<int> exceptions) { // select the only two edges that have the given customer in the given route. int[] neigbours = route.GetNeigbours(customer); int previous = neigbours[0]; int next = neigbours[1]; int? best_neighour = null; double best_weight = double.MinValue; if (previous > 0 && (exceptions == null || !exceptions.Contains(previous)) && !x.Contains(customer, previous)) //&& !X.Contains(customer, previous)) //&& !Y.Contains(customer, previous)) { //if (x.Count > 2) //{ double weight = problem.Weight(customer, previous); if (weight > best_weight) { best_neighour = previous; best_weight = weight; } //} //else //{ return previous; //} } if (next > 0 && (exceptions == null || !exceptions.Contains(next)) && !x.Contains(customer, next)) //&& !X.Contains(customer, previous)) //&& !Y.Contains(customer, previous)) { //if (x.Count > 2) //{ double weight = problem.Weight(customer, next); if (weight > best_weight) { best_neighour = next; best_weight = weight; } //} //else //{ return next; //} } return best_neighour; }