Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python gurobipy-无界模型&;无法检索属性';x';_Python_Python 3.x_Gurobi - Fatal编程技术网

Python gurobipy-无界模型&;无法检索属性';x';

Python gurobipy-无界模型&;无法检索属性';x';,python,python-3.x,gurobi,Python,Python 3.x,Gurobi,我有一个任务,我需要使用gurobipy库创建一个MILP模型。这个问题与背包问题算法有关,我有10个项目和一个特定的容量。对于每个项目,我有一个低尺寸值和一个高尺寸值(我们不知道确切的尺寸)。我们为大小和决策变量创建所有可能的组合(如果物品是否包含在背包中)。列表包括:场景、收入、决策组合、概率,其中场景是一个1024个列表,每个列表包含10个项目(所有可能的大小组合),收入是一个包含10个项目的列表,其中存储了每个项目的值,decision_combs是由1024个列表组成的列表,其中包含1

我有一个任务,我需要使用gurobipy库创建一个MILP模型。这个问题与背包问题算法有关,我有10个项目和一个特定的容量。对于每个项目,我有一个低尺寸值和一个高尺寸值(我们不知道确切的尺寸)。我们为大小和决策变量创建所有可能的组合(如果物品是否包含在背包中)。列表包括:场景、收入、决策组合、概率,其中场景是一个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())
上面的代码有两个问题。首先,当我运行该程序时,我在日志中看到该模型不可行或它是无限的。那么,我创建约束或目标函数的方式是否有问题

此外,我在尝试打印变量的值(打印(“%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来为大小设置上限值,这取决于最适合您的问题。此外,在您的第一个约束条件中,左侧和右侧都有
-容量
,它们将相互抵消。