1

Python 2.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]」 -- これを達成するにはどうすればよいですか?

b1私の境界 (からb9) 定義に何か問題がありますか?

または、境界を定義するより良い方法はありますか?

私を助けてください。

4

2 に答える 2

3

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

修正する必要があるのは、期待どおりの形式ではないということb9です。バインドされた関数は、範囲内にある場合は正の数を返し、範囲内にある場合は 0.0 を返し、範囲外の場合は負の数を返す必要があります。理想的には、これらの関数は滑らかであるべきです。実行可能領域に戻る方法を知るために、これらの関数の数値導関数を取得しようとします。b10fmin_cobyla()fmin_cobyla()

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

ただし、使用できる方法で実装b10する方法はわかりません。fmin_cobyla()

于 2009-08-26T19:17:25.523 に答える
2

b10 の場合、可能なオプションは次のとおりです。

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

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

于 2009-08-27T18:05:36.817 に答える