शाखा और कर्तन: Difference between revisions

From Vigyanwiki
(Created page with "शाखा और कट<ref>{{Cite journal|last=Padberg|first=Manfred|last2=Rinaldi|first2=Giovanni|date=1991|title=बड़े पैमाने पर सिमिट...")
 
(TEXT)
Line 1: Line 1:
शाखा और कट<ref>{{Cite journal|last=Padberg|first=Manfred|last2=Rinaldi|first2=Giovanni|date=1991|title=बड़े पैमाने पर सिमिट्रिक ट्रैवलिंग सेल्समैन की समस्याओं के समाधान के लिए एक ब्रांच-एंड-कट एल्गोरिद्म|journal=SIAM Review|language=en|volume=33|issue=1|pages=60–100|doi=10.1137/1033004|issn=0036-1445}}</ref> [[पूर्णांक]] रेखीय कार्यक्रमों (ILPs) को हल करने के लिए मिश्रित अनुकूलन की एक विधि है, अर्थात्, [[रैखिक प्रोग्रामिंग]] (LP) समस्याएँ जहाँ कुछ या सभी अज्ञात पूर्णांक मानों तक सीमित हैं।<ref>{{cite journal|last=John E.|first=Mitchell|title=कॉम्बिनेटरियल ऑप्टिमाइजेशन प्रॉब्लम्स के लिए ब्रांच-एंड-कट एल्गोरिदम|journal=Handbook of Applied Optimization|year=2002|pages=65–77|url=http://eaton.math.rpi.edu/faculty/Mitchell/papers/bc_hao.pdf}}</ref> ब्रांच और कट में एक [[शाखा और बंधन]] एल्गोरिथम चलाना और रैखिक प्रोग्रामिंग रिलैक्सेशन को कसने के लिए [[ काटने का विमान ]] का उपयोग करना शामिल है। ध्यान दें कि यदि कटौती केवल प्रारंभिक एलपी छूट को कसने के लिए उपयोग की जाती है, तो एल्गोरिदम को कट और शाखा कहा जाता है।
शाखा और कर्तन<ref>{{Cite journal|last=Padberg|first=Manfred|last2=Rinaldi|first2=Giovanni|date=1991|title=बड़े पैमाने पर सिमिट्रिक ट्रैवलिंग सेल्समैन की समस्याओं के समाधान के लिए एक ब्रांच-एंड-कट एल्गोरिद्म|journal=SIAM Review|language=en|volume=33|issue=1|pages=60–100|doi=10.1137/1033004|issn=0036-1445}}</ref> [[पूर्णांक]] रेखीय कार्यक्रमों (ILPs) को हल करने के लिए मिश्रित अनुकूलन की एक विधि है, अर्थात्, [[रैखिक प्रोग्रामिंग|रैखिक क्रमदेशन]] (LP) परिप्रश्नएँ जहाँ कुछ या सभी अज्ञात पूर्णांक मानों तक सीमित हैं।<ref>{{cite journal|last=John E.|first=Mitchell|title=कॉम्बिनेटरियल ऑप्टिमाइजेशन प्रॉब्लम्स के लिए ब्रांच-एंड-कट एल्गोरिदम|journal=Handbook of Applied Optimization|year=2002|pages=65–77|url=http://eaton.math.rpi.edu/faculty/Mitchell/papers/bc_hao.pdf}}</ref> ब्रांच और कर्तन में एक [[शाखा और बंधन]] कलन विधि चलाना और रैखिक क्रमदेशन शिथिलन को कसने के लिए [[ काटने का विमान |कर्तनतल]] का उपयोग करना सम्मिलित है। ध्यान दें कि यदि कर्तन केवल प्रारंभिक एलपी छूट को कसने के लिए उपयोग की जाती है, तो कलन विधि को कर्तन और शाखा कहा जाता है।


== एल्गोरिथम ==
== कलन विधि ==
यह विवरण मानता है कि आईएलपी एक अधिकतमकरण समस्या है।
यह विवरण मानता है कि आईएलपी एक अधिकतमकरण परिप्रश्न है।


विधि नियमित [[सिंप्लेक्स एल्गोरिदम]] का उपयोग करके [[रैखिक प्रोग्रामिंग छूट]] को हल करती है। जब एक इष्टतम समाधान प्राप्त किया जाता है, और इस समाधान में एक चर के लिए एक गैर-पूर्णांक मान होता है जिसे पूर्णांक माना जाता है, तो आगे की रैखिक बाधाओं को खोजने के लिए एक [[कटिंग-प्लेन विधि]] का उपयोग किया जा सकता है जो सभी व्यवहार्य समाधान पूर्णांक बिंदुओं से संतुष्ट हैं लेकिन उल्लंघन किया गया है वर्तमान आंशिक समाधान द्वारा। इन असमानताओं को रैखिक कार्यक्रम में जोड़ा जा सकता है, जैसे कि इसे हल करने से एक अलग समाधान निकलेगा जो उम्मीद से कम आंशिक है।
विधि नियमित [[सिंप्लेक्स एल्गोरिदम|प्रसमुच्चय कलन विधि]] का उपयोग करके [[रैखिक प्रोग्रामिंग छूट|रैखिक क्रमदेशन छूट]] को हल करती है। जब एक इष्टतम समाधान प्राप्त किया जाता है, और इस समाधान में एक चर के लिए एक गैर-पूर्णांक मान होता है जिसे पूर्णांक माना जाता है, तो आगे की रैखिक बाधाओं को खोजने के लिए एक [[कटिंग-प्लेन विधि|कर्तनतल विधि]] का उपयोग किया जा सकता है जो सभी व्यवहार्य समाधान पूर्णांक बिंदुओं से संतुष्ट हैं लेकिन वर्तमान आंशिक समाधान द्वारा उल्लंघन किया गया है। इन असमानताओं को रैखिक कार्यक्रम में जोड़ा जा सकता है, जैसे कि इसे हल करने से एक अलग समाधान निकलेगा जो उम्मीद से कम आंशिक है।


इस बिंदु पर, एल्गोरिथम की शाखा और बाध्य भाग प्रारंभ हो गया है। समस्या कई (आमतौर पर दो) संस्करणों में विभाजित है। नए रेखीय कार्यक्रमों को तब सरल विधि का उपयोग करके हल किया जाता है और प्रक्रिया दोहराती है। शाखा और बाध्य प्रक्रिया के दौरान, एलपी छूट के गैर-अभिन्न समाधान ऊपरी सीमा के रूप में कार्य करते हैं और अभिन्न समाधान निम्न सीमा के रूप में कार्य करते हैं। एक नोड [[ पेड़ की छंटाई खोजें ]] हो सकता है यदि एक ऊपरी सीमा मौजूदा निचली सीमा से कम है। इसके अलावा, एलपी छूटों को हल करते समय, अतिरिक्त कटिंग प्लेन उत्पन्न हो सकते हैं, जो या तो 'ग्लोबल कट्स' हो सकते हैं, यानी, सभी व्यवहार्य पूर्णांक समाधानों के लिए मान्य, या 'लोकल कट्स', जिसका अर्थ है कि वे सभी से संतुष्ट हैं वर्तमान में मानी जाने वाली शाखा और बाउंड सबट्री से साइड बाधाओं को पूरा करने वाले समाधान।
इस बिंदु पर, कलन विधि की शाखा और बाध्य भाग प्रारंभ हो गया है। परिप्रश्न कई (सामान्यतः दो) संस्करणों में विभाजित है। नए रेखीय कार्यक्रमों को तब सरल विधि का उपयोग करके हल किया जाता है और प्रक्रिया दोहराती है। शाखा और बाध्य प्रक्रिया के उपरान्त, एलपी छूट के गैर-अभिन्न समाधान ऊपरी सीमा के रूप में कार्य करते हैं और अभिन्न समाधान निम्न सीमा के रूप में कार्य करते हैं। एक पर्णग्रंथि [[ पेड़ की छंटाई खोजें |कृन्तन]] हो सकता है यदि एक ऊपरी सीमा वर्तमान निचली सीमा से कम है। इसके अतिरिक्त, एलपी छूटों को हल करते समय, अतिरिक्त कर्तनतल उत्पन्न हो सकते हैं, जो या तो 'सार्वभौम कर्तन' हो सकते हैं, यानी, सभी व्यवहार्य पूर्णांक समाधानों के लिए मान्य, या 'स्थानिक कर्तन', जिसका अर्थ है कि वे सभी से संतुष्ट हैं वर्तमान में मानी जाने वाली शाखा और संकुचित उपतरु से पृष्ठ बाधाओं को पूरा करने वाले समाधान है।


{{anchor|Algorithm summary}}एल्गोरिथ्म का सारांश नीचे दिया गया है।
कलन विधि का सारांश नीचे दिया गया है।


#प्रारंभिक ILP को इसमें जोड़ें <math>L</math>, सक्रिय समस्याओं की सूची
#प्रारंभिक ILP को <math>L</math> में जोड़ें, सक्रिय परिप्रश्न की सूची
#तय करना <math>x^* = \text{null}</math> और <math>v^* = -\infty</math>
#<math>x^* = \text{null}</math> और <math>v^* = -\infty</math> को सम्मुच्चय करना है।
#घुमाव के दौरान <math>L</math> खाली नहीं है
#घुमाव के उपरान्त <math>L</math> खाली नहीं है
## किसी समस्या को चुनें और हटाएं (डी-क्यू)। <math>L</math>
## <math>L</math>से एक परिप्रश्न का चयन करें और (डी-क्यू) निकालें
##समस्या की एलपी छूट को हल करें।
##परिप्रश्न की एलपी छूट को हल करें।
##यदि समाधान संभव नहीं है, तो 3 (जबकि) पर वापस जाएं। अन्यथा समाधान को निरूपित करें <math>x</math> उद्देश्य मूल्य के साथ <math>v</math>.
##यदि समाधान संभव नहीं है, तो 3 (जबकि) पर वापस जाएं। अन्यथा समाधान <math>x</math> उद्देश्य मूल्य के साथ <math>v</math> को निरूपित करें
##अगर <math>v\le v^*</math>, 3 पर वापस जाएँ।
##यदि <math>v\le v^*</math>, 3 पर वापस जाएँ।
##अगर <math>x</math> पूर्णांक है, सेट <math>v^*\leftarrow v, x^* \leftarrow x</math> और 3 पर वापस जाएँ।
##यदि <math>x</math> पूर्णांक है, सम्मुच्चय <math>v^*\leftarrow v, x^* \leftarrow x</math> और 3 पर वापस जाएँ।
##यदि वांछित हो, तो उल्लंघन करने वाले विमानों को काटने की तलाश करें <math>x</math>. यदि कोई पाया जाता है, तो उन्हें एलपी छूट में जोड़ें और 3.2 पर लौटें।
##यदि वांछित हो, तो उल्लंघन करने वाले तल <math>x</math> को काटने की तलाश करें। यदि कोई पाया जाता है, तो उन्हें एलपी छूट में जोड़ें और 3.2 पर लौटें।
##शाखा समस्या को सीमित व्यवहार्य क्षेत्रों के साथ नई समस्याओं में विभाजित करने के लिए। इन समस्याओं को जोड़ें <math>L</math> और 3 पर वापस जाएँ
##शाखा परिप्रश्न को सीमित व्यवहार्य क्षेत्रों के साथ नई परिप्रश्न में विभाजित करने के लिए इन परिप्रश्न को <math>L</math> में और 3 पर वापस जाएँ।
#वापस करना <math>x^*</math>
#<math>x^*</math> वापस करना




=== {{Anchor|Code}[[स्यूडोकोड]] ===
=== [[स्यूडोकोड]] ===
[[सी ++]] में - स्यूडोकोड की तरह, यह लिखा जा सकता है:
[[सी ++|C ++]] में - स्यूडोकोड की तरह, यह लिखा जा सकता है:


<वाक्यविन्यास प्रकाश लैंग = सी ++ लाइन = 1>
<वाक्यविन्यास प्रकाश लैंग = सी ++ लाइन = 1>
// ILP शाखा और कट समाधान स्यूडोकोड, यह मानते हुए कि उद्देश्य को अधिकतम किया जाना है
// ILP शाखा और कर्तन समाधान स्यूडोकोड, यह मानते हुए कि उद्देश्य को अधिकतम किया जाना है
 
ILP_solution Branch_and_cut_ILP(IntegerLinearProgram initial_problem) {
ILP_solution Branch_and_cut_ILP(IntegerLinearProgram initial_problem) {
    कतार सक्रिय_सूची; // एल, ऊपर
// ILP branch and cut solution pseudocode, assuming objective is to be maximized
    active_list.enqueue (प्रारंभिक_समस्या); // स्टेप 1
ILP_solution branch_and_cut_ILP(IntegerLinearProgram initial_problem) {
    // चरण दो
    queue active_list; // L, above
    आईएलपी_समाधान इष्टतम_समाधान; // यह x* को ऊपर रखेगा
    active_list.enqueue(initial_problem); // step 1
    डबल best_objective = -std::numeric_limits<double>::infinity; // ऊपर v* को होल्ड करेगा
    // step 2
    जबकि (!active_list.empty()) { // चरण 3 ऊपर
    ILP_solution optimal_solution; // this will hold x* above
        लीनियरप्रोग्राम और curr_prob = active_list.dequeue (); // चरण 3.1
    double best_objective = -std::numeric_limits<double>::infinity; // will hold v* above
        करना { // चरण 3.2-3.7
    while (!active_list.empty()) { // step 3 above
            रिलैक्स्ड लीनियर प्रोग्राम और रिलैक्स_प्रोब = एलपी_रिलैक्स (कर_प्रोब); // चरण 3.2
        LinearProgram& curr_prob = active_list.dequeue(); // step 3.1
            LP_solution curr_relaxed_soln = LP_solve(relaxed_prob); // यह x ऊपर है
        do { // steps 3.2-3.7
            बूल कटिंग_प्लेन_फाउंड = झूठा;
            RelaxedLinearProgram& relaxed_prob = LP_relax(curr_prob); // step 3.2
            अगर (!curr_relaxed_soln.is_feasible()) { // चरण 3.3
            LP_solution curr_relaxed_soln = LP_solve(relaxed_prob); // this is x above
                जारी रखना; // अन्य समाधान का प्रयास करें; चरण 3 पर जारी है
            bool cutting_planes_found = false;
            }
            if (!curr_relaxed_soln.is_feasible()) { // step 3.3
            डबल current_objective_value = curr_relaxed_soln.value (); // वी ऊपर
                continue; // try another solution; continues at step 3
            अगर (current_objective_value <= best_objective) { // चरण 3.4
            }
                जारी रखना; // अन्य समाधान का प्रयास करें; चरण 3 पर जारी है
            double current_objective_value = curr_relaxed_soln.value(); // v above
            }
            if (current_objective_value <= best_objective) { // step 3.4
            अगर (curr_relaxed_soln.is_integer ()) {// चरण 3.5
                continue; // try another solution; continues at step 3
                best_objective = current_objective_value;
            }
                इष्टतम समाधान = Cast_as_ILP_solution (curr_relaxed_soln);
            if (curr_relaxed_soln.is_integer()) { // step 3.5
                जारी रखना; // चरण 3 पर जारी है
                best_objective = current_objective_value;
            }
                optimal_solution = cast_as_ILP_solution(curr_relaxed_soln);
            // वर्तमान आराम समाधान अभिन्न नहीं है
                continue; // continues at step 3
            अगर (हंटिंग_फॉर_कटिंग_प्लेन) {// चरण 3.6
            }
                उल्लंघन_कटिंग_प्लेन = search_for_violated_cutting_planes (curr_relaxed_soln);
            // current relaxed solution isn't integral
                अगर (उल्लंघन_कटिंग_प्लेन.खाली ()) {// चरण 3.6
            if (hunting_for_cutting_planes) { // step 3.6
                    कटिंग_प्लेन_फाउंड = सच; // चरण 3.2 पर जारी रहेगा
                violated_cutting_planes = search_for_violated_cutting_planes(curr_relaxed_soln);
                    के लिए (ऑटो&& कटिंग_प्लेन: उल्लंघन_कटिंग_प्लेन) {
                if (!violated_cutting_planes.empty()) { // step 3.6
                        active_list.enqueue (LP_relax (curr_prob, कटिंग_प्लेन));
                    cutting_planes_found = true; // will continue at step 3.2
                    }
                    for (auto&& cutting_plane : violated_cutting_planes) {
                    जारी रखना; // चरण 3.2 पर जारी है
                        active_list.enqueue(LP_relax(curr_prob, cutting_plane));
                }
                    }
            }
                    continue; // continues at step 3.2
            // चरण 3.7: या तो उल्लंघन करने वाले विमान नहीं मिले, या हम उनकी तलाश नहीं कर रहे थे
                }
            ऑटो&& ब्रांच्ड_प्रोब्लेम्स = ब्रांच_पार्टिशन (कर_प्रोब);
            }
            के लिए (ऑटो और शाखा: शाखा_समस्याएं) {
            // step 3.7: either violated cutting planes not found, or we weren't looking for them
                active_list.enqueue (शाखा);
            auto&& branched_problems = branch_partition(curr_prob);
            }
            for (auto&& branch : branched_problems) {
            जारी रखना; // चरण 3 पर जारी है
                active_list.enqueue(branch);
        } जबकि (hunting_for_cutting_planes /* एल्गोरिथम का पैरामीटर; 3.6 देखें */
            }
              && कटिंग_प्लेन_फाउंड);
            continue; // continues at step 3
        // एंड स्टेप 3.2 डू-वाइल लूप
        } while (hunting_for_cutting_planes /* parameter of the algorithm; see 3.6 */
    } // लूप के दौरान चरण 3 समाप्त करें
                && cutting_planes_found);
    वापसी इष्टतम_समाधान; // चरण 4
        // end step 3.2 do-while loop
}
    } // end step 3 while loop
</वाक्यविन्यास हाइलाइट>
    return optimal_solution; // step 4
}
 


उपरोक्त स्यूडोकोड में, functions <code>LP_relax</code>, <code>LP_solve</code> और <code>branch_partition</code> समस्या के लिए उपयुक्त के रूप में सबरूटीन्स के रूप में बुलाया जाना चाहिए। उदाहरण के लिए, <code>LP_solve</code> [[संशोधित सिंप्लेक्स एल्गोरिथ्म]] कह सकते हैं। के लिए शाखाओं में बंटी रणनीतियाँ <code>branch_partition</code> नीचे चर्चा की गई है।
उपरोक्त स्यूडोकोड में, फलन <code>LP_relax</code>, <code>LP_solve</code> और <code>branch_partition</code> परिप्रश्न के लिए उपयुक्त के रूप में प्रक्रिया के रूप में बुलाया जाना चाहिए। उदाहरण के लिए, <code>LP_solve</code> [[संशोधित सिंप्लेक्स एल्गोरिथ्म|संशोधित प्रसमुच्चय कलन विधि]] कह सकते हैं। शाखा_विभाजन के लिए शाखाओं में बंटने की रणनीतियों पर नीचे चर्चा की गई है।


== ब्रांचिंग रणनीतियाँ ==
== प्रशाखी रणनीतियाँ ==


ब्रांचिंग और कट एल्गोरिथम में एक महत्वपूर्ण कदम ब्रांचिंग स्टेप है। इस चरण में, विभिन्न प्रकार के ब्रांचिंग ह्यूरिस्टिक्स हैं जिनका उपयोग किया जा सकता है। नीचे वर्णित ब्रांचिंग रणनीतियों में वेरिएबल पर ब्रांचिंग कहा जाता है।<ref>{{Cite journal|last=Achterberg|first=Tobias|last2=Koch|first2=Thorsten|last3=Martin|first3=Alexander|date=2005|title=ब्रांचिंग नियमों पर दोबारा गौर किया गया|journal=Operations Research Letters|language=en|volume=33|issue=1|pages=42–54|doi=10.1016/j.orl.2004.04.002}}</ref> एक चर पर ब्रांचिंग में एक चर चुनना शामिल है, <math>x_i</math>, भिन्नात्मक मान के साथ, <math>x_i'</math>, वर्तमान एलपी छूट के इष्टतम समाधान में और फिर बाधाओं को जोड़ना <math>x_i \le \left\lfloor x_i' \right\rfloor</math> और <math> x_i \ge \left\lceil x_i' \right\rceil</math>
प्रशाखी और कर्तन कलन विधि में एक महत्वपूर्ण कदम प्रशाखी कदम है। इस चरण में, विभिन्न प्रकार के प्रशाखी  स्वतः शोध प्रणाली हैं जिनका उपयोग किया जा सकता है। नीचे वर्णित प्रशाखी रणनीतियों में परिवर्तनशील पर प्रशाखी कहा जाता है।<ref>{{Cite journal|last=Achterberg|first=Tobias|last2=Koch|first2=Thorsten|last3=Martin|first3=Alexander|date=2005|title=ब्रांचिंग नियमों पर दोबारा गौर किया गया|journal=Operations Research Letters|language=en|volume=33|issue=1|pages=42–54|doi=10.1016/j.orl.2004.04.002}}</ref> एक चर पर प्रशाखी में भिन्नात्मक मान <math>x_i'</math> के साथ एक चर <math>x_i</math> चुनना सम्मिलित है, वर्तमान एलपी छूट के इष्टतम समाधान में और फिर <math>x_i \le \left\lfloor x_i' \right\rfloor</math> और <math> x_i \ge \left\lceil x_i' \right\rceil</math> बाधाओं को जोड़ना है।
; सबसे अव्यवहारिक ब्रांचिंग: यह ब्रांचिंग स्ट्रैटेजी वेरिएबल को फ्रैक्शनल पार्ट के साथ 0.5 के करीब चुनती है।
; सबसे अव्यवहारिक प्रशाखी: यह प्रशाखी परिवर्तनशील को भिन्नात्मक खंड के साथ 0.5 के करीब चुनती है।
; छद्म लागत शाखाकरण: इस रणनीति का मूल विचार प्रत्येक चर के लिए ट्रैक रखना है <math>x_i</math> उद्देश्य समारोह में परिवर्तन जब इस चर को पहले शाखा के लिए चर के रूप में चुना गया था। रणनीति तब उस चर को चुनती है जिसकी भविष्यवाणी की जाती है कि पिछले परिवर्तनों के आधार पर वस्तुनिष्ठ कार्य पर सबसे अधिक परिवर्तन होता है जब इसे शाखा चर के रूप में चुना गया था। ध्यान दें कि स्यूडो कॉस्ट ब्रांचिंग शुरू में खोज में अनौपचारिक है क्योंकि कुछ वेरिएबल्स को ब्रांच किया गया है।
; छद्म लागत शाखाकरण: इस रणनीति का मूल विचार प्रत्येक चर <math>x_i</math> के लिए ट्रैक रखना है। उद्देश्य फलन में परिवर्तन जब इस चर को पहले शाखा के लिए चर के रूप में चुना गया था। रणनीति तब उस चर को चुनती है जिसकी भविष्यवाणी की जाती है कि पिछले परिवर्तनों के आधार पर वस्तुनिष्ठ कार्य पर सबसे अधिक परिवर्तन होता है जब इसे शाखा चर के रूप में चुना गया था। ध्यान दें कि स्यूडो कॉस्ट प्रशाखी प्रारम्भ में खोज में अनौपचारिक है क्योंकि कुछ परिवर्तनशील को उपखंड किया गया है।
; मजबूत ब्रांचिंग: स्ट्रॉन्ग ब्रांचिंग में टेस्टिंग शामिल है कि कौन सा उम्मीदवार चर वास्तव में उन पर ब्रांचिंग करने से पहले ऑब्जेक्टिव फंक्शन में सबसे अच्छा सुधार देता है। पूर्ण मजबूत शाखाकरण सभी उम्मीदवार चर का परीक्षण करता है और कम्प्यूटेशनल रूप से महंगा हो सकता है। कम्प्यूटेशनल लागत को केवल उम्मीदवार चर के सबसेट पर विचार करके और संबंधित एलपी छूटों में से प्रत्येक को पूरा करने के लिए हल नहीं करके कम किया जा सकता है।
; शक्तिशाली प्रशाखी: शक्तिशाली प्रशाखी में परीक्षण सम्मिलित है कि कौन सा उम्मीदवार चर वास्तव में उन पर प्रशाखी करने से पहले उद्देश्य फलन में सबसे अच्छा सुधार देता है। पूर्ण शक्तिशाली शाखाकरण सभी उम्मीदवार चर का परीक्षण करता है और कम्प्यूटेशनल रूप से महंगा हो सकता है। कम्प्यूटेशनल लागत को केवल उम्मीदवार चर के उपसमुच्चय पर विचार करके और संबंधित एलपी छूटों में से प्रत्येक को पूरा करने के लिए हल नहीं करके कम किया जा सकता है।


इन ब्रांचिंग रणनीतियों की बड़ी संख्या में विविधताएँ भी हैं, जैसे कि छद्म लागत शाखाकरण अपेक्षाकृत असंक्रामक होने पर शुरुआत में मजबूत शाखाकरण का उपयोग करना और बाद में छद्म लागत शाखाओं में स्विच करना जब छद्म लागत के लिए सूचनात्मक होने के लिए पर्याप्त शाखाकरण इतिहास हो।
इन प्रशाखी रणनीतियों की बड़ी संख्या में विविधताएँ भी हैं, जैसे कि छद्म लागत शाखाकरण अपेक्षाकृत असंक्रामक होने पर प्रारम्भ में शक्तिशाली शाखाकरण का उपयोग करना और बाद में छद्म लागत शाखाओं में परिवर्तन करना जब छद्म लागत के लिए सूचनात्मक होने के लिए पर्याप्त शाखाकरण इतिहास है।


==संदर्भ==
==संदर्भ==

Revision as of 02:33, 17 May 2023

शाखा और कर्तन[1] पूर्णांक रेखीय कार्यक्रमों (ILPs) को हल करने के लिए मिश्रित अनुकूलन की एक विधि है, अर्थात्, रैखिक क्रमदेशन (LP) परिप्रश्नएँ जहाँ कुछ या सभी अज्ञात पूर्णांक मानों तक सीमित हैं।[2] ब्रांच और कर्तन में एक शाखा और बंधन कलन विधि चलाना और रैखिक क्रमदेशन शिथिलन को कसने के लिए कर्तनतल का उपयोग करना सम्मिलित है। ध्यान दें कि यदि कर्तन केवल प्रारंभिक एलपी छूट को कसने के लिए उपयोग की जाती है, तो कलन विधि को कर्तन और शाखा कहा जाता है।

कलन विधि

यह विवरण मानता है कि आईएलपी एक अधिकतमकरण परिप्रश्न है।

विधि नियमित प्रसमुच्चय कलन विधि का उपयोग करके रैखिक क्रमदेशन छूट को हल करती है। जब एक इष्टतम समाधान प्राप्त किया जाता है, और इस समाधान में एक चर के लिए एक गैर-पूर्णांक मान होता है जिसे पूर्णांक माना जाता है, तो आगे की रैखिक बाधाओं को खोजने के लिए एक कर्तनतल विधि का उपयोग किया जा सकता है जो सभी व्यवहार्य समाधान पूर्णांक बिंदुओं से संतुष्ट हैं लेकिन वर्तमान आंशिक समाधान द्वारा उल्लंघन किया गया है। इन असमानताओं को रैखिक कार्यक्रम में जोड़ा जा सकता है, जैसे कि इसे हल करने से एक अलग समाधान निकलेगा जो उम्मीद से कम आंशिक है।

इस बिंदु पर, कलन विधि की शाखा और बाध्य भाग प्रारंभ हो गया है। परिप्रश्न कई (सामान्यतः दो) संस्करणों में विभाजित है। नए रेखीय कार्यक्रमों को तब सरल विधि का उपयोग करके हल किया जाता है और प्रक्रिया दोहराती है। शाखा और बाध्य प्रक्रिया के उपरान्त, एलपी छूट के गैर-अभिन्न समाधान ऊपरी सीमा के रूप में कार्य करते हैं और अभिन्न समाधान निम्न सीमा के रूप में कार्य करते हैं। एक पर्णग्रंथि कृन्तन हो सकता है यदि एक ऊपरी सीमा वर्तमान निचली सीमा से कम है। इसके अतिरिक्त, एलपी छूटों को हल करते समय, अतिरिक्त कर्तनतल उत्पन्न हो सकते हैं, जो या तो 'सार्वभौम कर्तन' हो सकते हैं, यानी, सभी व्यवहार्य पूर्णांक समाधानों के लिए मान्य, या 'स्थानिक कर्तन', जिसका अर्थ है कि वे सभी से संतुष्ट हैं वर्तमान में मानी जाने वाली शाखा और संकुचित उपतरु से पृष्ठ बाधाओं को पूरा करने वाले समाधान है।

कलन विधि का सारांश नीचे दिया गया है।

  1. प्रारंभिक ILP को में जोड़ें, सक्रिय परिप्रश्न की सूची
  2. और को सम्मुच्चय करना है।
  3. घुमाव के उपरान्त खाली नहीं है
    1. से एक परिप्रश्न का चयन करें और (डी-क्यू) निकालें
    2. परिप्रश्न की एलपी छूट को हल करें।
    3. यदि समाधान संभव नहीं है, तो 3 (जबकि) पर वापस जाएं। अन्यथा समाधान उद्देश्य मूल्य के साथ को निरूपित करें
    4. यदि , 3 पर वापस जाएँ।
    5. यदि पूर्णांक है, सम्मुच्चय और 3 पर वापस जाएँ।
    6. यदि वांछित हो, तो उल्लंघन करने वाले तल को काटने की तलाश करें। यदि कोई पाया जाता है, तो उन्हें एलपी छूट में जोड़ें और 3.2 पर लौटें।
    7. शाखा परिप्रश्न को सीमित व्यवहार्य क्षेत्रों के साथ नई परिप्रश्न में विभाजित करने के लिए इन परिप्रश्न को में और 3 पर वापस जाएँ।
  4. वापस करना


स्यूडोकोड

C ++ में - स्यूडोकोड की तरह, यह लिखा जा सकता है:

<वाक्यविन्यास प्रकाश लैंग = सी ++ लाइन = 1> // ILP शाखा और कर्तन समाधान स्यूडोकोड, यह मानते हुए कि उद्देश्य को अधिकतम किया जाना है

ILP_solution Branch_and_cut_ILP(IntegerLinearProgram initial_problem) {

// ILP branch and cut solution pseudocode, assuming objective is to be maximized
ILP_solution branch_and_cut_ILP(IntegerLinearProgram initial_problem) {
    queue active_list; // L, above
    active_list.enqueue(initial_problem); // step 1
    // step 2
    ILP_solution optimal_solution; // this will hold x* above
    double best_objective = -std::numeric_limits<double>::infinity; // will hold v* above
    while (!active_list.empty()) { // step 3 above
        LinearProgram& curr_prob = active_list.dequeue(); // step 3.1
        do { // steps 3.2-3.7
            RelaxedLinearProgram& relaxed_prob = LP_relax(curr_prob); // step 3.2
            LP_solution curr_relaxed_soln = LP_solve(relaxed_prob); // this is x above
            bool cutting_planes_found = false;
            if (!curr_relaxed_soln.is_feasible()) { // step 3.3
                continue; // try another solution; continues at step 3
            }
            double current_objective_value = curr_relaxed_soln.value(); // v above
            if (current_objective_value <= best_objective) { // step 3.4
                continue; // try another solution; continues at step 3
            }
            if (curr_relaxed_soln.is_integer()) { // step 3.5
                best_objective = current_objective_value;
                optimal_solution = cast_as_ILP_solution(curr_relaxed_soln);
                continue; // continues at step 3
            }
            // current relaxed solution isn't integral
            if (hunting_for_cutting_planes) { // step 3.6
                violated_cutting_planes = search_for_violated_cutting_planes(curr_relaxed_soln);
                if (!violated_cutting_planes.empty()) { // step 3.6
                    cutting_planes_found = true; // will continue at step 3.2
                    for (auto&& cutting_plane : violated_cutting_planes) {
                        active_list.enqueue(LP_relax(curr_prob, cutting_plane));
                    }
                    continue; // continues at step 3.2
                }
            }
            // step 3.7: either violated cutting planes not found, or we weren't looking for them
            auto&& branched_problems = branch_partition(curr_prob);
            for (auto&& branch : branched_problems) {
                active_list.enqueue(branch);
            }
            continue; // continues at step 3
        } while (hunting_for_cutting_planes /* parameter of the algorithm; see 3.6 */
               && cutting_planes_found);
        // end step 3.2 do-while loop
    } // end step 3 while loop
    return optimal_solution; // step 4
}


उपरोक्त स्यूडोकोड में, फलन LP_relax, LP_solve और branch_partition परिप्रश्न के लिए उपयुक्त के रूप में प्रक्रिया के रूप में बुलाया जाना चाहिए। उदाहरण के लिए, LP_solve संशोधित प्रसमुच्चय कलन विधि कह सकते हैं। शाखा_विभाजन के लिए शाखाओं में बंटने की रणनीतियों पर नीचे चर्चा की गई है।

प्रशाखी रणनीतियाँ

प्रशाखी और कर्तन कलन विधि में एक महत्वपूर्ण कदम प्रशाखी कदम है। इस चरण में, विभिन्न प्रकार के प्रशाखी स्वतः शोध प्रणाली हैं जिनका उपयोग किया जा सकता है। नीचे वर्णित प्रशाखी रणनीतियों में परिवर्तनशील पर प्रशाखी कहा जाता है।[3] एक चर पर प्रशाखी में भिन्नात्मक मान के साथ एक चर चुनना सम्मिलित है, वर्तमान एलपी छूट के इष्टतम समाधान में और फिर और बाधाओं को जोड़ना है।

सबसे अव्यवहारिक प्रशाखी
यह प्रशाखी परिवर्तनशील को भिन्नात्मक खंड के साथ 0.5 के करीब चुनती है।
छद्म लागत शाखाकरण
इस रणनीति का मूल विचार प्रत्येक चर के लिए ट्रैक रखना है। उद्देश्य फलन में परिवर्तन जब इस चर को पहले शाखा के लिए चर के रूप में चुना गया था। रणनीति तब उस चर को चुनती है जिसकी भविष्यवाणी की जाती है कि पिछले परिवर्तनों के आधार पर वस्तुनिष्ठ कार्य पर सबसे अधिक परिवर्तन होता है जब इसे शाखा चर के रूप में चुना गया था। ध्यान दें कि स्यूडो कॉस्ट प्रशाखी प्रारम्भ में खोज में अनौपचारिक है क्योंकि कुछ परिवर्तनशील को उपखंड किया गया है।
शक्तिशाली प्रशाखी
शक्तिशाली प्रशाखी में परीक्षण सम्मिलित है कि कौन सा उम्मीदवार चर वास्तव में उन पर प्रशाखी करने से पहले उद्देश्य फलन में सबसे अच्छा सुधार देता है। पूर्ण शक्तिशाली शाखाकरण सभी उम्मीदवार चर का परीक्षण करता है और कम्प्यूटेशनल रूप से महंगा हो सकता है। कम्प्यूटेशनल लागत को केवल उम्मीदवार चर के उपसमुच्चय पर विचार करके और संबंधित एलपी छूटों में से प्रत्येक को पूरा करने के लिए हल नहीं करके कम किया जा सकता है।

इन प्रशाखी रणनीतियों की बड़ी संख्या में विविधताएँ भी हैं, जैसे कि छद्म लागत शाखाकरण अपेक्षाकृत असंक्रामक होने पर प्रारम्भ में शक्तिशाली शाखाकरण का उपयोग करना और बाद में छद्म लागत शाखाओं में परिवर्तन करना जब छद्म लागत के लिए सूचनात्मक होने के लिए पर्याप्त शाखाकरण इतिहास है।

संदर्भ

  1. Padberg, Manfred; Rinaldi, Giovanni (1991). "बड़े पैमाने पर सिमिट्रिक ट्रैवलिंग सेल्समैन की समस्याओं के समाधान के लिए एक ब्रांच-एंड-कट एल्गोरिद्म". SIAM Review (in English). 33 (1): 60–100. doi:10.1137/1033004. ISSN 0036-1445.
  2. John E., Mitchell (2002). "कॉम्बिनेटरियल ऑप्टिमाइजेशन प्रॉब्लम्स के लिए ब्रांच-एंड-कट एल्गोरिदम" (PDF). Handbook of Applied Optimization: 65–77.
  3. Achterberg, Tobias; Koch, Thorsten; Martin, Alexander (2005). "ब्रांचिंग नियमों पर दोबारा गौर किया गया". Operations Research Letters (in English). 33 (1): 42–54. doi:10.1016/j.orl.2004.04.002.


बाहरी संबंध

| group5 = Metaheuristics | abbr5 = heuristic | list5 =

| below =

}} | group5 =Metaheuuristic |abbr5 = heuristic | list5 =*विकासवादी एल्गोरिथ्म

| below =* सॉफ्टवेयर

}}