资源

进步党问题(oclpe09)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*姓名:oclpe09*//*标题:进步党问题(oclpe09)*//*产品:或*//*系统:全部*//*关键字:或*//*程序:OPTMODEL*//*数据:*//*                                                             *//*支持:更新:*//*参考:*//*MISC:CLP求解器章节中的示例9*//*数学编程书*//*                                                             *//***************************************************************/数据容量;输入船载船员人数;数据线;1   6  22   8  23  12  24  12  25  12  46  12  47  12  48  10  19  10  210  10  211  10  212  10  313   8  414   8  215   8  316  12  617   8  218   8  219   8  420   8  221   8  422   8  523   7  424   7  425   7  226   7  227   7  428   7  529   6  230   6  431   6  232   6  233   6  234   6  235   6  236   6  237   6  438   6  539   9  740   0  241   0  342   0  4;数据承载能力;设定容量;spareCapacity=容量-乘员人数;运行;数据主机-来宾;集合可操控性;如果(boatnum<=12或boatnum-eq 14),则执行;输出主机;结束;否则;输出客人;结束;运行;/*排序,让船员人数较多的客船最先出现*/proc-sort data=来宾;通过降低乘员人数;运行;数据容量;格式船舱容量2。;设置主人和客人;序列号=n_;运行;%让轮数=2;%设numhosts=13;过程操作模型;num numrounds=&rounds;设置ROUNDS=1..numrounds;num numhosts=&numhosts;设置HOSTS=1..numhosts;设置BOATS;num numbeats=卡(BOATS);num容量{BOATS};num乘务员{BOATS};num spareCapacity{hi in HOSTS}=容量[hi]-机组大小[hi];/*对客人使用降序顺序(seqno)而不是实际的船id(船号)以帮助PACK谓词的性能*/将数据容量读入BOATS=[seqno]容量crewsize;/*假设第一艘数字主机船是主机,并依次处理每一轮。X是为第t轮分配给非主机i的主机*/var X{numhosts+1..numbeats,ROUNDS}整数>=1<=numhosts;/*东道主船的载荷*/var L{hi in HOSTS,ROUNDS}integer>=0<=备用容量[hi];/*每轮分配不同的主持人*/con AlldiffCon{i in numhosts+1..numboats}:alldiff({t在ROUNDS}X[i,t]中);/*两名船员不能多次会面*/numhosts+1..numbeats-1中的var M{i,i+1..number中的j,ROUNDS}二进制中的t;con ReifyCon{i在numhosts+1..numbeats-1中,j在i+1..numboats中,t在ROUNDS}中:具体化(M[i,j,t],X[i,t]=X[j,t]]);con在numhosts+1..numboats-1中分配{i,在i+1..numbeats}中分配j:圆中的和{t}M[i,j,t]<=1;/*尊重能力*/con PackCon{t成圆形}:包装({i在numhosts中+1..numbeats}X[i,t],{i在numhosts+1..numbeats}中创建[i],{主机中的h}L[h,t]);/*打破对称*/con对称con{t in 1.numrounds-1}:X[numbeats,t]<X[number,t+1];用CLP/varselect=FIFO求解;从中创建数据{i在numhosts中+1..numboats,t在ROUNDS}<col('X_'||i||'_'|t)=X[i,t]>{h在HOSTS中,t在ROUNDS}<col('L_'|h||'_'|t)=L[h,t]>{i在numhosts+1..numbeats-1中,j在i+1..number中,t在ROUNDS}中<col('M_'||i||'_'|j||'_'|t)=M[i,j,t]>;退出;