18

何年も何年もMatlabを使用した後、私はまだPythonに非常に慣れていません。Pulp を使用して整数線形プログラムをセットアップしようとしています。

数値の配列が与えられた場合:

{P[i]:i=1...N}

私は最大化したい:

sum( x_i P_i )

制約を受ける

A x <= b
A_eq x = b_eq

および境界あり (ベクトルベースの境界)

LB <= x <= UB

しかし、パルプでは、ベクトル宣言を適切に行う方法がわかりません。私が使用していた:

RANGE = range(numpy.size(P))
x = pulp.LpVariable.dicts("x", LB_ind, UB_ind, "Integer")

ここでは、個々の境界のみを入力できます (したがって、1 つの数値のみ)。

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

制約については、本当にこの行を行ごとに実行する必要がありますか? 何かが足りないようです。助けていただければ幸いです。ドキュメントでは、短い例について説明しています。私の場合、変数の数は数千です。

4

2 に答える 2

8

初期化後に変数に lowBound と upBound を設定できます。で変数の配列を作成できます

LB[i] <= x[i] <= UB[i]

次のコードで。

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]

LpVariable.dict の 2 番目のパラメーターは、決定変数のインデックス セットであり、下限ではありません。

于 2012-04-06T04:58:44.053 に答える
3

最初の質問については、他の問題でこのように行うことができます。

students = range(96)
group = range(24)

var = lp.LpVariable.dicts("if_i_in_group_j", ((i, j) for i in students for j in group),cat='binary')
于 2018-03-15T05:10:09.577 に答える