2013-03-17 5 views
5

は、ここに私の完全な問題です。総投資額:$ 125私の変数のif条件をGLPKで書く方法はありますか?</p> <p><img src="https://i.stack.imgur.com/AZKEg.png" alt="enter image description here"></p> <p>情報:</p> <p>*マックス

は*ペイ・オフは、購入単位の合計であるXペイオフ/単位

*投資あたりの費用:バイインコスト+単位のコスト/単位x個あなたはで購入した場合少なくとも一つのユニット

*コストは投資ごとのコストの合計

制約です:

*あなたは2と5

の両方に投資しないことがあり* Yあなたが2と3のうち少なくとも1つを投資する場合に限り、1に投資することができます。

※3,4,5のうち少なくとも2つを投資しなければなりません。

※最大数以上の投資はできません。

問題:利益を最大化: - :私は私のように私を宣言し

yi=1 if xi>0 else yi=0 and i ∈ {1,2,3,4,5} 

このバイナリ変数yを持つ例えば

支払うオフはここで

xi: # of units i ∈ {1,2,3,4,5} 
yi=1 if xi>0 else yi=0 
cost = sum{i in I} buyInCost_i * yi + cost-unit_i*xi 
pay-off = sum{i in I} (pay-off/unit)_i*xi 
profit = pay-off - cost 

Maximize profit 

Subject to 

y2+y5 <= 1 
y1<= y2+y3 
y3+y4+y5 >= 2 
x1<=5, x2<=4, x3<=5, x4<=7, x5<=3 
cost<=125 

は私の質問であるコストデータセット

set I; 

data; 

set I := 1 2 3 4 5; 

glpkのy変数にelse条件を追加する方法は分かりません。私を助けてもらえますか?

マイモデリング:

set I; 

/*if x[i]>0 y[i]=1 else y[i]=0 ?????*/ 
var y{i in I}, binary; 

param a{i in I}; 
/* buy-in cost of investment i */ 

param b{i in I}; 
/* cost per unit of investment i */ 

param c{i in I}; 
/* pay-off per unit of investment i */ 

param d{i in I}; 
/* max number of units of investment i */ 

var x{i in I} >=0; 
/* Number of units that is bought of investment i */ 

var po := sum{i in I} c[i]*x[i]; 

var cost := sum{i in I} a[i]*y[i] + b[i]*x[i]; 

maximize profit: po-cost; 

s.t. c1: y[2]+y[5]<=1; 
s.t. c2: y[1]<y[2]+y[3]; 
s.t. c3: y[3]+y[4]+y[5]>=2; 
s.t. c4: x[1]<=5 
    x[2]<=4 
    x[3]<=5 
    x[4]<=7 
    x[5]<=3; 

s.t. c5: cost <=125; 
s.t. c6{i in I}: M * y[i] > x[i]; // if condition of y[i] 

set I := 1 2 3 4 5; 
param a := 
1 25 
2 35 
3 28 
4 20 
5 40; 

param b := 
1 5 
2 7 
3 6 
4 4 
5 8; 

param c := 
1 15 
2 25 
3 17 
4 13 
5 18; 

param d := 
1 5 
2 4 
3 5 
4 7 
5 3; 

param M := 10000; 

私はこの構文エラー取得しています:

 problem.mod:21: syntax error in variable statement 
     Context: ...I } ; param d { i in I } ; var x { i in I } >= 0 ; var po := 
     MathProg model processing error 
+0

x_iとは何ですか?それは連続変数、整数変数、またはバイナリ変数か、それとも入力データですか? – raoulcousins

+0

xiは購入されたi製品の数です。これらの値は、プログラムによって最適化されていなければなりません。 –

+0

あなたの答えはここにあると思いますが、私はGLPKを一度も使用していません:http://en.wikibooks.org/wiki/GLPK/GMPL_Workarounds – raoulcousins

答えて

8

をあなたは直接「直接」でif制約を記述する方法はありません(それを行うことはできませんLP)。

ただし、これには対処方法があります。 たとえば、あなたが書くことができます:

Mが大きい定数( xiの任意の値よりも大きい)である
M * yi > xi 

を。

この方法:(Mが十分に大きい場合)

  • xi > 0場合、制約はyi > 0と同等であるが、それは、yiのでyi == 1がバイナリです。
  • xi == 0の場合、制約は常に検証され、yiで目的が増加しており、最小化しているので、yi0と等しくなります。

どちらの場合でも、制約はifテストと同等です。

+0

ありがとう、Nicholas。私は自分のコードを走らせましたが、私にこの構文エラーがあり、私はそれを理解できません。私を助けてもらえますか?モデリングと構文エラーで私の質問を編集しました。 –

+0

あなたのモデリング言語はわかりません。しかし、あなたの宣言 'var {x in I}> = 0;'は正しくないようです。もっと良い方法があるかもしれませんが、変数を他の変数 'var {x in I}} 'として宣言し、他の制約のように' x [i]> = 0'を追加することをお勧めします「i」ごとに)。これがうまくいかない場合は、あなたのモデルにシンタックスエラーに関する別の質問を投稿することをお勧めします。あなたは助けを得るでしょう(答えを受け入れたので、今この質問を見る機会はほとんどありません)。 –

+0

また、別の質問を追加する場合は、使用する特定のモデリング言語のタグを追加する必要があります(私の場合は 'ampl'のように見えますが、わかりません。 。 'glpk'は実際には 'コア' lpソルバーです。これは' glpsol'などのスタンドアロンプ​​ログラムで使用できます。それは 'C'ライブラリでもあるので、' glpk'のタグ付けはちょっと誤解を招いています(あなたの問題はソルバー自体よりもモデリング言語のほうが多いようです)。 –

関連する問題

 関連する問題