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(或根本不设置,这是一回事),以确定模型是否可行。

希望对您有所帮助!