我有一个复杂的模型,我想计算不同选项的目标函数值(不仅仅是最优解)。
我创建了下面的玩具示例:
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]
人工输入的目标函数?如果输入是可行解,我希望输出返回目标函数值,否则是警告。我可以硬编码这个问题,但我宁愿直接从m
(模型)中提取客观系数,并将它们与新的X
输入相乘。
一个非常简单的想法:您可以通过设置给定输入的下界和上界来固定模型中的所有变量,然后求解模型。然后,model.objVal
属性包含给定输入解决方案的目标值。一个简单的实现是这样的:
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]
是不可行的。