资源

旅行推销员问题(omod6)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*姓名:omod6*//*标题:旅行推销员问题(omod6)*//*产品:或*//*系统:全部*//*关键字:或*//*程序:OPTMODEL*//*数据:*//*                                                             *//*支持:更新:*//*参考:*//*MISC:的OPTMODEL章节中的示例6*//*数学编程*//*                                                             *//***************************************************************//*%设tsplib=st70问题的位置*//*将TSPLIB实例转换为数据集*/数据tspData(下降=H);填充“&tsplib”;输入H$1.@;如果H不在('N','T','C','D','E')中;输入@1 var1-var3;运行;%宏plotTSP;/*创建注释数据集以绘制子主题*/数据anno(drop=xi yi xj yj);%系统(2,2,2);设置solData(keep=xi yi xj yj);%线(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=黑色;绘图var3*var2/haxis=轴s1 vaxis=轴s1;运行;退出;%修复plotTSP;%annomac;/*使用子图公式迭代求解*/proc选择模型;设置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_elim{s在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;调用信号('i',trim(左)(put(round(iter),best.));num个数字初始化1;/*仅匹配约束的初始求解*/解决;调用symput(compress('obj'||put(iter,best.)),修剪(左侧(放置(圆形(obj),最佳));/*创建供PROC GPLOT使用的数据集*/从创建数据solDataEDGES:x[i,j].sol>0.5}中的[ij]={xi=xc[i]yi=yc[i]xj=xc[j]yj=yc[j];提交;%plotTSP;endsubmit;/*在解决方案断开连接时,继续*/do while(numcomp>1);iter=iter+1;调用信号('i',trim(左)(put(round(iter),best.));/*求支持图的连通分量*/EDGES1={<i,j>在EDGES中:圆形(x[i,j].sol)=1};EDGES1=EDGES1并集{EDGES1}中的{i,j>集;VERTICES1=初始证书;闭合=边缘1;对于{i in INITVERTICES}分量[i]=0;对于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),最佳));/*创建供PROC GPLOT使用的数据集*/创建数据solData来自EDGES:x[i,j].sol>0.5}中的[ij]={xi=xc[i]yi=yc[i]xj=xc[j]yj=yc[j];呼叫信号('numiters',put(numiters,best.));提交;%plotTSP;endsubmit;结束;退出;