资源

场景分配问题(oclpe06)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*姓名:oclpe06*//*标题:场景分配问题(oclpe06)*//*产品:或*//*系统:所有*//*关键字:或*//*课程:光学模型,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_=“最小值”;_右侧=。;运行;/*生成甘特图*/%甘特根;%修补场景;过程操作模型;设置ACTORS;str actor_name{ACTORS};num daily_fee{演员};num most_scenes=9;/*任何演员的大多数场景*/num场景列表{演员,1..most_scenes};将数据场景读入ACTORS=[_N_]actor_name=演员daily_fee=每日费用{j-in-1..most_scenes}<scene_list[_N_,j]=col('S_Var'||j)>;打印演员姓名daily_fee场景列表;在ACTORS中设置SCENES_actor{i}=(1..most_scenes}场景列表[i,j]中的{j集合)diff{.};设置SCENES=1..19;设置DAYS=1..4;/*指示参与者i在第k天是否存在*/变量A{ACTORS,DAYS}二进制;/*指示场景j是否在第k天拍摄*/变量S{SCENES,DAYS}二进制;/*每个场景只拍摄一次*/con场景con{j in SCENES}:gcc({k天}S[j,k],{<1,1,1>});/*每天至少拍摄4个场景,最多拍摄5个场景*/con NumScenesPerDayCon{k(以天为单位)}:gcc(场景中的{j}S[j,k],{<1,4,5>});/*一场戏的演员必须在拍摄当天在场*/con链接con{i在ACTORS中,j在SCENES_actor[i]中,k在DAYS中}:S[j,k]<=A[i,k];/*对称破坏约束。在不失一般性的情况下,我们可以假设场景1在第一天拍摄,场景2在第一天拍或第2天,场景3将在第1天、第2天或第3天拍摄*/固定S[1,1]=1;对于2..4}中的{k,修复S[1,k]=0;对于3..4}中的{k,修复S[2,k]=0;固定S[3,4]=0;/*如果场景2是在第1天拍摄的(与第2天相反)*//*然后场景3可以在第1天或第2天拍摄(但不能在第3天拍摄)*/反对称:S[2,1]+S[3,3]<=1;/*将总成本降至最低*/最小总成本=总和{i(演员),k(天)}每日费用[i]*A[i,k];/*设置目标值的上下限*//*下限:每个演员都会出现在某一天*//*上限:所有演员都会在这四天出现*/num obj_lb=演员中的总和{i}每日费用[i];num obj_ub=演员中的总和{i,天数中的k}每日费用[i];放置obj_lb=obj_ub=;con总成本边界(_bounds):obj_lb<=总成本<=obj_ub;用CLP/varselect=maxc求解;从中创建数据{i以演员为单位,k以天数为单位}<col('A'||i|'_'||k)=A[i,k]>场景中的{j,天数中的k}<col('S'||j||'_'|k)=S[j,k]>;退出;%宏观场景;proc转置数据=out out=dayout;运行;%do i=1%至4;%全球日。;proc-sql;创建表day&i.as选择子字符串(“”,长度(名称)-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;插入场景值(“”,“场景”,21,21);退出;proc格式cntlin=场景;运行;proc格式;价值天数1=“第1天”6=“第2天”11=“第3天”16=“第4天”;价值场景1=“场景”6=“场景”11=“场景”16=“场景”;运行;%修补;%宏观gant_gen;%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';产出;运行;数据甘特场景;格式化标签$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)||“,&&Name&i”;else _label=“&&名称&i”;%结束;%结束;s_start=%eval(&k-1)+0.5;s_finish=&k+0.45;segmt_no=&k;场景=“&j”;产出;_label=“”;结束;%结束;%结束;运行;%修复甘特根;%场景;title1 h=4pct“场景分配问题”;title2 h=3pct“参与者的最佳时间表”;goptions重置=模式;图案1 v=e c=白色r=10;proc gantt data=gant_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 gantt data=gantt_scene labdata=标签;图表/跳过=3诺列根诺霍布努姆压缩act=场景持续时间=持续时间增量=1心智=0.5labsplit=“/”使用格式高度=4图表宽度=95barht=1.1;身份场景;运行;