资源

调度(misole01)

/****************************************************************//*                                                              *//*S A S S A M P L E L I B R A R Y*//*                                                              *//*名称:misole01*//*标题:计划(misole01)*//*产品:或*//*系统:所有*//*关键字:或*//*程序:OPTMODEL*//*数据:*//*                                                              *//*支持:更新:*//*参考:*//*MISC:混合整数线性规划的示例1*//*数学规划的求解章节*//*                                                              *//****************************************************************/数据偏好;输入名称$slot mon tue wed thu fri;数据线;3月1日10日10日3月29日9 9 9 9日三月3 8 8 8 8 83月4日11日11日3月5日11日11日3月6日11日11日3月7日11日11日3月8日11日11日迈克1 10 9 8 7 6迈克2 10 9 8 7 6迈克3 10 9 8 7 6迈克4 10 3 3 3 3迈克5 1 1 1 1迈克6 1 2 3 4 5迈克7 1 2 3 4 5迈克8 1 2 3 4 5账单1 10 10 10 10账单2 9 9 9 9账单3 8 8 8 8账单4 0 0 0 0清单5 1 1 1 1清单6 1 1 1 1清单7 1 1 1 1清单8 1 1 1 1鲍勃1 10 9 8 7 6鲍勃2 10 9 8 7 6鲍勃3 10 9 8 7 6鲍勃4 10 3 3 3 3鲍勃5 1 1 1 1鲍勃6 1 2 3 4 5鲍勃7 1 2 3 4 5鲍勃8 1 2 3 4 5;数据最大小时数;输入名称$hour;数据线;3月20日迈克20账单20鲍勃20;过程操作模型;/*从数据集中读取首选项和最大小时数*/设置<string,num>DailyEmployeeSlots;设置<string>员工;set<num>TimeSlots=(DailyEmployeeSlots}插槽中的{name,slot>集合);set<string>WeekDays={“mon”,“tue”,“wed”,“thu”,“fri”};num WeeklyMaxHours{Employees};num个首选权重{DailyEmployeeSlots,Weekdays};num NSlots=卡(时隙);将数据首选项读入DailyEmployeeSlots=[name slot]{day in Weekdays}<首选权重〔name,slot,day〕=col(day)>;将数据maxhours读入Employees=[name]WeeklyMaxHours=hour;/*声明二进制赋值变量x[i,j,k]*/var在DailyEmployeeSlots中分配{name,slot>,day in Weekdays}二进制;/*对于每个p[i,j,k]=0,固定x[i,j,k]=0*/对于DailyEmployeeSlots中的{<名称,槽>,工作日中的日期:首选项权重[name,slot,day]=0}fix Assign[name,slot,day]=0;/*声明目标函数*/最大TotalPreferenceWeight=DailyEmployeeSlots中的sum{<名称,槽>,Weekdays中的day首选项权重[name,slot,day]*分配[name,spot,day];/*声明约束*/con OneEmpPerSlot{时隙中的时隙,工作日中的日}:sum{name in Employees}分配[name,slot,day]=1;con EmpMustHaveLunch{员工姓名,工作日}:指定[名称,4,天]+指定[名称,5,天]<=1;con AtMost2ConsSlots{员工姓名,从1..NSlots-2开始,工作日}:分配[name,start,day]+分配[name,start+1,day]+分配[name,start+2,day]<=2;con WeeklyHoursLimit{员工姓名}:sum{时隙,工作日}分配[name,slot,day]<=周最大小时数[名称];/*求解模型*/用milp求解;/*清理溶液*/对于DailyEmployeeSlot中的{<name,slot>,工作日中的一天}Assign[name,slot,day]=轮(Assign[name,slow,day]1e-6);从DailyEmployeeSlots中的[name slot]={name,slot>创建数据报告:max{day in Weekdays}分配[name,slot,day]>0}{工作日中的日期}<col(day)=(如果分配[name,slot,day]>0然后分配[name,slot,day]else。)>;退出;标题“报告的解决方案”;proc格式;值xfmt 1=“xxx”;运行;proc制表数据=报告;类名槽;var mon——周五;表(插槽*名称),(周一至周二至周五)*sum=''*f=xfmt。/misstext=“”;运行;