2017-11-21 4 views
0

2つの値を入力として受け取り、2つ目の関数を介して2つの値の「組み合わせ」を返す関数があります(簡略化のため、f2は入力値の合計を返します)。 Pythonでそれは:今、in1in2は時間ポイントに関連付けられているマルチプル入力値による再帰

f1 (in1, in2): 
    return f2(in1,in2) 

f2 (in1, in2): 
    return in1 + in2 

in1は、0,1および2の3つの値をとることができます。 私がしたいのは、n=4の時点を "先読み"し、最も高い戻り値を与えるin1値の最良のシーケンスを特定することです。 はそれでは、最初にin2を言わせて、私が行うために必要なもの10で評価される:

a = f1(0, 10) 
b = f1(1, 10) 
c = f1(2, 10) 

その後、私はIN1の可能な値でそれを評価する必要が取得したすべての結果のために:

a0 = f1(0, a); a1 = f1(1, a); a2 = f1(2, a) 
b0 = f1(0, b); b1 = f1(1, b); b2 = f1(2, b) 
c0 = f1(0, c); c1 = f1(1, c); c2 = f1(2, c) 

したがって、n回の繰り返しの後に停止し、入力の最適なシーケンスを特定します(この例では2 2 2 2になるため、10+12+14+16が最大値です)。 このインスタンスで再帰(深さ優先検索)を使用できますか?それをコード化する最良の方法は何ですか?ブルートフォースのアプローチは、ループのために4を入れ子にすることですが、どうすればn = 10

答えて

0

あなたが事前にf1とf2の数学的な性質を知っている場合は、(F1、F2はIN1とIN2に対して線形であれば、例えばパルプライブラリを使用して)、数学的プログラムとしてこれを定式化する必要があります。この問題は(IN1 = 2)簡単ですが、

from pulp import * 

model = LpProblem("Maximize f1", LpMaximize) 

in1 = LpVariable.dicts("in1", 0, 2, LpInteger) 
in2 = 10 

model += in1 + in2 # f1 and f2 combined 

model.solve() 

print(in1.varValue) 

:ここ

あなたがパルプを使用してモデル化し、CBCを使用して解決言及した例です。 f1またはf2の時間依存性を指定していないので、どのようにしてこの期間に入るかはわかりません。

f1とf2の形式がわからず、in1とin2に対して連続、滑らか、または凸であると仮定できない場合は、それを強制的に強制し、すべての(in1 、in2)の組み合わせ。深さ優先と幅優先は、それらを徹底的に計算するのに同じ時間がかかります。

+0

残念ながら、私は関数の数学的性質についての手掛かりはありません。 –

関連する問題