この最適化問題の主な課題は、性質上数学的な問題です。
あなたの目標は、gen_abc
メソッドの定義から推測できるように、さまざまな変数($a
、$b
など)の境界間隔を見つけることによって検索スペースを削減することです。)
は
最善の戦略はtrial-)、linear programming技術を使用して境界を(推測しようとする試みは、網羅(または非決定論を進め、下記参照)制約のあなたの完全なセットからできるだけ多くリニア制約を抽出することですプルーニングされた変数空間に対するエラーとエラーのテスト
典型的なlinear programming problemの形式は次のとおりです。
例えば
minimize (maximize) <something>
subject to <constraints>
、三つの変数、a
、b
とc
、および以下の線形制約与えられた:
<<linear_constraints>>::
$a < $b
$b > $c
$a > 0
$c < 30
あなたは、上側見つけることができますし、 $a
の下限、$b
および$c
の下限:
lower_bound_$a = minimize $a subject to <<linear_constraints>>
upper_bound_$a = maximize $a subject to <<linear_constraints>>
lower_bound_$b = minimize $b subject to <<linear_constraints>>
upper_bound_$b = maximize $b subject to <<linear_constraints>>
lower_bound_$c = minimize $c subject to <<linear_constraints>>
upper_bound_$c = maximize $c subject to <<linear_constraints>>
この場合、Math::LPを使用することができます。
例
線形制約が
におそらく等しい定数、...ているすべての移動不等式の左側の変数(係数を持つ)と不等式の右側の孤立定数:
$a - $b < 0
$b - $c > 0
$a > 0
$c < 30
...と(私たちの変数に対する離散すなわち整数値を仮定して)使用されているだけ=
、<=
と>=
等式(中)となるような制約を調整します
- 「... < Cは」」になります。 .. < = C-1'
- '...> C' となる」...> = C + 1'
...つまり、
$a - $b <= -1
$b - $c >= 1
$a >= 1
$c <= 29
...そして、このような何か書く:もちろん
use Math::LP qw(:types); # imports optimization types
use Math::LP::Constraint qw(:types); # imports constraint types
my $lp = new Math::LP;
my $a = new Math::LP::Variable(name => 'a');
my $b = new Math::LP::Variable(name => 'b');
my $c = new Math::LP::Variable(name => 'c');
my $constr1 = new Math::LP::Constraint(
lhs => make Math::LP::LinearCombination($a, 1, $b, -1), # 1*$a -1*$b
rhs => -1,
type => $LE,
);
$lp->add_constraint($constr1);
my $constr2 = new Math::LP::Constraint(
lhs => make Math::LP::LinearCombination($b, 1, $c, -1), # 1*$b -1*$c
rhs => 1,
type => $GE,
);
$lp->add_constraint($constr2);
...
my $obj_fn_a = make Math::LP::LinearCombination($a,1);
my $min_a = $lp->minimize_for($obj_fn_a);
my $max_a = $lp->maximize_for($obj_fn_a);
my $obj_fn_b = make Math::LP::LinearCombination($b,1);
my $min_b = $lp->minimize_for($obj_fn_b);
my $max_b = $lp->maximize_for($obj_fn_b);
...
# do exhaustive search over ranges for $a, $b, $c
を、上記のいずれかと、変数V1
、V2
、...(例えば$a
、$b
、$c
、$d
、...)の任意の数に一般化することができます制約式を解析して(例えば、-1,1,0,123など)、任意の定数値C
(たとえば、-1,130,29など)を指定すると、C1
、C2
、...対応する行列表現:
V1 V2 V3 C
[ C11 C12 C13 <=> C1 ]
[ C21 C22 C23 <=> C2 ]
[ C31 C32 C33 <=> C3 ]
... ... ... ... ... ...
あなたが提供した例に適用
、サイドノートとして
$a $b $c C
[ 1 -1 0 <= -1 ] <= plug this into a Constraint + LinearCombination
[ 0 1 -1 >= 1 ] <= plug this into a Constraint + LinearCombination
[ 1 0 0 >= 1 ] <= plug this into a Constraint + LinearCombination
[ 0 0 1 <= 29 ] <= plug this into a Constraint + LinearCombination
NOTE
、非決定論的(rand
ベース)のテストを行うことは、それはまたはであってもなくてもよい場合トラックを維持することをお勧めします(例:それらを再度テストを避けるために($a,$b,$c)
タプルはすでに、テストされているのハッシュ)で、と場合にのみ、次の場合にテストされている
- 方法は、ハッシュ・ルックアップよりも高価である(これはそうではありません
- ハッシュは膨大な割合にはなりません(すべての変数は有限の間隔でバインドされていますが、その製品は妥当な数である - つまり、実際のコードでは問題ありません)。どのケースがハッシュサイズをチェックするかは、スペース全体を完全に調査したかどうかを示すことができます。あるいは、ハッシュを定期的にクリアすることができます。
- 最終的には、上記のことが当てはまる場合は、さまざまな実装オプション(ハッシュの有無にかかわらず)を実行し、実装する価値があるかどうかを確認できます。私はData::Constraintを使用
この問題の主な課題は数学的性質です。あなたの目標は、$ a、$ cなどの値の値の間隔を見つけて、$ cなどの従属変数の境界間隔を計算することによって、検索スペースを削減することです。 – vladr