资源

旅行推销员问题(milpsl4)

/*****************************************************************//*                                                               *//*S A S A M P L E L I B R A R Y公司*//*                                                               *//*名称:milpsl4*//*标题:旅行推销员问题(milpsl4)*//*产品:或*//*系统:所有*//*关键字:或*//*进程:OPTMODEL,GPLOT*//*数据:*//*                                                               *//*支持:更新:*//*参考:*//*MISC:混合整数线性规划示例4*//*数学规划的求解章节*//*                                                               *//*****************************************************************//*%设tsplib=st70问题的位置*//*将TSPLIB实例转换为数据集*/数据tspData(下降=H);填充“&tsplib”;输入H$1.@;如果H不在('N','T','C','D','E')中;输入@1 var1-var3;运行;/*使用MTZ公式的直接解决方案*/过程操作模型;设置垂直;在VERTICES中设置EDGES={i,在VERTICE中设置j:i ne j};num xc{顶点};num yc{顶点};/*读取实例和客户坐标(xc,yc)*/将数据tspData读入VERTICES=[_n_]xc=var2 yc=var3;/*代价是四舍五入到最近整数的欧氏距离*/EDGES}中的数字c{<i,j>初始楼层(sqrt(((xc[i]-xc[j])**2+(yc[i]-cc[j]**2))+0.5);var x{EDGES}二进制;varu{i.in2..card(VERTICES)}>=2<=card(VERTICE);/*每个顶点正好有一个内边缘和一个外边缘*/VERTICES}中的conassign_i{i:顶点中的和{j:inej}x[i,j]=1;VERTICES}中的conassign_j{j:顶点中的sum{i:i ne j}x〔i,j〕=1;/*使总成本最小化*/最小对象=EDGES}中的和{<i,j>(如果i>j,则c[i,j]其他c[j,i])*x[i,j];/*无次级课程*/EDGES中的conmtz{<i,j>:(i ne 1)和(j ne 1)}:u[i]-u[j]+1<=(卡(顶点)-1)*(1-x[i,j]);以milp/maxtime=600进行求解;退出;/*使用子图公式迭代求解*/过程操作模型;设置VERTICES;在VERTICES中设置EDGES={i,在VERTICE中设置j:i>j};num xc{顶点};num yc{顶点};num numsubtour初始化0;设置SUBTOUR{1..numsubtour};/*读取实例和客户坐标(xc,yc)*/将数据tspData读入VERTICES=[var1]xc=var2 yc=var3;/*代价是四舍五入到最近整数的欧氏距离*/EDGES}中的数字c{<i,j>初始楼层(sqrt(((xc[i]-xc[j])**2+(yc[i]-cc[j]**2))+0.5);var x{EDGES}二进制;/*使总成本最小化*/最小对象=EDGES中的sum{<i,j>}c[i,j]*x[i,j];/*每个顶点正好有一个内边缘和一个外边缘*/VERTICES}中的con two_match{i:顶点中的和{j:i>j}x[i,j]+顶点中的和{j:i<j}x[j,i]=2;/*无子任务(这些约束是动态生成的)*/con subtour_lim{s in 1..numsubtour}:EDGES中的总和{<i,j>:(i在SUBTOUR[s]中,j不在SUBTUR[s])或(i不在SUBTOUR[s]中,j在SUBTUR[s])}x[i,j]>=2;/*这将启动算法来查找违反的子任务*/设置EDGES1;设置INITVERTICES=EDGES1}i中的{i,j>集;设置VERTICES1;设置NEIGHBORS;设置<num,num>CLOSURE;num组件{INITVERTICES};num numcomp初始化2;编号iter init 1;num个数字初始化1;设置ITERS=1..numiters;num sol{ITERS,EDGES};/*仅匹配约束的初始求解*/解决;调用信号(compress('obj'put(iter,best.)),修剪(左侧(放置(圆形(obj),最佳));对于EDGES}sol[iter,i,j]=圆(x[i,j])中的{i,j>;/*在解决方案断开连接时,继续*/do while(numcomp>1);iter=iter+1;/*求支持图的连通分量*/EDGES1={<i,j>在EDGES中:圆形(x[i,j].sol)=1};EDGES1=EDGES1并集{EDGES1}中的{i,j>集;VERTICES1=初始证书;闭合=边缘1;INITVERTICES}组件[i]=0中的{i;对于VERTICES1}中的{i do;邻域=切片(<i,*>,闭合);CLOSURE=闭合联合(NEIGHBORS交叉NEIGHBOR);结束;numcomp=0;进行while(卡片(VERTICES1)>0);numcomp=numcomp+1;对于VERTICES1}中的{i do;邻域=切片(<i,*>,闭合);对于邻域}组件[j]=numcomp中的{j;VERTICES1=VERTICES差异邻域;离开;结束;结束;如果numcomp=1,则离开;数字=iter;numsubtour=numsubtour+numcomp;对于1..numcomp}do中的{comp;分包[numsubtour-numcomp+comp]={i在VERTICES:component[i]=comp}中;结束;解决;调用信号(compress('obj'put(iter,best.)),修剪(左侧(放置(圆形(obj),最佳));对于EDGES}sol[iter,i,j]=圆(x[i,j])中的{i,j>;结束;/*创建供gplot使用的数据集*/从创建数据solData[iter ij]={它在ITERS中,<i,j>在EDGES:sol[it,i,j]=1}xi=xc[i]yi=yc[i]xj=xc[j]yj=yc[j];呼叫信号('numiters',put(numiters,best.));退出;%宏plotTSP;%annomac;%i=1%到&numiters;/*创建注释数据集以绘制子主题*/数据anno(drop=iter xi yi xj yj);%系统(2,2,2);设置solData(keep=iter xi yi xj yj);其中iter=&i;%线(xi,yi,xj,yj,*,1,1);运行;title1 h=2“TSP:Iter=&i,Objective=&obj&i”;标题2;proc gplot data=tspData anno=anno;轴1标签=无;symbol1值=点interpol=无pointlabel=(“#var1”nodropcollisions height=1)cv=黑色;plot var3*var2/haxis=axis1 vaxis=axis1;运行;退出;%结束;%修复plotTSP;%plotTSP;