gurobi错误代码=无法检索属性“X”

2024-04-29 00:34:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图使用gurobi用Python编写一个劳动力规划问题。 作为基本模式,我不允许雇佣或解雇新员工。因此,我只有一个变量“numberRequired”,作为特定时期所需的人员。需求变量(以小时数表示)决定需要多少人员。我的代码如下: (P=周期,SP=技能位置,T=任务)

from gurobipy import *
model = Model('workforce planning')
periods = ("Period1", "Period2", "Period3", "Period4", "Period5", "Period6", "Period7")
skillPositions = ("SP1", "SP2", "SP3", "SP4", "SP5", "SP6", "SP7", "SP8")
tasks = ("T1", "T2", "T3", "T4", "T5", "T6", "T7", "T8", "T9", "T10", "T11", "T12", "T13", "T14", "T15")

#DEFINE PARAMETERS
salaryCost = {"Period1": {"SP1":2296, "SP2":2207, "SP3":1900, "SP4":2199, "SP5":2586, "SP6":2276, "SP7":2390, "SP8":2200},
              "Period2": {"SP1":2296, "SP2":2207, "SP3":1900, "SP4":2199, "SP5":2586, "SP6":2276, "SP7":2390, "SP8":2200},
              "Period3": {"SP1":2296, "SP2":2207, "SP3":1900, "SP4":2199, "SP5":2586, "SP6":2276, "SP7":2390, "SP8":2200},
              "Period4": {"SP1":2296, "SP2":2207, "SP3":1900, "SP4":2199, "SP5":2586, "SP6":2276, "SP7":2390, "SP8":2200},
              "Period5": {"SP1":2296, "SP2":2207, "SP3":1900, "SP4":2199, "SP5":2586, "SP6":2276, "SP7":2390, "SP8":2200},
              "Period6": {"SP1":2296, "SP2":2207, "SP3":1900, "SP4":2199, "SP5":2586, "SP6":2276, "SP7":2390, "SP8":2200},
              "Period7": {"SP1":2296, "SP2":2207, "SP3":1900, "SP4":2199, "SP5":2586, "SP6":2276, "SP7":2390, "SP8":2200}}

#Number of hours a worker with skillPosition has to work on task x in period t
demand = {"Period1": {"T1":3, "T2":1386,"T3":1169, "T4":650, "T5":2923, "T6":693, "T7":4482, "T8":130, "T9":346, "T10":87, "T11":346, "T12":346, "T13":693, "T14":173, "T15":1}, 
          "Period2": {"T1":1, "T2":1252,"T3":1120, "T4":645, "T5":2788, "T6":670, "T7":4348, "T8":80, "T9":212, "T10":69, "T11":325, "T12":325, "T13":687, "T14":168, "T15":1}, 
          "Period3": {"T1":1, "T2":1302,"T3":1095, "T4":650, "T5":2838, "T6":650, "T7":4398, "T8":55, "T9":262, "T10":39, "T11":330, "T12":330, "T13":689, "T14":173, "T15":1}, 
          "Period4": {"T1":1, "T2":1297,"T3":1169, "T4":645, "T5":2788, "T6":693, "T7":4393, "T8":130, "T9":212, "T10":77, "T11":335, "T12":335, "T13":669, "T14":168, "T15":1}, 
          "Period5": {"T1":1, "T2":1452,"T3":1170, "T4":650, "T5":3038, "T6":700, "T7":4548, "T8":130, "T9":462, "T10":87, "T11":340, "T12":340, "T13":689, "T14":173, "T15":1}, 
          "Period6": {"T1":1, "T2":1502,"T3":1220, "T4":660, "T5":3088, "T6":700, "T7":4598, "T8":180, "T9":512, "T10":89, "T11":345, "T12":344, "T13":689, "T14":183, "T15":1}, 
          "Period7": {"T1":1, "T2":1602,"T3":1270, "T4":670, "T5":3188, "T6":700, "T7":4698, "T8":230, "T9":612, "T10":99, "T11":349, "T12":350, "T13":689, "T14":193, "T15":1}}

