2016-12-06 11 views
0

50個の変数を持つ関数の戻り値を最大にしたい。多くのパラメータに対してscipy最適化ライブラリを使用する

def function_to_maximize: 
    return (7.9*a1 + 8.1*a2 + 0.4*a3 + ........ + 2.6*a50) 

私の変数が0 < = < = 10であり、私の変数の和は

100は、残念ながら私は、タスクのこの種に精通していないよです。グーグルでは、私はこのdocumantationを使って仕事を終わらせることができることを知りましたが、ライブラリの使い方を理解できませんでした。

サンプルコードに簡単なコメントを入力して、適用する必要がある手順を教えてください。

+0

いくつかの変数で試しましたか?ハードルは何でしたか? – Benjamin

+0

@ベンジャミンまず第一に私は最大化をしたいが、ドキュメンテーションは最小化について語っている。最大値を見つけるには、トリックが必要です。また、ヘッダー、アルゴリズムがたくさんあります。私はどちらが正しいかわからない。関数を最小限に抑えるには、それらは異なる実装ですか? – anilca

+1

はい、それらは異なるアルゴリズムです。サポート制約によってはサポートされていないものがあります。一般的な最小化関数をとると、scipyは自動的に1を選択します。ドキュメントと例を確認してください。あなたの問題は簡単です。 max(7 * a1 + 8 * a2)== min(-7 * a1 -8 * a2)を覚えておいてください。 **編集:**ここでの最善のアプローチは、リニアプログラミング(一般的に最良のソルバーで最も制限されたアプローチです)を使用することです。 scipyにはlinprogがありますが、それは悪いです。しかし、それを試してみてください! – sascha

答えて

0

のラッパーを使用して、これは実装が非常に簡単になります。だから私はそれを試してみることをお勧めしますので、私を許してください。ここでドキュメントを見つけることができます:http://symfit.readthedocs.io/en/latest/fitting_types.html#minimize-maximize

あなたの場合、私は次のようにします:

from symfit import parameters, Maximize, Equality 

# Make your 50 parameters to optimize and their coefficients. 
aN = parameters(', '.join('a{}'.format(i) for i in range(1, 51))) 
coeff = [7.9, 8.1, ..., 2.6] 

model = sum(coeff_i * a_i for a_i, coeff_i in zip(aN, coeff)) 
fit = Maximize(model, constraints=[Equality(sum(aN), 100)]) 
fit_result = fit.execute() 

完了!

p.s.私はこれが未決定の方程式系であることを心配していますか?しかしそれはあなたが心配することです:)。

+0

ありがとうございます。 SciPyコードも役に立ちました。 – anilca

関連する問題