2017-07-06 13 views
6

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つの最小値を取ることです。しかし、あなたがロコにそれをさせたいのであれば、ナップザックの制約がこのための便利なツールであることに同意します。 Mikeが彼のコメントで言ったこととは対照的に、私は最小化のためにナップザックを使うことに何の障害も見ません。重みをすべて1にし、10スロットのうち5スロットを選択するために重みが5になるように強制します。変数[:include i]を使用して、スロット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

あなたの答えをありがとう。この例は単なる例示であり、実際の使用例では、varsは他の多くの制約を受けることになります。 – mac

2

これは答えではありませんが、役立つ可能性のある方向を示すのに役立つことを願っています。それはナップザック問題のように聞こえる?あなたが唯一の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)])) 

あなたはとの最大を見つけることができます。

ソースコードを見て、Chocoライブラリで直接作業することで最小化バージョンを書くことができますか?

ロコのソースを確認してくださいknapsack機能。

関連する問題