Gurobi 使用 Python:带变量的 Objective 函数中的插值函数

Gurobi using Python: Interpolation Function in Objective Function with Variables

我正在尝试使用 Gurobi 来最小化柴油发电机的油耗。每台柴油发电机的瞬时燃料消耗是使用基于发电机负载和容量(即 70% 负载和 20kW 容量)的样本值的网格插值法计算的。此函数的创建如下所示:

Fuel_Map_X, Fuel_Map_Y = np.meshgrid(Fuel_Map_Load,Fuel_Map_Size)
f = interpolate.interp2d(Fuel_Map_X,Fuel_Map_Y,Fuel_Map_Data,kind='linear')
Testvalue = f(0.7,20)

所以TestValue的输出是指定发电机的瞬时油耗。现在,在我的 Gurobi 模型中,每台发电机的负载和容量都是变量。所有发电机的燃料消耗总和是需要最小化的。当我尝试使用插值函数和变量作为输入来计算油耗时,出现以下错误:

TypeError: Cannot cast array data from dtype('O') to dtype('float64') according to the rule 'safe'

有谁知道是否有解决方法,以便我可以使用以变量作为输入的插值函数?我尝试将油耗作为约束条件而不是 objective,但收到了同样的错误。

根据要求,这里是我如何使用 Gurobi 定义相关变量并将它们形成所需的 objective 函数(不起作用):

# Defining Gurobi Variables
Load1 = m.addVars(T,name="Load1")
Cap1 = m.addVar(vtype=GRB.INTEGER,name="Cap1") # Capacity of Cat. 1 component chosen


# Gurobi Objective Function
obj = sum(f(Load1[t],Cap1) for t in range(T))
m.setObjective(obj, GRB.MINIMIZE)

此外,您可以假设变量已经计算成功,并且有约束条件,但它们并不重要,因为它们对我的问题的影响为零。

提前致谢!

Gurobi 旨在解决具有二次或线性表达式的混合整数问题,因此它只能解决符合 its canonical forms 之一的模型。尝试将函数 f() 转换为分段线性表达式。