2017-07-06 19 views
6

का उपयोग करके मूल अनुकूलन कैसे करें I loco का उपयोग करके अनुकूलन का मूल उदाहरण करने का प्रयास कर रहा हूं।लोको

मेरे पास इंडेक्स की लागत का एक वेक्टर है जो कई स्लॉट्स के पूर्णांक मान से मेल खाता है और स्लॉट के एक अलग सबसेट के लिए लागत के योग को कम करना चाहता है।

कृपया नीचे अपना प्रयास देखें, जो काम करने में विफल रहता है क्योंकि उठाए गए स्लॉट और लागत के बीच कोई "लिंक" नहीं है।

(def costs [10 10 20 20 30 30 40 40 10 10]) 

(let [slot-vars (for [i (range 5)] ($in [:slot i] 1 10)) 
     cost-vars (for [i (range 10)] ($in [:cost i] 10 40))] 
    (solution 
    (concat 
    slot-vars 
    cost-vars 
    [($distinct (for [i (range 5)] [:slot i]))] 
    (for [i (range 5)] 
     ($= [:cost i] (get costs i)))) 
    :minimize (apply $+ (for [i (range 5)] [:slot i])))) 
+0

यह एक कम से कम नेप्सेक समस्या की तरह लगता है। आप अधिकतम कर सकते हैं, लेकिन कम से कम नहीं। संभवत: ऐसा करने के लिए सीधे चोको लाइब्रेरी से निपटना होगा। – Mike

उत्तर

2

सबसे पहले, मुझे पूरी तरह से यकीन नहीं है कि मैं इस समस्या के बिंदु को समझता हूं, क्योंकि स्पष्ट रूप से समाधान सूची में 5 सबसे छोटे मूल्यों को लेना है। लेकिन यदि आप इसे लोको करना चाहते हैं, तो मैं इस बात से सहमत हूं कि इसके लिए knapsack बाधा एक आसान उपकरण है। माइक ने अपनी टिप्पणी में क्या कहा, इसके विपरीत, मुझे कम करने के लिए knapsack का उपयोग करने में कोई बाधा नहीं दिख रही है। वजन सभी को 1 होने दें, और 10 स्लॉट में से 5 का चयन करने के लिए वजन को 5 तक जोड़ दें। मैंने वैरिएबल [:include i] का उपयोग यह इंगित करने के लिए किया है कि स्लॉट मुझे सबसेट में शामिल किया जाना चाहिए (सत्य के लिए 1 और झूठी के लिए 0)। हम वेक्टर के डॉट उत्पाद को कम करना चाहते हैं: चर और लागत वेक्टर शामिल करें।

(def costs [10 10 20 20 30 30 40 40 10 10]) 
(def weights (repeat 10 1)) 

(def include-vars (for [i (range 10)] [:include i])) 
(def include-constraints (for [i (range 10)] ($in [:include i] 0 1))) 

(def model 
    (concat 
    include-constraints 
    [($knapsack weights costs include-vars 5 :total) 
    ($in :total 0 (apply + costs))])) 

(solution model :minimize :total) 

परिणाम है:

{[:include 4] 0, [:include 6] 0, [:include 9] 1, [:include 1] 1, [:include 3] 0, [:include 8] 1, :total 60, [:include 0] 1, [:include 7] 0, [:include 2] 1, [:include 5] 0} 
+0

आपके उत्तर के लिए धन्यवाद। उदाहरण सिर्फ दृष्टांत है, मेरे असली उपयोग मामले में युद्ध कई अन्य बाधाओं के अधीन होंगे। – mac

2

यह उत्तर नहीं है, लेकिन मुझे आशा है कि इससे मदद की दिशा में मदद मिल सकती है। यह एक knapsack समस्या की तरह लगता है? मान लें कि आप केवल 5 स्लॉट हो सकता है

(def slots (for [i (range 10)] (keyword (str "slot-" i)))) 

(solution 
    (concat 
    (for [s slots] ($in s 0 1)) 
    [($in :total-weight 10 60) 
    ($in :total-value 5 5) 
    ($knapsack [10 10 20 20 30 30 40 40 10 10] 
       (repeat 10 1) 
       slots :total-weight :total-value)])) 

:

आप के साथ अधिकतम पा सकते हैं।

स्रोत कोड को देखकर और चोको लाइब्रेरी के साथ सीधे काम करके एक न्यूनतम संस्करण लिख सकता है?

लोको knapsack फ़ंक्शन के स्रोत की जांच करें।