资源

场景分配问题(clp6)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*名称:clp6*//*标题:场景分配问题(clp6)*//*产品:或*//*系统:所有*//*关键字:或*//*程序:CLP,GANTT*//*数据:*//*                                                             *//*支持:更新:*//*REF:OPL中的约束和整数编程*//*计算信息J 14(4)345-3722002*//*MISC:CLP程序章节中的示例6*//*约束编程书*//*                                                             *//***************************************************************/数据场景;输入数字参与者$DailyFee S_Var1 S_Var2 S_Var3 S_Var4S_Var5 S_Var6 S_Var7 S_Var8 S_Var9;数据线;图案26481 2 5 7 10 11 13 15 17。2卡斯塔25043 4 7 9 10 13 16 19。3斯科拉罗30310 3 6 9 10 14 16 17 18。4墨菲4085 2 8 12 13 15。5棕色7562 2 3 12 17。6哈科特9381 1 2 12 13 18。7安德森8770 5 6 14。8麦克杜格尔5788 3 5 6 9 10 12 15 16 189美世7423 3 4 5 8 9 16。10弹簧3303 5 6。11汤普森9593 6 9 12 15 18。;运行;proc打印数据=场景;运行;%宏观场景;/*如果演员i出现在场景j中,则Ai_Sj=1*//*否则Ai_Sj=0*//*初始化为0*/%i=1%到11;/*11名演员*/%do j=1%至19;/*19个场景*/%设A&i._S&j=0;%结束;%结束;数据场景_成本;场景设置;保留DailyFee A;保留每日费用A;do天=1到4;A='A'||left(strip(_N_))||'_'|| left(slip(day));产出;结束;call symput(“名称”||strip(_n_),演员);/*读取演员姓名*/呼叫信号(“成本”||strip(_n_),DailyFee);/*读取参与者成本*//*阅读演员是否出现在场景中*/%i=1%到9;/*数据集中的9个场景变量*/如果S_Var&i>0,则调用信号(“A”||strip(_n_)||“_S”||slip(S_Var&i),1);%结束;运行;/*创建定义目标函数的约束数据集*/proc转置数据=场景成本输出=成本(下降=名称);var DailyFee;身份证A;运行;数据成本;设置成本;_TYPE_=“最小值”;_右侧=。;运行;/*找到最小目标值*/proc clp condata=cost out=out varselect=maxc;/*设置目标值的上下限*//*下限:每个演员都会出现在某一天*//*上限:所有演员都会在这四天出现*/obj lb=137739 ub=550956;/*声明变量*/%do k=1%至4;/*4天*/%do j=1%至19;/*19个场景*/变量S&j._&k=[0,1];/*指示场景j是否在第k天拍摄*/%结束;%i=1%到11;/*11名演员*/变量A&i._&k=[0,1];/*指示参与者i在第k天是否存在*/%结束;%结束;/*每个场景只拍摄一次*/%do j=1%至19;海湾合作委员会(%do k=1%至4;S&j.__k(&k)%结束;)=( (1, 1, 1) );%结束;/*每天至少拍摄4个场景,最多拍摄5个场景*/%do k=1%至4;海湾合作委员会(%do j=1%至19;S&j.__k(&k)%结束;)=( (1, 4, 5) );%结束;/*一场戏的演员必须在拍摄当天在场*/%do k=1%至4;%do j=1%至19;%do i=1%至11;%如果(&&A&i._S&j>0)%,则%do;林肯S&j._&k<=A&i._&k;%结束;%结束;%结束;%结束;/*对称打断约束。在不失一般性的情况下,我们*//*可以假设场景1在第一天拍摄,场景2在第一天拍*//*或第2天,第1天、第2天或第3天拍摄场景3*/林肯S1_1=1,S1_2=0,S1_3=0,S1_4=0,S2_3=0,S2_4=0.,S3_4=0;/*如果场景2在第一天拍摄*//*然后可以在第1天或第2天拍摄场景3*/林肯S2_1+S_3<=1;运行;%放入&_ORCLP_;/*生成甘特图*/%甘特根;%修补场景;%宏观场景;proc转置数据=out out=dayout;运行;%do i=1%至4;%全球日。;proc-sql;创建餐桌日&作为选择子字符串(“”,长度(名称)-2)||substr(名称,2,索引(名称,'_')-2)从dayout where_name_ like‘S%_’||“&i.”and col1=1;退出;数据_全部_;设置日期&i.end=lastobs;格式字符串$32。;保留字符串“”;string=strip(string)||substr('',长度(strip(_TEMA001)))||(条带(_TEMA001));如果是lastobs,那么是;var='day'||strip(put(&i.,best.));调用信号(var,字符串);结束;运行;%结束;proc-sql;插入第1天的值(“”);退出;数据场景;rename _TEMA001=标签;设置第1天第2天第3天第4天;fmtname='scenes';开始=_n_;结束=_n_;运行;proc-sql;插入场景值(“”,“scenes”,21,21);退出;proc格式cntlin=场景;运行;proc格式;价值天数1=“第1天”6=“第2天”11=“第3天”16=“第4天”;价值场景1=“场景”6=“场景”11=“场景”16=“场景”;运行;%修补;%宏甘特根;%scenesbyday;数据gantt_actor;格式化演员$15。;格式化s_start s_finish场景。;出发;label actor='actor';keep _label _labele segmt_no actor s_start s_finish;%i=1%到11;/*11名演员*/segmt_no=1;%do k=1%至4;/*4天*/actor=“&&Name&i”;如果(A&i._&k ne 0),则执行;%设j=1;%设m=1;%让场景=%扫描(&&day&k.,&j.);%执行%while(&scene.ne);_label='';_labele=“W”;%如果(&&A&i._S&scene.>0)%,则%do;如果(S&scene._&k=1),则执行;_label=“W”;_labele='';结束;%结束;s_start=(&k.-1)*5+&m。;s_完成=s_开始+0.9;产出;segmt_no=segmt_no+1;%设m=%eval(&m.+1);%设j=%eval(&j.+1);%让场景=%扫描(&&day&k.,&j.);%结束;_label=“”;结束;%结束;%结束;运行;数据标签;格式标签变量$10。;_y=-1;_lvar=“_label”;_xvar=“s_start”;_hlabel=3;_yoffset=2.0;_xoffset=0.3;_flabel=“标记”;产出;_y=-1;_lvar=“_labele”;_flabel='markere';产出;运行;数据gant_scene;格式化标签$80。场景$2。;格式化s_start s_finish场景。;放样;label-scene=“场景”;keep _label segmt_no场景s_start s_finish持续时间;保持时间0.95;%do j=1%至19;/*19个场景*/%do k=1%至4;/*4天*/如果(S&j._&k=0),则执行;s_start=。;s_finish=。;segmt_no=&k;_label=“”;场景=“&j”;产出;结束;否则;%i=1%到11;/*11名演员*/%如果(&&A&i._S&j>0)%,则%do;如果(_label ne“”),则_label=strip(_label)||“,&&名称&i”;else _label=“&&名称&i”;%结束;%结束;s_start=%eval(&k-1)+0.5;s_finish=&k+0.45;segmt_no=&k;场景=“&j”;产出;_label=“”;结束;%结束;%结束;运行;%修复gantt_gen;%场景;title1 h=4pct“场景分配问题”;title2 h=3pct“参与者的最佳时间表”;goptions重置=模式;图案1 v=e c=白色r=10;proc甘特数据=甘特actor labdata=标签;图表/跳过=3诺霍布努姆诺列根pcompress(压缩)act=演员增量=1使用格式参考号=6 11 16高度=3图表宽度=89timeaxisformat=(天.,场景days.,场景.);;身份扮演者;运行;title1 h=4pct“场景分配问题”;title2 h=3pct“按场景的最佳时间表”;proc格式;价值场景0.5 = '                            1'1.5 = '                            2'2.5 = '                            3'3.5 = '                            4'4.5 = ' ';运行;数据标签;_y=-1;_lvar=“_label”;_xvar=“s_start”;_hlabel=4;_yoffset=-0.4;_xoffset=0;运行;goptions重置=模式;模式1 r=10 c=ltgray v=s;proc甘特数据=甘特场景labdata=标签;图表/跳过=3诺列根诺霍布努姆压缩act=场景持续时间=持续时间增量=1心智=0.5labsplit=“/”使用格式高度=4图表宽度=95barht=1.1;身份场景;运行;