如何使用Python API为Gurobi定义多个索引,其中索引具有不同的数据类型并且相互依赖?

问题描述 投票:0回答:1

我对 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}

我必须定义以下目标函数和约束:

enter image description here

我尝试以不同的方式做类似的事情,但没有成功。

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)

你有什么想法我该如何解决这样的问题吗?

python python-3.x linear-programming gurobi
1个回答
0
投票

首先,您将 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)混合在一起。这并不常见;人们通常选择一种数据类型或另一种。

© www.soinside.com 2019 - 2024. All rights reserved.