资源

进步党问题(第14条)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*名称:clpe14*//*标题:进步党问题(第14条)*//*产品:或*//*系统:所有*//*关键字:或*//*程序:CLP*//*数据:*//*                                                             *//*支持:更新:*//*参考:*//*MISC:CLP程序章节中的示例14*//*约束编程书*//*                                                             *//***************************************************************/数据容量;输入船载船员人数;数据线;1   6  22 8 2个3 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;%宏观ppp;proc-sql-noprint;选择count(*)到:numbeats from capacity;选择max(capacity)into:maxcap from capacity;%i=0%到&maxcap;从容量中选择count(*)到:numclass_&i,其中容量=&i;%结束;选择crewsize,spareCapacity到:crewsize_1-:crewsise_%扫描(&numbeats,1),按序列号从容量顺序进行:cap_1-:cap_%扫描(&numbeats,1);退出;proc clp out=out varselect=FIFO;/*假设first&numhosts船是主机*//*轮流处理每一轮*/%t=1%到&rounds;%do i=&numhosts+1%到&numbeats;/*船一为第t轮分配主机值*/var x&i.&t=[1,&numhosts];%结束;%do h=1%到&numhosts;var L_&h._&t=[0,&&cap_&h];/*主船载荷*/%结束;%结束;%do i=&numhosts+1%到&numbeats;/*每轮分配不同的主持人*/所有差异(x&i.1-x&i.&rounds);%结束;%t=1%到&rounds;%do i=&numhosts+1%到&numbers-1;/*船一为第t轮分配主机值*/%do j=&i+1%到&numbeats;变量m&i.&j.&t=[0,1];具体化m&i.&j.&t:(x&i.&t=x&j.&t);%结束;%结束;%结束;%do i=&numhosts+1%到&numbers-1;%do j=&i+1%到&numbeats;直线1>=0%t=1%到&rounds;+m&i.&j.&t%结束;;%结束;%结束;/*荣誉能力*/%t=1%到&rounds;包装((%do i=&numhosts+1%到&numbeats;x&i.&t%结束;) (%do i=&numhosts+1%到&numbeats;&&船员人数(&i)%结束;) (%做h=1%到&numhosts;左&右_左%结束;));%结束;/*打破对称*/%t=1%,四舍五入-1;lincon x_%扫描(&numbeats,1)_&t<x_%scan(&number,1)%eval(&t+1);%结束;运行;%修复ppp;%ppp;%宏观生产;proc转置数据=输出=xpose;运行;proc-sql;将表结果创建为从xpose中选择*,其中col1=0;创建表分配为从导出中选择*,其中name类似于“x%”;将表主机创建为从xpose中选择*,其中_name类似于“h%”扫描(_name_,4,'_')为空,col1=0;将表会议创建为从xpose中选择*,其中_name_类似于“m%”且col1=0按扫描顺序(名称,2,'_'),扫描(名称,4,'_`),扫描;创建表结果2(round num、host num、boatnum num);%t=1%到&rounds。;%做h=1%到&numhosts。;在结果中插入2个值(&t.、&h.和&h.);插入结果2选择&t.,&h.,输入(扫描(名称,2,'_'),2.)从指定col1=&h.和scan(_name,3,'_')=“&t.”;%结束;%结束;将表结果3创建为选择a.round、c.boatnum作为宿主、b.boatnu姆、b.cruwsize、c.capacity根据结果2,a.boatnum=b.seqno上的内部连接容量ba.host上的内部连接容量c=c.seqno;退出;%修复生殖;%生殖;%设numcols=6;数据结果4;set results3 end=lastobs;降colnum一号主机容量boatnum船员救世主;数组cs[&numcols.];数组bt[&numcols.];保留cs bt;保留colnum;保留前1个;保留主机0;dummy=LAG1(主机);如果LAG1(主机)为ne主机,则先执行;主机船=LAG1(主机);cap=LAG1(容量);savper=圆形;圆形=LAG1(圆形);如果首先是ne 1,则执行;产出;结束;round=学者;第一个=0;列数=1;i=1到&numcols。;cs[i]=。;bt[i]=。;结束;结束;否则;colnum=列+1;结束;bt[colnum]=船尾;cs[colnum]=创建;如果是第一个ne1和最后一个obs,则是;hostboat=主机;cap=容量;产出;结束;运行;过程排序数据=结果3;由圆形宿主;运行;数据结果5;设置结果3;保留完成segmt_no 0;如果LAG1(主机)ne主机,则执行;开始=0;饰面=容量;segmt_no=1;产出;光洁度=0;结束;开始=结束;完成=开始+船员人数;segmt_no=segmt_no+1;产出;运行;数据结果6;数组cs[&numcols.];数组bt[&numcols.];设置结果4;保持一轮起跑结束赛段无主船船队;i=1到&numcols;主机船=bt[i];boatnum=。;开始=0;finish=盖帽;segmt_no=1;起始=0;如果没有失踪(主机船),则执行;产出;结束;结束;i=1到&numcols;光洁度=0;主机船=bt[i];开始=0;segmt_no=2;做j=1到&numcols;饰面=饰面+cs[j];boatnum=bt[j];如果未失踪(主机船)和未失踪(船名),则执行;产出;segmt_no=segmt_no+1;结束;开始=完成;结束;结束;运行;过程排序数据=结果6;由segmtno轮船运送;运行;数据结果7;设置结果6(其中=(主机船=36或主机船=38或主机船=40或主机船=42);运行;过程排序数据=结果7;由segmtno轮船运送;运行;数据标签;输入_y _xvar$hlabel _xoffset _yoffset segmt_no _lvar$;数据线;.启动0.9 0.2 0.9 1船.起始0.9 0.2 0.9 2船.启动0.9 0.2 0.9 3船舱.启动0.9 0.2 0.9 4船.启动0.9 0.2 0.9 5船.启动0.9 0.2 0.9 6船;%设numcols=6;goptions vpos=40 htext=1.1;模式1 v=e c=红色;pattern2 v=e c=黑色r=&numcols。;title1 j=c h=3pct“第#轮BYVAL(轮)时间表”;选项nobyline;/*抑制署名*/proc gantt数据=结果5实验室数据=标签;按轮计算;label round=“圆形”;label host=“主机”;图表/活动=主机s_start=开始s_finish=完成模式=segmt_nolabvar=segmt_no nolegend nojobnum;id主机;运行;title1 j=c h=7pct“船#BYVAL(主机船)时间表”;选项nobyline;/*禁止署名*/goptions vsize=3.25英寸hsize=6.4英寸;goptions vpos=20 htext=1.2;proc格式;价值船. = "  ";运行;proc-gantt数据=结果7 labdata=标签;通过主机船;格式boatnum boatfmt。;label hostboat=“船”;label round=“圆形”;图表/活动=主机船s_start=开始s_finish=完成模式=segmt_nolabvar=segmt_no nolegend nojobnum;id圆形;运行;