资源

肾脏捐赠者交换(dcmpe11)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*名称:dcmpe11*//*标题:肾脏捐赠者交换(dcmpe11)*//*产品:或*//*系统:所有*//*关键字:或*//*过程:OPTMODEL,OPTNET*//*数据:*//*                                                             *//*支持:更新:*//*参考:*//*MISC:分解算法示例11*//*数学规划章节*//*                                                             *//***************************************************************//*用弧概率p在n个节点上创建随机图和均匀(0,1)重量*/%设n=100;%设p=0.02;数据ArcData;i=0到&n-1;做j=0到&n-1;如果i等于j,则继续;否则,如果拉努尼(1)<&p则会;重量=拉努尼(2);产出;结束;结束;结束;运行;%设max_length=10;过程操作模型;设置<num,num>ARCS;num权重{ARCS};将数据ArcData读入ARCS=[ij]权重;印刷重量;在ARCS}{i,j}中设置NODES=union{i,j>;设置MATCHINGS=1..card(NODES)/2;/*如果节点i用于匹配m,则UseNode[i,m]=1,否则为0*/var UseNode{NODES,MATCHINGS}二进制;/*如果弧(i,j)用于匹配m,则UseArc[i,j,m]=1,否则为0*/var UseArc{ARCS,MATCHINGS}二进制;/*最大化所用弧的总重量*/最大总重量=ARCS中的总和{<i,j>,MATCHINGS}中的m权重[i,j]*UseArc[i,j,m];/*每个节点最多出现一个匹配项*//*重写为集合分区(因此decomp使用相同的块)sum{}x<=1=>sum{{}x+s=1,s>=0,无相关成本*/var松弛{NODES}二进制;con封装{i在节点}中:MATCHINGS}UseNode[i,m]+Slack[i]=1中的和{m;/*每个捐赠者最多一个接受者*/con捐赠{i在节点中,m在匹配}中:ARCS}中的和{<(i),j>UseArc[i,j,m]=使用节点[i,m];/*每个接受者最多一个捐赠者*/con接收{节点中的j,匹配中的m}:ARCS}UseArc[i,j,m]=UseNode[j,m]中的和{i,(j)>;/*排除长匹配*/con基数{m in MATCHINGS}:ARCS}UseArc[i,j,m]中的和{<i,j><=&max_length;/*使用METHOD=SET自动分解*/用milp/presolver求解=基本反编译=(方法=集合);/*将解决方案保存到数据集*/从创建数据解决方案[mij]={m在MATCHINGS中,<i,j>在ARCS中:UseArc[i,j,m].sol>0.5}重量[i,j];退出;程序optnet方向=定向data_links=解决方案;数据链接变量从=i至=j;周期模式=所有周期out=循环;运行;proc print data=Cycles noobs标签;按周期;运行;