资源

肾脏捐赠者交换(dcmpe10)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*名称:dcmpe10*//*标题:肾脏捐赠者交换(dcmpe10)*//*产品:或*//*系统:所有*//*关键字:或*//*PROCS:OPTMODEL、OPTNET*//*数据:*//*                                                             *//*支持:更新:*//*参考:*//*MISC:分解算法中的示例10*//*数学规划章节*//*                                                             *//***************************************************************//*用弧概率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,则使用节点[i,m]=1,否则为0*/var UseNode{节点,匹配}二进制;/*如果弧(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 node_packing{i在NODES}中:sum{m in MATCHENGS}UseNode[i,m]+Slack[i]=1;/*每个捐赠者最多一个受赠人*/con-onvent{i in NODES,m in MATCHINGS}(节点中的i,匹配中的m):ARCS}中的和{<(i),j>UseArc[i,j,m]=使用节点[i,m];/*每个受赠人最多一个捐赠人*/con在节点中接收{j,在匹配}中接收m:ARCS}UseArc[i,j,m]=UseNode[j,m]中的和{i,(j)>;/*排除长匹配*/MATCHINGS}中的con基数{m:ARCS}UseArc[i,j,m]中的和{<i,j><=&max_length;/*通过匹配分解(聚合配方)*/对于节点中的{i,匹配中的m,捐赠[i,m].block=m;对于节点中的{j,匹配中的m接收[j,m].block=m;对于匹配}基数[m].block=m中的{m;用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标签;按周期;运行;