Python gurobipy-无界模型&;无法检索属性';x';
我有一个任务,我需要使用gurobipy库创建一个MILP模型。这个问题与背包问题算法有关,我有10个项目和一个特定的容量。对于每个项目,我有一个低尺寸值和一个高尺寸值(我们不知道确切的尺寸)。我们为大小和决策变量创建所有可能的组合(如果物品是否包含在背包中)。列表包括:场景、收入、决策组合、概率,其中场景是一个1024个列表,每个列表包含10个项目(所有可能的大小组合),收入是一个包含10个项目的列表,其中存储了每个项目的值,decision_combs是由1024个列表组成的列表,其中包含10个项目,每个项目的值为0,1,用于确定某个项目是否包含在背包中。最后,概率列表包括每个场景的概率(1024个值的列表) 我的代码如下:Python gurobipy-无界模型&;无法检索属性';x';,python,python-3.x,gurobi,Python,Python 3.x,Gurobi,我有一个任务,我需要使用gurobipy库创建一个MILP模型。这个问题与背包问题算法有关,我有10个项目和一个特定的容量。对于每个项目,我有一个低尺寸值和一个高尺寸值(我们不知道确切的尺寸)。我们为大小和决策变量创建所有可能的组合(如果物品是否包含在背包中)。列表包括:场景、收入、决策组合、概率,其中场景是一个1024个列表,每个列表包含10个项目(所有可能的大小组合),收入是一个包含10个项目的列表,其中存储了每个项目的值,decision_combs是由1024个列表组成的列表,其中包含1
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())
上面的代码有两个问题。首先,当我运行该程序时,我在日志中看到该模型不可行或它是无限的。那么,我创建约束或目标函数的方式是否有问题
此外,我在尝试打印变量的值(打印(“%s%g%”(v.varName,v.x)))和目标函数的值(obj.getValue())时遇到异常,错误为:
无法检索属性“x”
有人能帮我解决这个问题吗?如果您的模型不可行或无界,这意味着它不会返回解决方案
x
是分配给变量的解数值,在这两种情况下,由于没有解,您无法通过调用x
找到变量分配的解数值
如果不可行怎么办
如果模型不可行,则可以诊断原因。这将计算阻止模型可行的最小约束集。你可以这样做
if model.solCount == 0:
print("Model is infeasible")
model.computeIIS()
model.write("model_iis.ilp")
这样做的目的是,如果没有找到解决方案,gurobi将计算此iis并将其保存在名为model_iis.ilp的文件中。然后,您可以阅读此文件以了解阻止找到可行解决方案的约束
如果无边界,该怎么办
如果模型是无界的,这意味着目标可以无限增加到无穷大。在这种情况下,将目标设置为0(或者根本不设置,这是同一回事),以确定模型是否可行
希望这有帮助 谢谢你的回复!模型是无界的,但如果我将目标设置为零,我可以得到解。这意味着目标函数或约束存在问题?这意味着变量可以无限大,以使目标最大化。在这种情况下,
size
似乎有一个下限,但没有上限,并且总是位于约束的大于一侧。您需要通过约束或重新考虑现有约束或显式设置大小变量的ub来为大小设置上限值,这取决于最适合您的问题。此外,在您的第一个约束条件中,左侧和右侧都有-容量
,它们将相互抵消。