我对 Gurobi 和 Python 还很陌生,我遇到了以下问题。给出的是集合:
import pandas as pd
I = pd.DataFrame(index = ['i0', 'i1', 'i2', 'i3', 'i4'])
L = [('k0', 'j2'), ('k0', 'j3'), ('k0', 'j4'), ('k1', 'j3'), ('k2', 'j1'), ('k2', 'j2'), ('k2', 'j4')]
N_i = {'i0': [('k0', 'j4')],'i1': [('k0', 'j3'), ('k1', 'j3')],
'i2': [],'i3': [('k0', 'j2'), ('k0', 'j3'), ('k0', 'j4'), ('k2', 'j2'), ('k2', 'j4')],
'i4': [('k0', 'j4')]}
theta = {'i0': 27, 'i1': 36, 'i2': 31, 'i3': 14, 'i4': 41}
我必须定义以下目标函数和约束:
我尝试以不同的方式做类似的事情,但没有成功。
import gurobipy as gp
from gurobipy import GRB
import itertools
model1 = gp.Model('Location-allocation problem 1')
x_ikj = model1.addVars(list(itertools.product(I.index, L)), vtype = GRB.INTEGER, name = 'x_ikj')
model1.addConstrs(gp.quicksum(x_ikj[i, k, j]
for (k, j) in N_i[i]) >= theta[i] for i in I.index)
你有什么想法我该如何解决这样的问题吗?
首先,您将 x_ikj 的索引元组定义为 (i, (k, j)) 而不是 (i, k, j)。事实上,
itertools.product
是不必要的,因为 gurobipy.Model.addVars() 会为您进行叉积。所以简单的解决办法就是写:
x_ikj = model1.addVars(I.index, L, vtype = GRB.INTEGER, name = 'x_ikj')
此外,看起来您正在将 Pandas DataFrame(对于 I)与 Python 内置数据类型(对于 L)混合在一起。这并不常见;人们通常选择一种数据类型或另一种。