manbet体育手机客户端


workforce5_vb.vb


“版权2019,Gurobi优化,有狗万app足彩限责任公司'指定工人轮班;每个工人可能会或可能无法在“特定日期”。我们使用多目标优化来解决模型。“最优先的目标最小化了松弛的总和”(即,未发现的换档总数)。次要目标'最小化所有工人之间工作的最大值和最小数量之间的差异。第二优化被允许“高达降解第一个目标的10%和2 * /进口系统进口Gurobi类workforce5_vb共享子主要的较小值()尝试”样本数据“天,工人昏暗位移作为字符串的集()=新字符串(){_“mon1”,“tue2”,“wed3”,“thu4”,“星期五5”,“sat6”,“sun7”,_“mon8”,“tue9”,“wed10”,“wed10”,“sun7”,Thu11" , “Fri12”, “Sat13”, “Sun14”}昏暗的工人作为字符串()=新的字符串(){_ “艾米”, “鲍勃”, “凯蒂”, “丹”, “爱德”,“弗雷德”,‘谷’,‘托比’}昏暗nShifts为整数= Shifts.Length昏暗nWorkers为整数=对于每个移昏暗shiftRequirements为双()=新双(){要求工人的Workers.Length'数量_ 3,2,4,4,5,6,5,2,2,3,4,6,7,5}“工可用性:0,如果工人为移昏暗可用性如双(,)=新双(不可用,){_ {0,1,1,0,1,0,1,0,1,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,1,1,1,1,_ {0,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1},_ {1,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,0,_ {1,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,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如新的Grbenv()'为新的GrbModel(env)模型,创建环境Dimen Env,1,.1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}}。ModelName =“Workforce5_vb”'初始化分配决策变量:'x [w] [s] == 1如果为work w被分配给shift s。 ' This is no longer a pure assignment model, so we must ' use binary variables. Dim x As GRBVar(,) = New GRBVar(nWorkers - 1, nShifts - 1) {} For w As Integer = 0 To nWorkers - 1 For s As Integer = 0 To nShifts - 1 x(w, s) = model.AddVar(0, availability(w, s), 0, GRB.BINARY, _ String.Format("{0}.{1}", Workers(w), Shifts(s))) Next Next ' Slack variables for each shift constraint so that the shifts can ' be satisfied Dim slacks As GRBVar() = New GRBVar(nShifts - 1) {} For s As Integer = 0 To nShifts - 1 slacks(s) = model.AddVar(0, GRB.INFINITY, 0, GRB.CONTINUOUS, _ String.Format("{0}Slack", Shifts(s))) Next ' Variable to represent the total slack Dim totSlack As GRBVar = model.AddVar(0, GRB.INFINITY, 0, GRB.CONTINUOUS, "totSlack") ' Variables to count the total shifts worked by each worker Dim totShifts As GRBVar() = New GRBVar(nWorkers - 1) {} For w As Integer = 0 To nWorkers - 1 totShifts(w) = model.AddVar(0, GRB.INFINITY, 0, GRB.CONTINUOUS, _ String.Format("{0}TotShifts", Workers(w))) Next Dim lhs As GRBLinExpr ' Constraint: assign exactly shiftRequirements[s] workers ' to each shift s, plus the slack For s As Integer = 0 To nShifts - 1 lhs = New GRBLinExpr() lhs.AddTerm(1.0, slacks(s)) For w As Integer = 0 To nWorkers - 1 lhs.AddTerm(1.0, x(w, s)) Next model.AddConstr(lhs, GRB.EQUAL, shiftRequirements(s), Shifts(s)) Next ' Constraint: set totSlack equal to the total slack lhs = New GRBLinExpr() lhs.AddTerm(-1.0, totSlack) For s As Integer = 0 To nShifts - 1 lhs.AddTerm(1.0, slacks(s)) Next model.AddConstr(lhs, GRB.EQUAL, 0, "totSlack") ' Constraint: compute the total number of shifts for each worker For w As Integer = 0 To nWorkers - 1 lhs = New GRBLinExpr() lhs.AddTerm(-1.0, totShifts(w)) For s As Integer = 0 To nShifts - 1 lhs.AddTerm(1.0, x(w, s)) Next model.AddConstr(lhs, GRB.EQUAL, 0, String.Format("totShifts{0}", Workers(w))) Next ' Constraint: set minShift/maxShift variable to less <=/>= to the ' number of shifts among all workers Dim minShift As GRBVar = model.AddVar(0, GRB.INFINITY, 0, GRB.CONTINUOUS, "minShift") Dim maxShift As GRBVar = model.AddVar(0, GRB.INFINITY, 0, GRB.CONTINUOUS, "maxShift") model.AddGenConstrMin(minShift, totShifts, GRB.INFINITY, "minShift") model.AddGenConstrMax(maxShift, totShifts, -GRB.INFINITY, "maxShift") ' Set global sense for ALL objectives model.ModelSense = GRB.MINIMIZE ' Set primary objective model.SetObjectiveN(totSlack, 0, 2, 1.0, 2.0, 0.1, "TotalSlack") ' Set secondary objective model.SetObjectiveN(maxShift - minShift, 1, 1, 1.0, 0, 0, "Fairness") ' Save problem model.Write("workforce5_vb.lp") ' Optimize Dim status As Integer = _ solveAndPrint(model, totSlack, nWorkers, Workers, totShifts) If status <> GRB.Status.OPTIMAL Then Return End If ' Dispose of model and environment model.Dispose() env.Dispose() Catch e As GRBException Console.WriteLine("Error code: {0}. {1}", e.ErrorCode, e.Message) End Try End Sub Private Shared Function solveAndPrint(ByVal model As GRBModel, _ ByVal totSlack As GRBVar, _ ByVal nWorkers As Integer, _ ByVal Workers As String(), _ ByVal totShifts As GRBVar()) As Integer model.Optimize() Dim status As Integer = model.Status If status = GRB.Status.INF_OR_UNBD OrElse _ status = GRB.Status.INFEASIBLE OrElse _ status = GRB.Status.UNBOUNDED Then Console.WriteLine("The model cannot be solved " & _ "because it is infeasible or unbounded") Return status End If If status <> GRB.Status.OPTIMAL Then Console.WriteLine("Optimization was stopped with status {0}", status) Return status End If ' Print total slack and the number of shifts worked for each worker Console.WriteLine(vbLf & "Total slack required: {0}", totSlack.X) For w As Integer = 0 To nWorkers - 1 Console.WriteLine("{0} worked {1} shifts", Workers(w), totShifts(w).X) Next Console.WriteLine(vbLf) Return status End Function End Class