इस अनुकूलन समस्या में मुख्य चुनौती प्रकृति में गणितीय है।
अपने लक्ष्य, जैसा कि मैंने gen_abc
विधि की अपनी परिभाषा से अनुमान लगा सकते हैं, अपने विभिन्न चर ($a
, $b
आदि के लिए बाउंडिंग अंतराल का पता लगाकर अपनी खोज को अंतरिक्ष छँटाई करने के लिए है)
सबसे अच्छी रणनीति की कमी के लिए अपना पूरा सेट से के रूप में कई रैखिक बाधाओं को निकालने के लिए है, सीमा (linear programming तकनीक का उपयोग का अनुमान लगाने के प्रयास, नीचे देखें), तो संपूर्ण (या गैर नियतात्मक के साथ आगे बढ़ना) trial- और एक छिद्रित चर अंतरिक्ष के खिलाफ त्रुटि परीक्षण।
एक ठेठ 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 नियोजित कर सकते हैं।
उदाहरण
एक रेखीय बाधा फार्म "C eqop C1×$V1 ± C2×$V2 ± C3×$V3 ...
", जहाँ
eqop
<
में से एक, >
, ==
, >=
है की है, <=
$V1
, $V2
आदि चर रहे हैं, और
C
, C1
, C2
आदि स्थिरांक, संभवतः 0.
उदाहरण के लिए, दिए गए के बराबर ...
$a < $b
$b > $c
$a > 0
$c < 30
... सभी को स्थानांतरित कर रहे हैं असमानता के बावजूद चर (उनके गुणांक के साथ), और असमानता के दाईं ओर एकमात्र स्थिरांक:
$a - $b < 0
$b - $c > 0
$a > 0
$c < 30
... और इसलिए है कि केवल =
, <=
और >=
(में) समानताओं उपयोग किया जाता है (हमारे चर के लिए यह सोचते हैं असतत यानी पूर्णांक मान) की कमी को समायोजित:
- '... < सी' हो जाय। ' .. < = सी -1 '
- ' ...> सी 'बन जाता है' ...> = सी + 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
, ...) के किसी भी संख्या के लिए सामान्यीकृत किया जा सकता किसी के साथ गुणांक C1
, C2
, ... (उदाहरण -1, 1, 0, 123, आदि) और किसी निरंतर मान C
(उदाहरण -1, 1, 30, 2 9, आदि) बशर्ते आप बाधाओं को अभिव्यक्तियों में पार्स कर सकें संबंधित मैट्रिक्स प्रतिनिधित्व जैसे:
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
नोट
एक तरफ ध्यान दें के रूप में, यदि गैर नियतात्मक (rand
आधारित) परीक्षण प्रदर्शन, यह या नहीं हो सकता ट्रैक रखने के लिए एक अच्छा विचार (उदाहरण के लिए एक हैश) जिनमें से ($a,$b,$c)
tuples पहले से ही परीक्षण किया गया है के रूप में उन्हें फिर से परीक्षण से बचने के लिए, तभी यदि:
- विधि परीक्षण किया जा रहा एक हैश देखने से ज्यादा महंगा है (यह स्थिति नहीं है आपके द्वारा प्रदान किए गए नमूना कोड के साथ, लेकिन आपके असली कोड के साथ कोई समस्या हो सकती है या नहीं)
- हैश भारी अनुपात में नहीं बढ़ेगा (या तो सभी चर सीमित अंतराल से बंधे हैं, जिनका उत्पाद उचित संख्या है - इन हैश आकार की जांच करने वाला कौन सा मामला इंगित कर सकता है कि आपने पूरी जगह पूरी तरह से खोज ली है या नहीं, या आप समय-समय पर हैश को साफ़ कर सकते हैं ताकि कम से कम एक बार अंतराल के लिए आपके पास कुछ टकराव हो ection।)
- आखिरकार, अगर आपको लगता है कि उपरोक्त आप पर लागू हो सकता है, तो आप कई कार्यान्वयन विकल्पों (हैश के साथ और बिना) समय देख सकते हैं और देख सकते हैं कि यह लागू करने योग्य है या नहीं।
इस समस्या में मुख्य चुनौती प्रकृति में गणितीय है। आपका लक्ष्य $ ए, $ सी जैसे मानों के लिए मूल्य अंतराल को ढूंढकर अपनी खोज स्थान को छीनना है, फिर निर्भर सी चर के लिए बाध्यकारी अंतराल की गणना करना जैसे कि $ c। – vladr