workforce5_cs.cs
/*版权2019,Gurobi Opt狗万app足彩imization,LLC*/*分配工人轮班;每个工人在某一天可能有空,也可能没有空。采用多目标优化方法对模型进行求解。最高优先级的目标是最小化宽松的总和(即未覆盖的班次总数)。第二个目标是使所有工人的最大轮班数和最小轮班数之间的差异最小化。第二次优化允许使用系统将第一个目标降低10%和2*/的较小值;使用古罗比;class workforce5_cs{static void Main(){try{//Sample data//set of days and workers string[]shift=new string[]{“周一”、“周二”、“周三”、“周四”、“周五”、“周六”、“周日”、“周一”、“周二”、“周三”、“周四”、“周五”、“周三”、“周二”、“周三”、“周二”、“周三”、“周二”、“周三”、“周二”、“周三”、“周二”、“周三”、“周二”、“周三”、“周二”、“周二”、“周三”、“周三”等;string[]workers=new string[]{“艾米”、“鲍勃”、“凯茜”、“丹”、“埃德”、“弗雷德”、“顾”、“托比”};int nShifts=Shifts.Length;int nWorkers=Workers.Length;//每个轮班所需的工人数量[]轮班要求=新的双[]{3,2,4,5,6,5,2,2,3,4,6,7,5};//工人可用性:0如果工人不能轮班[,]可用性=新的双[,]{{0,1,1,1,1,1},{ 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0 }, { 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, { 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1 }, { 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1 }, { 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1 }, { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } };//创建环境GRBEnv env=new GRBEnv();//创建初始模型GRBModel model=new GRBModel(env);model.ModelName=“workforce5_cs”;//初始化分配决策变量://x[w][s]==1(如果工人w被分配给了班次s)。//这不再是一个纯粹的分配模型,因此我们必须//使用二进制变量。GRBVar[,]x=new GRBVar[nWorkers,nShifts];for(int w=0;w=到//所有工人的班次GRBVar minShift=model.AddVar(0,GRB.INFINITY,0,GRB.CONTINUOUS,“minShift”);GRBVar maxShift=model.AddVar(0,GRB.INFINITY,0,GRB.CONTINUOUS,“maxShift”);model.AddGenConstrMin(minShift,totshift,GRB.INFINITY,“minShift”);model.AddGenConstrMax(maxShift,totshift,-GRB.INFINITY,“maxShift”);//设置所有目标的全局意义model.ModelSense=GRB.MINIMIZE;//设置主要目标模型.SetObjectiveN(totSlack,0,2,1.0,2.0,0.1,“TotalSlack”);//设置次要目标模型.SetObjectiveN(maxShift-minShift,1,1.0,0,“公平”);//保存问题模型.Write(“workforce5_cs.lp”);//优化int status=solveAndPrint(model,totSlack,nWorkers,Workers,totShifts);if(status!=GRB.status.OPTIMAL)return;//处理模型和环境模型.Dispose();env.Dispose();}catch(grbeexception e){Console.WriteLine(“错误代码:{0}.{1}”,e.ErrorCode,e.Message)}私有静态int-solveAndPrint(GRBModel模型,GRBVar-totSlack,int-nWorkers,String[]Workers,GRBVar[]totShifts){model.Optimize();int-status=model.status;if(status==GRB.status.INF|u或UNBD | | status==GRB.status.UNBOUNDED){Console.WriteLine(“模型无法求解”+“因为它是不可行的或无限的”);return status; } if (status != GRB.Status.OPTIMAL ) { Console.WriteLine("Optimization was stopped with status {0}", status); return status; } // Print total slack and the number of shifts worked for each worker Console.WriteLine("\nTotal slack required: {0}", totSlack.X); for (int w = 0; w < nWorkers; ++w) { Console.WriteLine("{0} worked {1} shifts", Workers[w], totShifts[w].X); } Console.WriteLine("\n"); return status; } }