Beispiel #1
0
        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
Beispiel #2
0
        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);
        }