manbet体育手机客户端


工作力5.py


#!/usr/bin/python版权所有2019,Gurobi Opt狗万app足彩imization,LLC#分配工人轮班;每个工人在某一天都可能有空,也可能没有空。我们使用多目标优化来解决该模型最高优先级的目标是最小化宽松裤的总和(即未覆盖的班次总数)。第二个目标是最大限度地减少所有工人的最大和最小轮班数之间的差异。第二个优化允许#将第一个目标降低10%和2*/的较小值,从gurobipy导入*尝试:#样本数据#天数和工人轮班设置=[“周一”、“周二”、“周三”、“周四”、“周五”、“周六”、“周日”、“周一”、“周二”、“周二”、“周三”、“周四”、“周五”、“周二”、“周三”、“周二”、“周三”、“周二”、“周三”、“周二”、“周三”、“周四”]工人=[“艾米”、“鲍勃”、“凯西”、“丹”,“Ed”、“Fred”、“Gu”、“Tobi”]#每个班次所需的工人数量S=[3,2,4,4,5,5,2,2,3,4,6,7,5]班次要求={S:S[i]对于枚举(班次)中的i,S}#工人可用性:如果工人无法轮班a=[0,1,1,0,1,1,1,1],[1,1,0,0,1,0],0、1、1、1、1、0、0、0、1、1、1、1、1、1、1、1、1、1、0、1、1、1、1、0、1、0、0、1、0、0、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、0、1、0、1、1、0、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1 i,s在j的枚举(移位)中,w在enumerate(Workers)中}创建初始模型模型=模型(“workforce5”)#初始化分配决策变量:#x[w][s]==1(如果worker w被分配给了班次s.#这不再是一个纯粹的赋值模型,因此我们必须使用二进制变量。x=model.addVars(availability.keys(),ub=availability,vtype=GRB.BINARY,name='x')#每个班次约束的松弛变量,以便能够满足班次要求slacks=model.addVars(班次,name='Slack')#变量表示总轮班数totSlack=model.addVar(name='totSlack')#变量计算每个工人的总轮班数totShifts=model.addVars(Workers,name='totShifts')#约束:为每个轮班精确分配轮班要求[s]工人,加上轮班模型.addConstrs((x.sum('*'),s) +slacks[s]==轮班中的s的轮班要求),name='shiftRequirement')#约束:将totSlack设置为等于总轮班模型。addConstr(totSlack==slacks.sum(),name='totSlack')#约束:计算每个工人模型的总轮班数。addConstrs((totshift[w]==x.sum(w,'*')对于w个工人),name='totshift')#约束:将minShift/maxShift变量设置为小于/大于#所有工人的班次数minShift=model.addVar(name='minShift')maxShift=model.addVar(name='maxShift')model.addGenConstrMin(minShift,totshift,name='minShift')model.addGenConstrMax(maxShift,totshift,name='maxShift')#为所有目标模型设置全局意义。ModelSense=GRB.MINIMIZE#设置主要目标模型。setObjectiveN(totSlack,index=0,priority=2,absol=2.0,reltol=0.1,name='TotalSlack')#设置次要目标模型。setObjectiveN(maxShift-minShift,index=1,priority=1,name='fairity')#保存问题模型。write('workforce5.lp')#Optimize model.Optimize()status=model.status如果status==GRB.status.INF\u UNBD或\status==GRB.status.invasible或\status==GRB.status.UNBOUNDED:print('由于模型不可行或无边界而无法解决模型')sys.exit(0)如果status!=GRB.Status.OPTIMAL:print('优化已停止,状态'+str(Status)]系统退出(0)#打印每个工人的总空闲时间和工作班次打印('')print('')要求的总空闲时间:'+str(totSlack.X)),对于工人中的w:print(w+'worked'+str(TOTSIFTS[w].X)+'shifts')打印(''),但GUROBERROR为e:print('错误代码'+str(e.errno)+“:”+str(e))除了AttributeError作为e:print('遇到属性错误:'+str(e))