質問

Python2.5を使用しています。

cobyla 最適化に境界を渡しています。

import numpy 
from numpy import asarray

Initial = numpy.asarray [2, 4, 5, 3]       # Initial values to start with

#bounding limits (lower,upper) - for visualizing

#bounds = [(1, 5000), (1, 6000), (2, 100000), (1, 50000)] 

# actual passed bounds

b1 = lambda  x: 5000 - x[0]      # lambda x: bounds[0][1] - Initial[0]

b2 = lambda  x: x[0] - 2.0       # lambda x: Initial[0] - bounds[0][0]

b3 = lambda  x: 6000 - x[1]      # same as above

b4 = lambda  x: x[1] - 4.0

b5 = lambda  x: 100000 - x[2]

b6 = lambda  x: x[2] - 5.0

b7 = lambda  x: 50000 - x[3]

b8 = lambda  x: x[3] - 3.0

b9 = lambda  x: x[2] >  x[3]  # very important condition for my problem!


opt= optimize.fmin_cobyla(func,Initial,cons=[b1,b2,b3,b4,b5,b6,b7,b8,b9,b10],maxfun=1500000)

初期値に基づく Initial そしてその範囲内で/その範囲内で b1b10 値はに渡されます opt(). 。しかし、特に b9. 。これは私の問題にとって非常に重要な境界条件です。

「の価値 x[2] 私の関数に渡されました opt() すべての反復で常により大きくなければなりません x[3]" -- どうすればこれを達成できるでしょうか?

私の範囲内に何か問題があるのでしょうか (b1b9) 意味 ?

それとも、境界を定義するより良い方法はあるのでしょうか?

私を助けてください。

役に立ちましたか?

解決

fmin_cobyla() は内点法ではありません。つまり、最適化の実行中に、境界外の点 (「実行不可能な点」) を関数に渡します。

修正する必要があるのは、 b9 そして b10 という形ではない fmin_cobyla() 期待しています。境界関数は、境界内にある場合は正の数を、境界内にある場合は 0.0 を、境界外にある場合は負の数を返す必要があります。理想的には、これらの機能はスムーズである必要があります。 fmin_cobyla() は、実行可能領域に戻る方法を知らせるために、これらの関数の数値導関数を取得しようとします。

b9 = lambda x: x[2] - x[3]

実装方法がわかりません b10 そういう意味で fmin_cobyla() ただし、使用できるようになります。

他のヒント

b10 の場合、考えられるオプションは次のとおりです。

b10 = lambda x: min(abs(i-j)-d for i,j in itertools.combinations(x,2))

どこ d 変数間に必要な最小差より大きいデルタ (例: 0.001)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top