资源

旅行推销员问题示例(omode06)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*姓名:omode06*//*标题:旅行推销员问题示例(omode06)*//*产品:或*//*系统:全部*//*关键字:或*//*程序:OPTMODEL*//*数据:*//*                                                             *//*支持:更新:*//*参考:*//*MISC:的OPTMODEL章节中的示例6*//*数学编程*//*                                                             *//***************************************************************//*%设tsplib=st70问题的位置*//*将TSPLIB实例转换为数据集*/数据tspData(下降=H);填充“&tsplib”;输入H$1.@;如果H不在('N','T','C','D','E')中;输入@1 var1-var3;运行;%宏plotTSP;/*创建注释数据集以绘制子主题*/数据anno;保留drawspace“datavalue”linethickness 1函数“line”;设置solData;运行;title1 h=2“TSP:Iter=&i,Objective=&obj&i”;标题2;proc sgplot data=tspData sganno=anno;散布x=var2 y=var3/数据标签=var1;xaxis显示=无;yaxis显示=无;运行;%修复plotTSP;/*使用子图公式迭代求解*/过程操作模型;设置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}c[i,j]*x[i,j]中的和{i,j>;/*每个顶点正好有一条进边和一条出边*/con two_match{i in VERTICES}(垂直):顶点中的和{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;在EDGES1}{i,j}中设置VERTICES1=并集{i,j>;num组件{VERTICES1};num numcomp初始化2;编号iter init 1;调用信号('i',trim(左)(put(round(iter),best.));num个数字初始化1;/*仅匹配约束的初始求解*/解决;调用信号(compress('obj'put(iter,best.)),修剪(左侧(放置(圆形(obj),最佳));/*创建供PROC SGPLOT使用的数据集*/从创建数据solDataEDGES:x[i,j].sol>0.5}中的[ij]={x1=xc[i]y1=yc[i]x2=xc[j]y2=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)节点=(包括=VERTICES1)混合物out=(concomp=组件);numcomp=_oroptmodel_num_[“num_COMPONENTS”];如果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 SGPLOT使用的数据集*/从创建数据solDataEDGES:x[i,j].sol>0.5}中的[ij]={x1=xc[i]y1=yc[i]x2=xc[j]y2=yc[j];呼叫信号('numiters',put(numiters,best.));提交;%plotTSP;endsubmit;结束;退出;