Python纸浆与矩阵一起使用

use*_*803 13 python mathematical-optimization linear-programming pulp

经过数年和多年的Matlab,我仍然是Python的新手.我正在尝试使用Pulp来设置整数线性程序.

鉴于一系列数字:

{P[i]:i=1...N}
Run Code Online (Sandbox Code Playgroud)

我想最大化:

sum( x_i P_i )
Run Code Online (Sandbox Code Playgroud)

受限制

A x <= b
A_eq x = b_eq
Run Code Online (Sandbox Code Playgroud)

和边界(基于矢量的边界)

LB <= x <= UB
Run Code Online (Sandbox Code Playgroud)

然而,在纸浆中,我没有看到如何正确地进行矢量声明.我用的是:

RANGE = range(numpy.size(P))
x = pulp.LpVariable.dicts("x", LB_ind, UB_ind, "Integer")
Run Code Online (Sandbox Code Playgroud)

我只能输入个别边界(所以只有1个数字).

prob = pulp.LpProblem("Test", pulp.LpMaximize)
prob += pulp.lpSum([Prices[i]*Dispatch[i] for i in RANGE])
Run Code Online (Sandbox Code Playgroud)

对于约束,我真的必须每行做这行吗?似乎我错过了一些东西.我将不胜感激.文档讨论了一个简短的例子.在我的情况下,变量的数量是几千.

Dav*_*hme 8

您可以在初始化后在变量上设置 lowBound 和 upBound。您可以创建一个变量数组

LB[i] <= x[i] <= UB[i]
Run Code Online (Sandbox Code Playgroud)

使用以下代码。

x = pulp.LpVariable.dicts("x", RANGE,  cat="Integer")
for i in x.viewkeys():
     x[i].lowBound = LB_ind[i]
     x[i].upBound = UB_ind[i]
Run Code Online (Sandbox Code Playgroud)

LpVariable.dict 的第二个参数是决策变量的索引集,而不是它们的下限。