计算 Gurobi 中手动输入的 objective 函数的值

Calculating the value of the objective function for a manual input in Gurobi

我有一个复杂的模型,我想计算不同选项(不仅仅是最优解)的 objective 函数值。

我创建了下面的玩具示例:

import gurobipy as gp
from gurobipy import GRB
import numpy as np

m = gp.Model()
X = {}
for i in range(5):
    X[i] = m.addVar(vtype= GRB.INTEGER, name=f"x[{i}]")
obj_func = 0
for i in range(5):
    np.random.seed(i)
    obj_func += np.random.rand() * X[i]
m.setObjective(obj_func, GRB.MINIMIZE)
m.addConstr(2 * X[1] + 5 * X[3] <= 10, name = 'const1')
m.addConstr(X[0] + 3 * X[4] >= 4, name = 'const2')
m.addConstr(3 * X[1] - X[4] <= 3, name = 'const3')
m.optimize()

for x_index, x in X.items():
    if round(x.X)>0:
        print(x_index, x.X)
# 0 1.0
# 4 1.0

手动输入X = [0,1,1,0,0]X=[1,0,0,0,1]如何计算objective函数。如果此输入是可行的解决方案,我希望输出 return objective 函数值,否则会发出警告。我可以对问题进行硬编码,但我宁愿直接从 m(模型)中提取 objective 系数,并将它们与新的 X 输入相乘。

一个非常简单的想法:您可以通过设置给定输入的下限和上限来修复模型中的所有变量,然后求解模型。然后,model.objVal 属性包含给定输入解决方案的 objective 值。一个简单的实现如下所示:

import numpy as np

given_sols = np.array([[0, 1, 1, 0, 0], [1, 0, 0, 0, 1]])

# Evaluate the objective for multiple given solutions
def get_obj_vals(model, given_sols):
    obj_vals = np.nan * np.zeros(given_sols.shape[0])
    # for each given solution..
    for k, x in enumerate(given_sols):
        # reset the model
        model.reset()
        # Fix the lower/upper bounds
        for i, var in enumerate(model.getVars()):
            var.lb = x[i]
            var.ub = x[i]
        # solve the problem
        model.optimize()
        if model.Status == GRB.Status.OPTIMAL:
            obj_vals[k] = model.objVal
    return obj_vals

这里obj_vals[i]中的nan表示given_sols[i]不可行