2016-09-30 36 views
0

私はこの問題を昨日から苦労しています。私は自分の最適化モデルにproc optmodelを使用しています。私は自分の変数に条件を持っています。私は、変数A1とA2にあり、A1でもあるので、制約がSASのoptmodel変数の条件

A1 = A2 if A1<0 

A1 >= A2 if A1>0 

ているよう変数SASは私が私の制約で条件を置くことはできません。

var A1[C_C]; 
var A1[C_C]; 

Con test {<C1,C2> in C_C: A1[C1,C2]<0}: 
A2 [C1,C2] =A1[C1,C2]; 

Con test {<C1,C2> in C_C: A1[C1,C2]>0}: 
A2[C1,C2] <= A1[C1,C2]; 

と私は、この後に取得するエラーは、次のとおりです:私はこれをやっている「変数は、式の中で使用することはできません」 誰もがこのことについて考えを持っています。私はすでに多くを検索しましたが、何も見つかりませんでした。

+0

これは、問題を非線形に(そして多少厄介な形で、微分不可能に)します。いくつかの努力を払って、バイナリ変数の追加によってこれを線形にすることは可能です。次に、混合整数計画ソルバを使用する必要があります。 –

+0

私は2行目が 'var A2 [C_C]'だと思います。また、制約ラベル 'test'を繰り返すこともできません。 – Leo

+0

完全な答えを出すには、もう少し文脈が必要です。 A1とA2は目的にどのように貢献するのですか?あなたはA1かA2の境界を持っていますか?たとえば、 'num a1_lb { in C_C} 'の式を書いたり、データを読み込んだりできますか?非線形性を避けるには、おそらくbigMまたはreify述部が必要です。 – Leo

答えて

0

あなたはこれをより簡単に行うことができるようですか?

proc optmodel; 
    var a1,a2; 
    con test: a1 ge a2; 
    con test1: a1 eq if a1 < 0 then a2 else a1; 
quit; 

私はそれより良い解決策があると思うが、それはうまくいくようだ。

+0

Joe、ありがとうございました。 IFELASEで変数を使用できるかどうかはわかりませんでした。 SASは制約条件式の条件式にSASを使用できないため、テストします。もう一つの懸念事項は、a1が負の-3-a2 <= -3、次にa2 <= a2であるが、a2が既に-3より小さく、 3。 – AFDOONE

+0

私はこの方法をテストしましたが、これらの制約が非線形であるというエラーが発生しました。実際に私のモデルは線形で、私はLPソルバーを使用しています。 – AFDOONE

+0

あなたの制約は正当なものですか?それらは非線形であると私は考える。 – Joe