进步党问题(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]>;退出;