2013-07-21 5 views
5

मैं कुछ ऐसा करने की कोशिश कर रहा हूं जो तर्कसंगत रूप से करना संभव हो। हालांकि, मुझे यकीन नहीं है कि रैखिक प्रोग्रामिंग के दायरे में इसे कैसे किया जाए। मैं जेडएमपीएल/एससीआईपी का उपयोग कर रहा हूं, लेकिन इसे सबसे ज्यादा पढ़ने योग्य होना चाहिए।एक चर द्वारा एक सेट इंडेक्स करने के लिए संभव है?

set I := {1,2,3,4,5}; 
param u[I] := <1> 10, <2> 20, <3> 30, <4> 40, <5> 50; 

var a; 
var b; 

subto bval: 
    b == 2; 

subto works: 
    a == u[2]; 

#subto does_not_work: 
# a == u[b]; 

मुझे यकीन है कि चर au में सूचकांक b पर मूल्य के बराबर है बनाने की कोशिश कर रहा हूँ। तो उदाहरण के लिए, मैं सुनिश्चित करता हूं कि b == 2 और फिर मैं उस बाधा को सेट करने का प्रयास करता हूं जो a == u[b] है, लेकिन यह काम नहीं करता है। यह शिकायत करता है कि मैं एक चर के साथ अनुक्रमण करने की कोशिश कर रहा हूँ। मैं केवल a == u[2] करने में सक्षम हूं, जो a20 के बराबर बनाता है।

क्या एक चर द्वारा निर्दिष्ट सूचकांक पर आसानी से u तक पहुंचने का कोई तरीका है? किसी भी मदद/मार्गदर्शन के लिए धन्यवाद।


संपादित: मुझे लगता है आम सहमति है कि यह संभव है क्योंकि यह अब एक एल.पी. हो जाता है नहीं है। उस स्थिति में, क्या कोई इसे लिखने का एक और तरीका सोच सकता है ताकि b के मूल्य के आधार पर, मैं सेट u से संबंधित मान प्राप्त कर सकता हूं? इसे सीधे अनुक्रमणित करने से बचना होगा।


समाधान: राम से प्रतिक्रिया के आधार पर मैं इसे आज़माने के लिए कर रहा था और पाया कि यह निश्चित रूप से एक व्यवहार्य और रैखिक समाधान था। धन्यवाद, राम! यहाँ ZMPL में नमूना समाधान कोड है:

set I := {1,2,3,4,5}; 
param u[I] := <1> 10, <2> 20, <3> 30, <4> 40, <5> 50; 

var a; 
var b; 
var y[I] binary; 

subto bval: 
    b == 4; 

subto only_one: 
    sum <i> in I : y[i] == 1; 

subto trick: 
    b == (sum <i> in I : y[i] * i); 

subto aval: 
    (sum <i> in I : u[i]*y[i]) == a; 
+0

असभ्य नहीं होना चाहिए, लेकिन कोई आम सहमति की आवश्यकता नहीं है। यह रैखिक नहीं है क्योंकि यह रैखिक की परिभाषा को पूरा नहीं करता है। – raoulcousins

+0

कूल, धन्यवाद! खुशी है कि हमें सर्वसम्मति की आवश्यकता नहीं है। – gnychis

उत्तर

3

हाँ, आप को फिर से लिखने कर सकते हैं और Linearize अपने बाधाओं, कुछ अतिरिक्त 0/1 चर (सूचक चर) शुरू करने से। इंटीजर प्रोग्रामिंग में इस प्रकार की चाल असामान्य नहीं हैं।

प्रतिबन्ध अंग्रेजी

b में 5. 1 से मूल्यों पर ले जा सकते हैं ख = {} 1..5

और ख के मूल्य के आधार पर, चर a हो जाना चाहिए u[b]

संकेतक चर

चलो 5परिचय देंचर - वाई 1..Y5 (बी के प्रत्येक संभावित मूल्य के लिए एक)

उनमें से केवल एक ही समय में सच हो सकता है।

Y1 + Y2 + Y3 + Y4 + Y5 = 1 
All Y's are binary {0,1} 

यह चाल है। हम यह सुनिश्चित करने के लिए एक रैखिक बाधा उत्पन्न करते हैं कि संबंधित वाई चर मूल्य 1 पर लगेगा, केवल तभी जब वह मान होगा।

b - 1xY1 - 2xY2 - 3xY3 - 4xY4 - 5xY5 = 0 

(उदाहरण के लिए, यदि ख 3 है, बाधा ऊपर Y3 1. होने के लिए बाध्य करेगा)

अब, हम a मूल्य पर ले जाना चाहते हैं यू [ख]।

a = u[1]xY1 + u[2]xY2 + u[3]xY3 + u[4]xY4 + u[5]xY5 

के बाद से यू [1] ... यू [5] कर रहे हैं पहले से जाना जाता स्थिरांक, बाधा ऊपर भी रैखिक है।

इंटीजर प्रोग्रामिंग में इन प्रकार की IF-THEN स्थितियों पर one reference है। इनमें से कई चालों में बिग-एम शामिल है, हालांकि हमें इस मामले में इसकी आवश्यकता नहीं थी।

आशा है कि आगे बढ़ने में आपकी सहायता करें।

+0

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

संबंधित मुद्दे