#This defines which skill position is able to perform which task 
possibleCombinations = {"Period1": {"SP1": {"T1":1, "T2":1,"T3":0, "T4":0, "T5":1, "T6":0, "T7":1, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":0, "T15":0},
                                    "SP2": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":1, "T6":0, "T7":0, "T8":0, "T9":1, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP3": {"T1":1, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":0, "T15":0},
                                    "SP4": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":0, "T6":1, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP5": {"T1":0, "T2":0,"T3":1, "T4":0, "T5":0, "T6":0, "T7":0, "T8":1, "T9":0, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP6": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":1, "T11":0, "T12":0, "T13":0, "T14":0, "T15":1},
                                    "SP7": {"T1":1, "T2":0,"T3":0, "T4":1, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":1, "T15":0},
                                    "SP8": {"T1":1, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":1, "T12":0, "T13":1, "T14":0, "T15":0}},
                        "Period2": {"SP1": {"T1":1, "T2":1,"T3":0, "T4":0, "T5":1, "T6":0, "T7":1, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":0, "T15":0},
                                    "SP2": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":1, "T6":0, "T7":0, "T8":0, "T9":1, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP3": {"T1":1, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":0, "T15":0},
                                    "SP4": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":0, "T6":1, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP5": {"T1":0, "T2":0,"T3":1, "T4":0, "T5":0, "T6":0, "T7":0, "T8":1, "T9":0, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP6": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":1, "T11":0, "T12":0, "T13":0, "T14":0, "T15":1},
                                    "SP7": {"T1":1, "T2":0,"T3":0, "T4":1, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":1, "T15":0},
                                    "SP8": {"T1":1, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":1, "T12":0, "T13":1, "T14":0, "T15":0}},
                        "Period3": {"SP1": {"T1":1, "T2":1,"T3":0, "T4":0, "T5":1, "T6":0, "T7":1, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":0, "T15":0},
                                    "SP2": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":1, "T6":0, "T7":0, "T8":0, "T9":1, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP3": {"T1":1, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":0, "T15":0},
                                    "SP4": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":0, "T6":1, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP5": {"T1":0, "T2":0,"T3":1, "T4":0, "T5":0, "T6":0, "T7":0, "T8":1, "T9":0, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP6": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":1, "T11":0, "T12":0, "T13":0, "T14":0, "T15":1},
                                    "SP7": {"T1":1, "T2":0,"T3":0, "T4":1, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":1, "T15":0},
                                    "SP8": {"T1":1, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":1, "T12":0, "T13":1, "T14":0, "T15":0}},
                        "Period4": {"SP1": {"T1":1, "T2":1,"T3":0, "T4":0, "T5":1, "T6":0, "T7":1, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":0, "T15":0},
                                    "SP2": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":1, "T6":0, "T7":0, "T8":0, "T9":1, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP3": {"T1":1, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":0, "T15":0},
                                    "SP4": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":0, "T6":1, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP5": {"T1":0, "T2":0,"T3":1, "T4":0, "T5":0, "T6":0, "T7":0, "T8":1, "T9":0, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP6": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":1, "T11":0, "T12":0, "T13":0, "T14":0, "T15":1},
                                    "SP7": {"T1":1, "T2":0,"T3":0, "T4":1, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":1, "T15":0},
                                    "SP8": {"T1":1, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":1, "T12":0, "T13":1, "T14":0, "T15":0}},
                        "Period5": {"SP1": {"T1":1, "T2":1,"T3":0, "T4":0, "T5":1, "T6":0, "T7":1, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":0, "T15":0},
                                    "SP2": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":1, "T6":0, "T7":0, "T8":0, "T9":1, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP3": {"T1":1, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":0, "T15":0},
                                    "SP4": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":0, "T6":1, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP5": {"T1":0, "T2":0,"T3":1, "T4":0, "T5":0, "T6":0, "T7":0, "T8":1, "T9":0, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP6": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":1, "T11":0, "T12":0, "T13":0, "T14":0, "T15":1},
                                    "SP7": {"T1":1, "T2":0,"T3":0, "T4":1, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":1, "T15":0},
                                    "SP8": {"T1":1, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":1, "T12":0, "T13":1, "T14":0, "T15":0}},
                        "Period6": {"SP1": {"T1":1, "T2":1,"T3":0, "T4":0, "T5":1, "T6":0, "T7":1, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":0, "T15":0},
                                    "SP2": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":1, "T6":0, "T7":0, "T8":0, "T9":1, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP3": {"T1":1, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":0, "T15":0},
                                    "SP4": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":0, "T6":1, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP5": {"T1":0, "T2":0,"T3":1, "T4":0, "T5":0, "T6":0, "T7":0, "T8":1, "T9":0, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP6": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":1, "T11":0, "T12":0, "T13":0, "T14":0, "T15":1},
                                    "SP7": {"T1":1, "T2":0,"T3":0, "T4":1, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":1, "T15":0},
                                    "SP8": {"T1":1, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":1, "T12":0, "T13":1, "T14":0, "T15":0}},
                        "Period7": {"SP1": {"T1":1, "T2":1,"T3":0, "T4":0, "T5":1, "T6":0, "T7":1, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":0, "T15":0},
                                    "SP2": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":1, "T6":0, "T7":0, "T8":0, "T9":1, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP3": {"T1":1, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":0, "T15":0},
                                    "SP4": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":0, "T6":1, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP5": {"T1":0, "T2":0,"T3":1, "T4":0, "T5":0, "T6":0, "T7":0, "T8":1, "T9":0, "T10":0, "T11":0, "T12":0, "T13":0, "T14":0, "T15":0},
                                    "SP6": {"T1":0, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":1, "T11":0, "T12":0, "T13":0, "T14":0, "T15":1},
                                    "SP7": {"T1":1, "T2":0,"T3":0, "T4":1, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":0, "T12":0, "T13":1, "T14":1, "T15":0},
                                    "SP8": {"T1":1, "T2":0,"T3":0, "T4":0, "T5":0, "T6":0, "T7":0, "T8":0, "T9":0, "T10":0, "T11":1, "T12":0, "T13":1, "T14":0, "T15":0}}}

availableRegularHours = 180
M=200
model.update()


#DEFINE DECISION VARIABLES
numberRequired = model.addVars(periods, skillPositions, tasks, vtype=GRB.INTEGER,  name = "numberRequired")
model.update()


#DEFINE CONSTRAINTS
model.addConstrs(numberRequired[period, skillPositionJ, taskx] == numberRequired[periods[period_index-1], skillPositionJ, taskx] for skillPositionJ in skillPositions for taskx in tasks for period_index, period in enumerate(periods))
#This big-M constraint is where the error message comes from 
model.addConstrs(numberRequired[period, skillPositionJ, taskx] <= M*possibleCombinations[period][skillPositionJ][taskx] for period in periods for skillPositionJ in skillPositions for taskx in tasks)
model.addConstrs(demand[period][taskx] <= numberRequired[period, skillPositionJ, taskx] *availableRegularHours for period in periods for skillPositionJ in skillPositions for taskx in tasks)
model.addConstrs(numberRequired[period, skillPositionJ ,taskx] >= 0 for period in periods for skillPositionJ in skillPositions for taskx in tasks)

#DEFINE OBJECTIVE
obj = quicksum(salaryCost[period][skillPositionJ]*numberRequired[periods[period_index-1], skillPositionJ, taskx] for period_index, period in enumerate(periods) for skillPositionJ in skillPositions for taskx in tasks)
model.setObjective(obj, GRB.MINIMIZE)


model.optimize()
model.printAttr('X')

当我尝试运行此程序时,会收到以下错误消息:gurobierro:无法检索属性“X”。 一旦我删除了big-M约束,程序就会运行。我想这就是我的错误发生的地方。能帮我做这个吗? 多谢各位


Tags: t1t3t2t4t7t5t12t11
1条回答
网友
1楼 · 发布于 2024-04-29 00:34:08

欢迎来到StackOverflow!在访问解决方案值之前,应始终检查解算器状态。我假设在你的情况下,这个问题是不可行的,因此没有解决方案来显示

您可以这样做:

model.optimize()
if model.status == GRB.OPTIMAL:
    model.printAttr('X')

相关问题 更多 >