// program anneal // // Copyright 2001 J. Makino #include "cpgplot.h" #include #include #include #include using namespace std; #define VLEN 2 #include "vector.h" #define TFACTR 0.9 inline double distance(mvector x[], int order[], int i1, int i2) { mvector x1 = x[order[i1]]; mvector x2 = x[order[i2]]; return sqrt((x1-x2)*(x1-x2)); } double reversal_cost(mvector x[], int order[], int ncity, int n[]) { double de; n[2]= (n[0]+ncity-1)%ncity; n[3]= (n[1]+1)%ncity; de = 0; de -= distance(x,order,n[0],n[2]); de -= distance(x,order,n[1],n[3]); de += distance(x,order,n[0],n[3]); de += distance(x,order,n[1],n[2]); return de; } void reverse(int order[], int ncity, int n[]) { int nn,j,k,l,itmp; nn=(1+((n[1]-n[0]+ncity) % ncity))/2; for (j=0;j= n[0]) n[1] += 1; nn=1+((n[0]-n[1]+ncity-1) % ncity); }while(nn<3); de=reversal_cost(x,order,ncity,n); ans=metropolis(de,t); if (ans) { ++nsucc; path += de; reverse(order,ncity,n); if (path < minpath){ minpath = path; show_path(x, order, ncity, path, t,-0.1, 1.1, -0.1, 1.1, 0); } } if (nsucc >= nlimit) break; } cerr << "T,path,move= " << t<< " " << path << " " << nsucc << endl; t *= TFACTR; if ((nsucc == 0) ) { return; } } } #define MAXVECTOR 10000 main() { mvector x[MAXVECTOR]; int order[MAXVECTOR],nnode,i; initgraph(); cerr << "Enter number of nodes:"; cin>>nnode; cerr << "Enter points\n"; for(i=0;i> x[i]; order[i]=i; } anneal(x,order,nnode); show_path(x, order, nnode, 0, 0,-0.1, 1.1, -0.1, 1.1, 0); cpgend(); for(i=0;i