// --------------------------------------------------------- 3OPT // Precondizione: sol ha n+1 elementi, l'ultimo e' uguale al primo public int Loc3optSIMM(int[] sol, int zold, int[,] d) { int[] solnew = new int[sol.Length], soltemp = new int[sol.Length]; int[] zorario = new int[sol.Length]; // costi incrementali tour in senso orario int[] zantior = new int[sol.Length]; // costi incrementali tour in senso antiorario int end1a,end2a,end3a,end1b,end2b,end3b; int znew=int.MaxValue, l_old, zorg, z2opt, zprev; int i,j,k,n,n1,n2,z,ind1; int nsol = n = sol.Length; // con l'ultimo uguale al primo if(nsol <= 5) return(-1); n2=nsol-2; n1=nsol-1; // Inizio di una nuova ricerca zorg = zold; lab900: zold = 0; zorario[0] = 0; zantior[nsol-1] = 0; for(int js=0;js= 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