bool std3opt() { //do // { ret = false; float best = float.MaxValue; cTSP_LIST_NODE b1 = null, b2 = null, b3 = null; l1 = list_tour.First; l1b = l1.Prev.Prev; //n-1 for (; !l1.Equals(l1b); l1 = l1.Next) { t.a = l1.Value; t.b = l1.Next.Value; l2b = list_tour.First.Prev; //n-1 l3b = list_tour.First; for (l2 = l1.Next; !l2.Equals(l2b); l2 = l2.Next) { t.c = l2.Value; t.d = l2.Next.Value; if (t.d == t.a) { break; } for (l3 = l2.Next; !l3.Equals(l3b); l3 = l3.Next) { t.e = l3.Value; t.f = l3.Next.Value; if ((t.swap = Best3optSwap2(/*min+tsp.distance[t.e,t.f]*/)) > 0.0) { if (best > gain) { best = gain; best_swap = t; b1 = l1; b2 = l2; b3 = l3; } } } //for } //for } //for if (best < EPSILON) { ret = true; swapcase2(best_swap, b1, b2, b3); } //} while (ret); return(ret); } //std3opt
bool std3optCandidateSet() { ret = false; l1 = list_tour.First; l1b = l1.Prev; for (; !l1.Equals(l1b); l1 = l1.Next) { t.a = l1.Value; t.b = l1.Next.Value; l2b = l1b.Prev.Prev; for (i = 0; i < nn; i++) { l2 = list_tour.Find(tsp.GetNN_Node(l1.Value, i)); if (l2 == null) { throw new NotSupportedException("nodo non trovato"); } if (l2.Equals(l1)) { continue; } if ((l2.Equals(l1.Next)) || (l2.Next.Equals(l1))) { continue; } t.c = l2.Value; t.d = l2.Next.Value; //da mettere come opzione!!! //Fast if ((fast) && (tsp.distance[t.a, t.b] <= tsp.distance[t.b, t.c])) { continue; } l3 = l2.Next.Next; min = tsp.distance[t.a, t.b] + tsp.distance[t.c, t.d]; for (; !l3.Equals(l1); l3 = l3.Next) { if ((l3.Equals(l1.Next)) || (l3.Equals(l2)) || (l3.Equals(l2.Next)) || (l3.Next.Equals(l2))) { continue; } t.e = l3.Value; t.f = l3.Next.Value; if ((t.swap = Best3optSwap()) > 0) { ret = true; swapcase1(); if ((t.swap != 5) && (i != 9)) { i = 0; } min = tsp.distance[t.a, t.b] + tsp.distance[t.c, t.d]; } } //for } //for } //for return(ret); }