gurobipy - 无界模型且无法检索属性 'x'
gurobipy - unbounded model & unable to retrieve attribute 'x'
我有一项作业需要使用 gurobipy 库创建 MILP 模型。这个问题与背包问题算法有关,我有 10 个项目和一个特定的容量。对于每件商品,我都有一个低尺寸值和一个高尺寸值(我们不知道确切的尺寸)。我们为尺寸和决策变量创建所有可能的组合(如果物品是否包含在背包中)。列表是:场景、收入、decision_combs、概率,其中场景是 1024 个列表,每个列表 10 个项目(所有可能的大小组合),收入是 10 个项目的列表,其中每个项目的价值是存储后,decision_combs 是一个包含 1024 个列表的列表,其中包含 10 个项目,每个项目具有 0,1 值,用于确定背包中是否包含项目。最后,概率列表包括每个场景的概率(1024 个值的列表)。
我的代码如下:
model = gb.Model('MILP')
obj = gb.LinExpr()
for j, scenario in enumerate(scenarios):
for z, decision_var in enumerate(decision_combs):
# create model variable for scenario j and decision var vector z
sizes = model.addVars(item_indx, vtype=gb.GRB.CONTINUOUS, name="sizes{}{}".format(j, z), lb=0)
# calculate the total selected size based on the decision variables
total_size_selected = 0
for d, decis_var in enumerate(decision_var):
if decis_var == 1.0 or decis_var == 1:
total_size_selected += scenario[d]
# calculate the penalty based on the capacity and selected weights
final_penalty = penalty * (total_size_selected - capacity)
# calculate the objective function of the current scenario and decision var vector
obj += probabilities[j] * (sum((scenario[k] * revenues[k] * decision_var[k]) * sizes[k]
for k in item_indx) - final_penalty)
rhs = total_size_selected - capacity
model.addConstr(lhs=gb.quicksum(sizes[k] for k in item_indx) - capacity,
sense=gb.GRB.GREATER_EQUAL, rhs=rhs, name="scenario{}{}".format(j, z))
model.addConstr(lhs=gb.quicksum(sizes[k] for k in item_indx) - capacity,
sense=gb.GRB.GREATER_EQUAL, rhs=0, name="scenarioPositive{}{}".format(j, z))
# set the objective function to the model
print("Setting total objective function to model {}".format(i))
model.setObjective(obj, gb.GRB.MAXIMIZE)
print("Updating model {}".format(i))
# update the model
model.update()
print("Optimizing model {}".format(i))
# optimize the model
model.optimize()
for v in model.getVars():
print('%s %g' % (v.varName, v.x))
obj = model.getObjective()
print('Profit: %g' % -obj.getValue())
上面的代码有两个问题。首先,当我 运行 程序时,我在日志中看到该模型不可行或者它是无界的。那么,我创建约束或 objective 函数的方式有问题吗?
此外,我在尝试打印变量值 (print('%s %g' % (v.varName, v.x))) 和 objective 函数的值 (obj.getValue()),错误是:
无法检索属性 'x'
谁能帮我解决这个问题?
如果您的模型不可行或无界,则表示它没有 return 解。 x
是已分配给变量的解决方案值,在这两种情况下,由于没有解决方案,您无法找到通过调用 x
.[=15 为变量分配的解决方案值=]
不可行怎么办
如果模型不可行,那么您可以 compute a model iis 诊断原因。这将计算阻止模型可行的最小约束集。你可以这样做;
if model.solCount == 0:
print("Model is infeasible")
model.computeIIS()
model.write("model_iis.ilp")
它的作用是,如果没有找到解决方案,gurobi 将计算此 iis 并将其保存在名为 model_iis.ilp 的文件中。然后您可以阅读此文件以了解阻止找到可行解决方案的约束。
无界怎么办
如果模型是无界的,这意味着 objective 可以无限增加到无穷大。 Gurobi recommends 在这种情况下将 objective 设置为 0(或根本不设置,这是一回事),以确定模型是否可行。
希望对您有所帮助!
我有一项作业需要使用 gurobipy 库创建 MILP 模型。这个问题与背包问题算法有关,我有 10 个项目和一个特定的容量。对于每件商品,我都有一个低尺寸值和一个高尺寸值(我们不知道确切的尺寸)。我们为尺寸和决策变量创建所有可能的组合(如果物品是否包含在背包中)。列表是:场景、收入、decision_combs、概率,其中场景是 1024 个列表,每个列表 10 个项目(所有可能的大小组合),收入是 10 个项目的列表,其中每个项目的价值是存储后,decision_combs 是一个包含 1024 个列表的列表,其中包含 10 个项目,每个项目具有 0,1 值,用于确定背包中是否包含项目。最后,概率列表包括每个场景的概率(1024 个值的列表)。
我的代码如下:
model = gb.Model('MILP')
obj = gb.LinExpr()
for j, scenario in enumerate(scenarios):
for z, decision_var in enumerate(decision_combs):
# create model variable for scenario j and decision var vector z
sizes = model.addVars(item_indx, vtype=gb.GRB.CONTINUOUS, name="sizes{}{}".format(j, z), lb=0)
# calculate the total selected size based on the decision variables
total_size_selected = 0
for d, decis_var in enumerate(decision_var):
if decis_var == 1.0 or decis_var == 1:
total_size_selected += scenario[d]
# calculate the penalty based on the capacity and selected weights
final_penalty = penalty * (total_size_selected - capacity)
# calculate the objective function of the current scenario and decision var vector
obj += probabilities[j] * (sum((scenario[k] * revenues[k] * decision_var[k]) * sizes[k]
for k in item_indx) - final_penalty)
rhs = total_size_selected - capacity
model.addConstr(lhs=gb.quicksum(sizes[k] for k in item_indx) - capacity,
sense=gb.GRB.GREATER_EQUAL, rhs=rhs, name="scenario{}{}".format(j, z))
model.addConstr(lhs=gb.quicksum(sizes[k] for k in item_indx) - capacity,
sense=gb.GRB.GREATER_EQUAL, rhs=0, name="scenarioPositive{}{}".format(j, z))
# set the objective function to the model
print("Setting total objective function to model {}".format(i))
model.setObjective(obj, gb.GRB.MAXIMIZE)
print("Updating model {}".format(i))
# update the model
model.update()
print("Optimizing model {}".format(i))
# optimize the model
model.optimize()
for v in model.getVars():
print('%s %g' % (v.varName, v.x))
obj = model.getObjective()
print('Profit: %g' % -obj.getValue())
上面的代码有两个问题。首先,当我 运行 程序时,我在日志中看到该模型不可行或者它是无界的。那么,我创建约束或 objective 函数的方式有问题吗?
此外,我在尝试打印变量值 (print('%s %g' % (v.varName, v.x))) 和 objective 函数的值 (obj.getValue()),错误是: 无法检索属性 'x'
谁能帮我解决这个问题?
如果您的模型不可行或无界,则表示它没有 return 解。 x
是已分配给变量的解决方案值,在这两种情况下,由于没有解决方案,您无法找到通过调用 x
.[=15 为变量分配的解决方案值=]
不可行怎么办
如果模型不可行,那么您可以 compute a model iis 诊断原因。这将计算阻止模型可行的最小约束集。你可以这样做;
if model.solCount == 0:
print("Model is infeasible")
model.computeIIS()
model.write("model_iis.ilp")
它的作用是,如果没有找到解决方案,gurobi 将计算此 iis 并将其保存在名为 model_iis.ilp 的文件中。然后您可以阅读此文件以了解阻止找到可行解决方案的约束。
无界怎么办
如果模型是无界的,这意味着 objective 可以无限增加到无穷大。 Gurobi recommends 在这种情况下将 objective 设置为 0(或根本不设置,这是一回事),以确定模型是否可行。
希望对您有所帮助!