2010-07-24 5 views
13

में बाइनरी रैखिक प्रोग्रामिंग सॉल्वर मेरे पास एक पायथन स्क्रिप्ट है जिसमें मुझे एक रैखिक प्रोग्रामिंग समस्या हल करने की आवश्यकता है। पकड़ यह है कि समाधान बाइनरी होना चाहिए। दूसरे शब्दों में, मुझे MATLAB के bintprog फ़ंक्शन के समतुल्य की आवश्यकता है। NumPy और SciPy ऐसी प्रक्रिया प्रतीत नहीं होती है। किसी को भी मैं इन तीन बातों में से एक कैसे कर सकता है पर सुझाव हैं:पाइथन

  • एक अजगर पुस्तकालय जो इस तरह के एक समारोह में शामिल हैं।

  • समस्या को रोकें जैसे इसे अधिक सामान्य रैखिक प्रोग्रामिंग सॉल्वर द्वारा हल किया जा सकता है।

  • MATLAB के साथ इंटरफेस पायथन ताकि bintprog का प्रत्यक्ष उपयोग करने के लिए।

उत्तर

4

यह एक आधा जवाब है, लेकिन आप (अजगर-glpk के माध्यम से) अजगर का उपयोग GLPK के साथ इंटरफेस कर सकते हैं। जीएलपीके पूर्णांक रैखिक कार्यक्रमों का समर्थन करता है। (बाइनरी प्रोग्राम केवल पूर्णांक प्रोग्राम का सबसेट है)।

http://en.wikipedia.org/wiki/GNU_Linear_Programming_Kit

या आप बस पायथन में अपनी समस्या लिखने और उत्पन्न एक एमपीएस फ़ाइल (जो सबसे मानक एलपी/MILP (CPLEX, Gurobi, GLPK) समाधानकर्ताओं स्वीकार करेंगे) कर सकता है। यह लेने का एक अच्छा मार्ग हो सकता है, क्योंकि जहां तक ​​मुझे पता है, वहां कोई उच्च गुणवत्ता वाले एमआईएलपी सॉल्वर नहीं हैं जो पाइथन के मूल हैं (और कभी नहीं हो सकता है)। यह आपको विभिन्न हलकों को आजमाने की भी अनुमति देगा।

http://code.google.com/p/pulp-or/

MATLAB के साथ अजगर इंटरफ़ेस का सवाल है, मैं बस अपना खुद का समाधान रोल होगा। एक

  1. आप एक अकादमिक उपयोगकर्ता हैं, तो आप Gurobi करने के लिए एक मुक्त लाइसेंस प्राप्त कर सकते हैं,: आप एक मीटर फ़ाइल बनाने और उसके बाद कमांड लाइन

    % matlab -nojava myopt.m 
    

    नोट्स से चला सकते हैं उच्च प्रदर्शन एलपी/एमआईएलपी सॉल्वर। इसमें एक पायथन इंटरफ़ेस है। http://www.gurobi.com/

  2. ओपनऑप्ट एक पाइथन अनुकूलन सूट है जो विभिन्न हलकों के साथ इंटरफेस करता है। http://en.wikipedia.org/wiki/OpenOpt
6

बस, कठोर होने के लिए करता है, तो समस्या एक द्विआधारी प्रोग्रामिंग समस्या है, तो यह एक रेखीय कार्यक्रम नहीं है।

आप CVXOPT को आजमा सकते हैं। इसमें एक पूर्णांक प्रोग्रामिंग फ़ंक्शन है (this देखें)। आपकी समस्या को एक द्विआधारी कार्यक्रम बनाने के लिए, आप विवश 0 < = एक्स < जोड़ने की जरूरत है = 1.

संपादित: आप वास्तव में, द्विआधारी के रूप में अपने चर घोषणा कर सकते हैं ताकि आप विवश जोड़ने की जरूरत नहीं है 0 < = एक्स < = 1.

cvxopt.glpk.ilp = ilp(...) 
Solves a mixed integer linear program using GLPK. 

(status, x) = ilp(c, G, h, A, b, I, B) 

PURPOSE 
Solves the mixed integer linear programming problem 

    minimize c'*x 
    subject to G*x <= h 
       A*x = b 
       x[I] are all integer 
       x[B] are all binary 
+1

जोड़ने बाधा '0 <= एक्स <= 1' एक द्विआधारी कार्यक्रम नहीं है। यह केवल बाइनरी कार्यक्रम की एलपी छूट है, और इसे बाइनरी प्रोग्राम समाधान विधि के हिस्से के रूप में उपयोग किया जा सकता है। – Peter

+0

मैं कह रहा हूं कि इंटीजर प्रोग्राम में इंटीजर प्रोग्राम को बदलने के लिए इंटीजर प्रोग्राम (जिसे आप ऊपर बताए गए सीवीएक्सओपीटी के साथ हल कर सकते हैं) को 0 <= x <= 1 को बाध्य कर सकते हैं। – Alejandro

+4

अच्छा .... हाँ और नहीं। द्विआधारी/पूर्णांक चर के साथ एक रैखिक कार्यक्रम केवल आईएलपी (पूर्णांक रैखिक कार्यक्रम) कहा जाता है। द्विआधारी/पूर्णांक चर और निरंतर चर दोनों के साथ एक रैखिक कार्यक्रम को एमआईएलपी (मिश्रित इंटीजर रैखिक कार्यक्रम) कहा जाता है। इस संदर्भ में शब्द "पूर्णांक" और "बाइनरी" का उपयोग एक दूसरे के रूप में किया जाता है, क्योंकि किसी भी पूर्णांक चर को कई बाइनरी चर (यानी एसओएस प्रकार 1) का उपयोग करके दर्शाया जा सकता है। लेकिन आप यह कहने में सही हैं कि किसी को 0 <= x <= 1 लगाया जाना चाहिए यदि x को सामान्य पूर्णांक चर के रूप में घोषित किया गया हो। हालांकि, ज्यादातर मामलों में, एक्स को सीधे बाइनरी चर के रूप में घोषित किया जा सकता है। – Gilead