资源

调度(optmilp4)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*名称:optmilp4*//*标题:调度(optmilp4)*//*产品:或*//*系统:所有*//*关键字:或*//*程序:OPTMILP、SQL、SORT、FORMAT、TEMPLATE*//*数据:*//*                                                             *//*支持:更新:*//*参考:*//*MISC:数学OPTMILP章节中的示例4*//*编程*//*                                                             *//***************************************************************/原始数据;输入名称$hour slot mon-tue-wed-thu-fri;数据线;3月20 1 10 10 10 103月20 2 9 9 9 93月20日3月8日8月8日3月20日4月11日11日3月20日5月11日11日3月20日6月11日11日3月20日7月11日11日3月20日8月11日11日迈克20 1 10 9 8 7 6迈克20 2 10 9 8 7 6迈克20 3 10 9 8 7 6迈克20 4 10 3 3 3 3迈克20 5 11 11迈克20 6 1 2 3 4 5迈克20 7 1 2 3 4 5迈克20 8 1 2 3 4 5账单20 1 10 10 10 10账单20 2 9 9 9 9账单20 3 8 8 8 8账单20 4 0 0 0 0账单20 5 1 1 1 1账单20 6 1 1 1 1 1 1账单20 7 1 1 1 1账单20 8 1 1 1 1鲍勃20 1 10 9 8 7 6鲍勃20 2 10 9 8 7 6鲍勃20 3 10 9 8 7 6鲍勃20 4 10 3 3 3 3鲍勃20 5 1 1 1 1鲍勃20 6 1 2 3 4 5鲍勃20 7 1 2 3 4 5鲍勃20 8 1 2 3 4 5;数据模型;数组工作周{5}周一周二周四周五;数组小时{4}小时1小时2小时3小时4;保留小时1小时4;设置原始结束=eof;长度低$8_col_$8_type_$8;保留类型引用;如果name='marc',则i=1;否则,如果name='mike',则i=2;否则,如果名称=“比尔”,则i=3;否则,如果name='bob',则i=4;小时{i}=小时;/*构建目标函数*/do k=1到5;_col_='x'||放置(i,1.)||放置;_row_=“对象”;_coef=工作周{k}*1000;产出;结束;/*构建模型的其余部分*//*在不可用插槽期间无法工作*/do k=1到5;如果工作周{k}=0,则执行;_row_='off'|put(i,1.)|put(slot,1.)| put(k,1.);_type_='eq';_col_='_RHS_';_系数=0;产出;_col_='x'||放置(i,1.)||放置;_系数=1;_type_='';产出;结束;结束;如果eof,那么do;_系数=。;_col_='';/*每小时1人工作*/do j=1至8;do k=1到5;_row_='work'||put(j,1.)||put(k,1.);_type_='eq';_col_='_RHS_';_系数=1;产出;_系数=1;_type_='';do i=1到4;_col_='x'|放置(i,1.)|放置(j,1.)||放置(k,1.);产出;结束;结束;结束;/*每人吃一顿午餐*/do i=1至4;do k=1到5;_row_='lunch'| |放置(i,1.)|放置(k,1.);_type_='le';_col_='_RHS_';_系数=1;产出;_系数=1;_type_='';_col_='x'||放置(i,1.)||'4'||放(k,1.);产出;_col_='x'||放置(i,1.)||'5'||放(k,1.);产出;结束;结束;/*最多连续工作2个插槽*/do i=1到4;do k=1到5;do l=1到6;_row_='seq'|put(i,1.)|put(k,1.)| put(l,1.);_type_='le';_col_='_RHS_';_系数=2;产出;_系数=1;_type_='';do j=0到2;_col_='x'|放置(i,1.)|放置(l+j,1.)||放置(k,1.);产出;结束;结束;结束;结束;/*一周最多工作n小时*/do i=1至4;_row_='capacit'|放置(i,1.);_type_='le';_col_='_RHS_';_coef=小时{i};产出;_系数=1;_type_=''类型;do j=1至8;do k=1到5;_col_='x'|放置(i,1.)|放置(j,1.)||放置(k,1.);产出;结束;结束;结束;结束;运行;/*以下代码转换上述稀疏数据集*//*MPS格式数据集*//*生成MPS格式数据集的标题*/数据mps0;格式field1 field2 field3$10。;格式字段4 10。;格式字段5$10。;格式字段6 10。;field1='NAME';field2=“”;field3=“问题”;字段4=。;field5=“”;字段6=。;产出;field1=“ROWS”;field3=“”;产出;field1=“最大”;field2=“对象”;field3=“”;产出;运行;/*生成行*/proc-sql;将表mps1创建为从模型中选择type作为field1,row作为field2where_row_eq“object”和_type_ne“”联合从模型中选择“E”作为field1,_row_作为field2其中_type_eq'eq'联合从模型中选择“L”作为field1,_row_作为field2where_type_eq'le'联合从模型中选择“G”作为field1,_row_作为field2其中_type_eq'ge';退出;/*指示列节的开始并声明所有列的类型*//*变量为整数*/数据mps2;格式field1 field2 field3$10。;格式字段4 10。;格式字段5$10。;格式字段6 10。;field1=“列”;field2=“”;field3=“”;字段4=。;field5=“”;字段6=。;产出;field1=“”;field2='。标记0';field3=“‘标记’”;字段4=。;field5=“‘INTORG’”;字段6=。;产出;运行;/*生成列*/数据mps3;集合模型;格式field1 field2 field3$10。;格式字段4 10。;格式字段5$10。;格式字段6 10。;保留字段1-field6;field1=“”;字段2=_ cl;字段3=向下;字段4=参考;field5=“”;字段6=。;如果字段2为“_RHS_”,则执行;产出;结束;运行;/*按变量名对列排序*/进程排序数据=mps3;按字段2;运行;/*指示列部分的结尾*/数据mps4;格式field1 field2 field3$10。;格式字段4 10。;格式字段5$10。;格式字段6 10。;field1=“”;field2=“。标记1’;field3=“‘标记’”;字段4=。;field5=“'INTEND'”;字段6=。;产出;运行;/*指示RHS段的开始*/数据mps5;格式field1 field2 field3$10。;格式字段4 10。;格式字段5$10。;格式字段6 10。;field1=“RHS”;运行;/*生成RHS条目*/数据mps6;集合模型;格式field1 field2 field3$10。;格式字段4 10。;格式字段5$10。;格式字段6 10。;保留字段1-field6;field1=“”;字段2=_ cl;字段3=向下;字段4=参考;field5=“”;字段6=。;如果字段2等于“_RHS_”,则执行;产出;结束;运行;/*表示MPS格式数据集的结束*/数据mps7;格式字段1字段2字段3$10。;格式字段4 10。;格式字段5$10。;格式字段6 10。;field1=“ENDATA”;运行;/*合并MPS格式数据集的所有部分*/数据mps;格式field1 field2 field3$10。;格式字段4 10。;格式字段5$10。;格式字段6 10。;设置mps0 mps1 mps2 mps3 mps4 mps5 mps6 mps7;运行;/*求解二进制程序*/proc-optmilp数据=mps打印级别=0日志级别=0primarylout=溶液最大时间=1000;运行;/*报告解决方案*/标题“报告的解决方案”;数据报告;集合解;保留姓名插槽mon-tue-wed-thu-fri;如果substr(_var,1,1)='x',则do;如果_value_>0,则执行;n=子(变量,2,1);槽=子(_var_,3,1);d=子项(_var_,4,1);如果n='1',则name='marc';否则,如果n='2',则name='mike';否则,如果n='3',则name='bill';其他名称='bob';如果d='1',则mon=1;否则,如果d='2',则tue=1;否则,如果d='3',则wed=1;否则,如果d='4',则thu=1;其他fri=1;产出;结束;结束;运行;proc格式;值xfmt 1=“xxx”;运行;proc制表数据=报告;类名槽;var mon——周五;表(插槽*名称),(周一至周二至周五)*sum=''*f=xfmt。/misstext=“”;运行;%放置&_OROPTMILP_;