资源

最佳工作排班分配(oclpe03)

/*********************************************************************//*                                                                   *//*S A S S A M P L E L I B R A R Y*//*                                                                   *//*姓名:oclpe03*//*标题:最佳轮班计划分配(oclpe03)*//*产品:或*//*系统:所有*//*关键字:或*//*程序:CLP,GANTT*//*数据:*//*                                                                   *//*支持:更新:*//*参考:*//*MISC:CLP Solver章节中的示例3*//*数学编程书*//*                                                                   *//*********************************************************************/proc选择模型;/*六名工人(艾伦、鲍勃、胡安妮塔、迈克、拉维和艾莎)分配给3个工作班次*/设置WORKERS=1..6;var W{WORKERS}整数>=1<=3;/*第一班至少需要1人,最多需要4人;第二班至少需要2人,最多需要3人;第三班正好需要两个人*/con移位需求:gcc(W,/<1,1,4>,<2,2,3>,<3,2,2>/);/*艾伦第一班不工作*/骗子艾伦:W[1]ne 1;/*鲍勃只上三班*/固定W[2]=3;解决;打印W;在WORKERS}<col('W'||j)=W[j]>中从{j创建数据clpout;退出;/*打印解决方案*/程序打印;标题“轮班调度问题的解决方案”;运行;/*生成甘特图*/proc转置数据=clpout out=tmp1;运行;数据tmp2(drop=_NAME_);格式名称$8。;设置tmp1;reName col1=e_start;e_finish=col1+1;持续时间=1;如果名称='W1',则名称='Alan';否则,如果名称='W2',则名称='Bob';否则,如果名称=“W3”,则名称=“胡安妮塔”;否则,如果名称='W4',则名称='Mike';否则,如果名称=“W5”,则名称=“Ravi”;否则,如果名称=“W6”,则名称=“Isha”;否则删除;运行;proc格式;价值转移1=“换档1”2=“换档2”3=“移位3”4 = ' ';运行;goptions htext=1.5;pattern1c=ltgray;title j=c h=6pct“示例3:可行的工作轮班分配”;过程甘特数据=tmp2;格式e_start shift。;图表/pcompress(压缩)跳过=2dur=持续时间刻度=16图表宽度=84ref=2 3 lref=20使用格式诺列根;id名称;运行;proc选择模型;/*六名工人(艾伦、鲍勃、胡安妮塔、迈克、拉维和艾莎)分配给3个工作班次*/设置WORKERS=1..6;设置SHIFTS=1..3;var W{WORKERS}整数>=1<=3;var C{WORKERS}整数>=1<=100;/*第一班至少需要1人,最多需要4人;第二班至少需要2人,最多需要3人;第三班正好需要两个人*/con GccCon公司:gcc(W,/<1,1,4>,<2,2,3>,<3,2,2>/);/*艾伦第一班不工作*/骗子艾伦:W[1]ne 1;/*鲍勃只上第三班*/固定W[2]=3;/*指定指派工人轮班的成本。使用100(一个大数字)表示分配这是不可能的*/num a{工人,轮班}=[100,  12, 10,100, 100,  6,16,   8, 1210,   6,  86,   6,  812,   4,  4];WORKERS}中的con元素con{j:元素(W[j],{k in SHIFTS}a[j,k],C[j]);/*将总成本降至最低*/最小总成本=工人}C[j]中的总和{j;con总成本边界(_bounds):1<=总成本<=100;解决;打印W;从创建数据clpout{j在WORKERS}<col('W'||j)=W[j]>{j在WARKERSneneneep中;退出;proc转置数据=clpout out=tmp1;运行;数据tmp2(drop=_NAME_);格式名称$8。;设置tmp1;reName col1=e_start;e_finish=col1+1;持续时间=1;如果名称='W1',则名称='Alan';否则,如果名称='W2',则名称='Bob';否则,如果名称=“W3”,则名称=“胡安妮塔”;否则,如果名称='W4',则名称='Mike';否则,如果名称=“W5”,则名称=“Ravi”;否则,如果名称=“W6”,则名称=“Isha”;否则删除;运行;数据tmp4;设置tmp1;如果n≤6,则删除;运行;proc格式;价值转移1=“换档1”2=“换档2”3=“移位3”4 = ' '5 = ' ';运行;数据tmp5(drop=_Name_);格式e_start shift。;格式成本1$8。;设置tmp2;设置tmp4;重命名col1=成本;cost1=“$”||strip(col1);运行;数据标签;_y=-1_xvar=“e_start”_xoffset=0.25_yoffset=-0.15;_clabel=“蓝色”_hlabel=1.0_lvar=“成本1”;运行;进程排序数据=tmp5输出=tmp6;通过e_start;运行;数据tmp6;保留总数0;设置tmp6;总计=总计+成本;运行;数据tmp7(keep=x y drop=max y cscale);设置tmp6 end=last;y=滞后(总计);如果(dif(e_start)),则执行;x=e_start;产出;结束;如果(最后)那么做;y=总数;x=e_start+1;产出;最大y=y+5;c刻度=6/最大值y;stry=y;调用symput('max_x',put(x+0.15,best.));调用symput('mincost',strip(put,stry,best.));调用symput('max_y',strip(put(max_y,best..));调用症状('scale',put(cscale,best.));结束;运行;%放置&max_y;%放置&cscale;%放置&mincost;%annomac;数据anno;/*定义成本曲线*/%dclanno;%系统(2,2,4);*长度实验室16美元;设置tmp7;当='a'时;如果n_=1,则执行;i=0到&max_y乘以5;lab=投入(i,美元7.);%标签(&maxx+0.8,(&maxy-i)*/cscale,实验室,黑色,0,0,1.0,4);产出;%标签(&maxx+0.9,(&maxy-i)*/cscale,'-',黑色,0,0,1.0,4);结束;%移动(1,&max_y*&ccale);/*开始成本曲线的初始点*/结束;否则;%绘制(x,(&max_y-y)*/cscale,蓝色,2,2);结束;运行;goptions htext=1.5;模式1 c=ltgray;title1 j=c h=6pct“示例3:最佳工作轮班分配”;title2 j=c h=5pct“最低成本计划:$&mincost”;proc-gantt data=tmp5-labdata=labels-annotate=anno;图表/pcompress(压缩)跳过=2图表宽度=84labsplit=“/”刻度=16mindate=1最大日期=5参考=2 3 4使用格式nolegend;id名称;运行;