using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Windows.Forms; namespace zonizzazione { public class TSP : IDisposable { public double[,] d; // n x n public int n; // numero dei nodi public int[] sol; // DIM: UNO PIU' DEI NODI, per chiudere il tour StreamWriter flog; public double NearNeigh(bool demo) { int i,j,jmin; double dmin,z; bool[] visitata=new bool[sol.Length]; for(i=0;i=ind1;lk--) { solnew[k]=sol[lk]; k++; } for(int lk=ind3-1;lk>=ind2;lk--) { solnew[k]=sol[lk]; k++; } for(k=ind3;k=ind3;lk--) // n ... ind3 (reversed) { solnew[nk]=sol[lk]; nk++; } for(int lk=ind2;lk=0;lk--) // 0 ... ind1-1 { solnew[nk]=sol[lk]; nk++; } znew = valutaSol(solnew,sol,nsol); if(znew != cost2) Trace.WriteLine("3opt (1b): qualcosa tragia"); zold=znew; goto labStart; } #endregion // ------------------------------- secondo riattacco: 1a-3a, 2b-1b, 2a-3b #region secondo riattacco labSecondo: if(end1b == end2a) goto labTerzo; if(end3b == end1a) goto labTerzo; if(end2b == end3a) goto labTerzo; cost1 = zorario[nsol-1]; cost2 = zorario[ind1-1] +d[end1a,end3a]+ (zantior[ind2]-zantior[ind3-1])+d[end2b,end1b]+ (zorario[ind2-1]-zorario[ind1])+d[end2a,end3b]+ (zorario[nsol-1]-zorario[ind3]); if (cost2 < cost1) { // Qui ho migliorato for(k=0;k=ind2;lk--) { solnew[nk]=sol[lk]; nk++; } for(int lk=ind1;lk<=ind2-1;lk++) { solnew[nk]=sol[lk]; nk++; } for(k=ind3;k= ind3; lk--) // n ... ind3 (reversed) { solnew[nk] = sol[lk]; nk++; } for (int lk = ind2-1; lk >= ind1; lk--) // ind1 ... ind2-1 (reversed) { solnew[nk] = sol[lk]; nk++; } for (int lk = ind2; lk < ind3; lk++) // ind2 ... ind3-1 { solnew[nk] = sol[lk]; nk++; } for (int lk = ind1 - 1; lk >= 0; lk--) // 0 ... ind1-1 (reversed) { solnew[nk] = sol[lk]; nk++; } znew = valutaSol(solnew,sol,nsol); if (znew != cost2) Trace.WriteLine("3opt (2b): qualcosa tragia"); zold = znew; goto labStart; } #endregion // ---------------------------------- terzo riattacco: 1a-2b, 3a-2a, 1b-3b #region terzo riattacco labTerzo: if(end2b == end3a) goto labQuarto; if(end1a == end3b) goto labQuarto; if(end1b == end2a) goto labQuarto; cost1 = zorario[nsol-1]; cost2 = zorario[ind1-1] +d[end1a,end2b]+ (zorario[ind3-1]-zorario[ind2])+d[end3a,end2a]+ (zantior[ind1]-zantior[ind2-1])+d[end1b,end3b]+ (zorario[nsol-1]-zorario[ind3]); if (cost2 < cost1) { // Qui ho migliorato for (k = 0; k <= ind1-1; k++) solnew[k] = sol[k]; nk=ind1; for (int lk = ind2; lk <= ind3 - 1; lk++) { solnew[nk] = sol[lk]; nk++; } for (int lk = ind2 - 1; lk >= ind1; lk--) { solnew[nk] = sol[lk]; nk++; } for (k = ind3; k < nsol; k++) { solnew[nk] = sol[k]; nk++; } znew = valutaSol(solnew,sol,nsol); if (znew != cost2) Trace.WriteLine("3opt (3a): qualcosa tragia"); zold = znew; goto labStart; } // provo a riattaccare in senso antiorario cost1 = (cost1 < zantior[0] ? cost1 : zantior[0]); cost2 = zantior[ind3] + d[end3b, end1b] + (zorario[ind2 - 1] - zorario[ind1]) + d[end2a, end3a] + (zantior[ind2] - zantior[ind3 - 1]) + d[end2b, end1a] + (zantior[0] - zantior[ind1 - 1]); if (cost2 < cost1) { nk = 0; for (int lk = nsol - 1; lk >= ind3; lk--) // n ... ind3 (reversed) { solnew[nk] = sol[lk]; nk++; } for (int lk = ind1; lk < ind2; lk++) // ind1 ... ind2-1 { solnew[nk] = sol[lk]; nk++; } for (int lk = ind3-1; lk >= ind2; lk--) // ind3-1 ... ind2 (reversed) { solnew[nk] = sol[lk]; nk++; } for (int lk = ind1 - 1; lk >= 0; lk--) // 0 ... ind1-1 (reversed) { solnew[nk] = sol[lk]; nk++; } znew = valutaSol(solnew,sol,nsol); if (znew != cost2) Trace.WriteLine("3opt (3b): qualcosa tragia"); zold = znew; goto labStart; } #endregion // ------------------------------- quarto riattacco: 1a-2b, 3a-1b, 2a-3b #region quarto riattacco labQuarto: if(end1a == end3b) continue; if(end1b == end2a) continue; if(end2b == end3a) continue; cost1 = zorario[nsol-1]; cost2 = zorario[ind1-1] +d[end1a,end2b]+ (zorario[ind3-1]-zorario[ind2])+d[end3a,end1b]+ (zorario[ind2-1]-zorario[ind1])+d[end2a,end3b]+ (zorario[nsol-1]-zorario[ind3]); if (cost2 < cost1) { // Qui ho migliorato for (k = 0; k <= ind1-1; k++) solnew[k] = sol[k]; nk=ind1; for (int lk = ind2; lk <= ind3 - 1; lk++) { solnew[nk] = sol[lk]; nk++; } for (int lk = ind1; lk <= ind2-1; lk++) { solnew[nk] = sol[lk]; nk++; } for (k = ind3; k < nsol; k++) { solnew[nk] = sol[k]; nk++; } znew = valutaSol(solnew,sol,nsol); if (znew != cost2) Trace.WriteLine("3opt (4a): qualcosa tragia"); zold = znew; goto labStart; } // provo a riattaccare in senso antiorario cost1 = (cost1 < zantior[0] ? cost1 : zantior[0]); cost2 = zantior[ind3] + d[end3b, end2a] + (zantior[ind1] - zantior[ind2-1]) + d[end1b, end3a] + (zantior[ind2] - zantior[ind3-1]) + d[end2b, end1a] + (zantior[0] - zantior[ind1 - 1]); if (cost2 < cost1) { nk = 0; for (int lk = nsol - 1; lk >= ind3; lk--) // n ... ind3 (reversed) { solnew[nk] = sol[lk]; nk++; } for (int lk = ind2-1; lk >= ind1; lk--) // ind1 ... ind2-1 (reversed) { solnew[nk] = sol[lk]; nk++; } for (int lk = ind3-1; lk >= ind2; lk--) // ind2 ... ind3-1 (reversed) { solnew[nk] = sol[lk]; nk++; } for (int lk = ind1 - 1; lk >= 0; lk--) // 0 ... ind1-1 (reversed) { solnew[nk] = sol[lk]; nk++; } znew = valutaSol(solnew,sol,nsol); if (znew != cost2) Trace.WriteLine("3opt (4b): qualcosa tragia"); zold = znew; goto labStart; } #endregion } // for l3 (inizio) } // for l2 (inizio) } // for l1 (inizio) // write(*,*) ' fine opt3: ldold',ldold if(zorg>znew) { //MessageBox.Show("Zorg = "+zorg+" znew = "+znew); zorg = znew; goto labStart; } z=0; sol[n-1]=sol[0]; for(i=0;i= zold) goto lab600; // Qui ho migliorato for(k=0;k<=ind1meno1;k++) solnew[k]=sol[k]; k=ind1meno1; for(int lk=ind2-1;lk>=ind1;lk--) { k=k+1; solnew[k]=sol[lk]; } for(int lk=ind3-1;lk>=ind2;lk--) { k=k+1; solnew[k]=sol[lk]; } for(k=ind3;k= zold) goto lab700; // Qui ho migliorato for(k=0;k<=ind1meno1;k++) solnew[k]=sol[k]; k=ind1meno1; for(int lk=ind3-1;lk>=ind2;lk--) { k=k+1; solnew[k]=sol[lk]; } for(int lk=ind1;lk<=ind2-1;lk++) { k=k+1; solnew[k]=sol[lk]; } for(k=ind3;k= zold) goto lab800; // Qui ho migliorato for(k=0;k<=ind1meno1;k++) solnew[k]=sol[k]; k=ind1meno1; for(int lk=ind2;lk<=ind3-1;lk++) { k=k+1; solnew[k]=sol[lk]; } for(int lk=ind2-1;lk>=ind1;lk--) { k=k+1; solnew[k]=sol[lk]; } for(k=ind3;k= zold) continue; // Qui ho migliorato for(k=0;k<=ind1meno1;k++) solnew[k]=sol[k]; k=ind1meno1; for(int lk=ind2;lk<=ind3-1;lk++) { k=k+1; solnew[k]=sol[lk]; } for(int lk=ind1;lk<=ind2-1;lk++) { k=k+1; solnew[k]=sol[lk]; } for(k=ind3;kznew) { //MessageBox.Show("Zorg = "+zorg+" znew = "+znew); zorg = znew; goto lab900; } z=0; sol[n-1]=sol[0]; for(i=0;i=ind2;lk--) // n ... ind2 (reversed) { solnew[nsol -lk -1]=sol[lk]; nk++; } for(int lk=ind1;lk=0;lk--) // 0 ... ind1-1 (reversed) { solnew[nsol -lk -1]=sol[lk]; nk++; } znew = 0; for(i=0;i=ind1;lk--) // ind1 ... ind2-1 (reversed) { nk++; solnew[nk]=sol[lk]; } for(nk=ind2;nk=ind2;lk--) // n ... ind2 (reversed) { solnew[nsol -lk -1]=sol[lk]; nk++; } for(int lk=ind1;lk=0;lk--) // 0 ... ind1-1 (reversed) { solnew[nsol -lk -1]=sol[lk]; nk++; } znew = 0; for(i=0;i