2017-01-23 21 views
1

私は基本的に入力データファイルに基づいた決定変数の長いリストを持っています。ただし、便宜上、以下の例を使用してみましょう: 私は自分のモデルに決定変数を追加しています。これらの決定変数はそれぞれ0と1の間に制限されています。私は次のようでした(*マイリストは私のプログラムでデータフレームの列であるので、私はshape[0]を使用)不一致の引数CPLEXエラーPython API

model.variables.add(obj=mylist, ub=list(np.ones((1, mylist.shape[0])))), types=[model.variables.type.continuous] * len(mylist)) 

私はPythonのAPIは、モデル構築を定義する方法を誤解しているかもしれません。私はCPLEXエラーが発生します:不一致の引数。私はubが私にこの問題を与えていると思っています。 ubを正しく設定するにはどうすればよいですか?そして、model.variables.add関数のcolumns引数は何を参照していますか?

答えて

1

引数は、obj引数のサイズと同じサイズのシーケンスである必要があります。だから、むしろub=list(np.ones((1, mylist.shape[0]))))よりも、あなたはub=[1.0]*len(mylist)ub=np.ones(len(mylist))を、使用したいと思いなど

columns引数は、列単位ではなく、行方向(後には正常になり、制約行列に非ゼロを追加することができますCplex.linear_constraints.addメソッドを介して行われます)。 columns引数で何が起こっているのかを理解する1つの方法は、ドキュメントからexampleを見ることです。例えば

import cplex 
c = cplex.Cplex() 
c.linear_constraints.add(names = ["c0", "c1", "c2"]) 
c.variables.add(obj = [1.0, 2.0, 3.0], 
       types = [c.variables.type.integer] * 3) 
c.variables.add(obj = [1.0, 2.0, 3.0], 
       lb = [-1.0, 1.0, 0.0], 
       ub = [100.0, cplex.infinity, cplex.infinity], 
       types = [c.variables.type.integer] * 3, 
       names = ["var0", "var1", "var2"], 
       columns = [cplex.SparsePair(ind = ['c0', 2], val = [1.0, -1.0]), 
          [['c2'],[2.0]], 
          cplex.SparsePair(ind = [0, 1], val = [3.0, 4.0])]) 

c.write("example.lp") 

ことを実行した後、LPファイルは次のようになります。

Minimize 
obj: x1 + 2 x2 + 3 x3 + var0 + 2 var1 + 3 var3 
Subject To 
c0: var0 + 3 var3 = 0 
c1: 4 var3 = 0 
c2: - var0 + 2 var1 = 0 
Bounds 
     x1 >= 0 
     x2 >= 0 
     x3 >= 0 
-1 <= var0 <= 100 
     var1 >= 1 
     var3 >= 0 
Generals 
x1 x2 x3 var0 var1 var3 
End 

あなたは(制約 "C0")を制約行列の最初の行を見れば、最初の列(変数 "var0")の係数は1.0です。 3行目(インデックス2の制約「c2」)では、最初の列(変数「var0」)の係数は-1.0です。これは、columnsリストの最初の項目に相当します(つまり、cplex.SparsePair(ind = ['c0', 2], val = [1.0, -1.0]))。

+0

説明をいただきありがとうございます!私はゆっくりとAPIに慣れています。 –

0

マイナーチェンジはub=list(np.ones(mylist.shape[0]))で、エラーは発生しませんでした。 model.variables.get_upper_bounds()を使用して境界を確認した後、すべてが正常に見えます。

+0

これはコメントではなく、回答である必要があります([ここ](http://meta.stackexchange.com/questions/23211/how-do-i-add-a-comment-to-an参照)。 -回答))。 – rkersh

+0

私にお知らせいただきありがとうございます! :) –