计算 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]
不可行
我有一个复杂的模型,我想计算不同选项(不仅仅是最优解)的 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]
不可行