私はスカラ座の各項目の一つで有界ナップザック問題への答えを書いて、下記の結果とHaskellのにそれを移調試してみた:私は上のヒントを探していないよHaskellのナップザック
knapsack :: [ (Int, Int) ] -> [ (Int, Int) ] -> Int -> [ (Int, Int) ]
knapsack xs [] _ = xs
knapsack xs ys max =
foldr (maxOf) [ ] [ knapsack (y : xs) (filter (y /=) ys) max | y <- ys
, weightOf(y : xs) <= max ]
maxOf :: [ (Int, Int) ] -> [ (Int, Int) ] -> [ (Int, Int) ]
maxOf a b = if valueOf a > valueOf b then a else b
valueOf :: [ (Int, Int) ] -> Int
valueOf [ ] = 0
valueOf (x : xs) = fst x + valueOf xs
weightOf :: [ (Int, Int) ] -> Int
weightOf [ ] = 0
weightOf (x : xs) = snd x + weightOf xs
コードをクリーンアップする方法を説明します。私の知る限りでは、それはやるべきこと以下:(YSで)各タプルオプションの
-
- 現在のタプル(y)と組み合わせて、実行中の合計(XS)の重量がより少ない場合容量
- (YS)で利用できるタプルを使用して、現在のタプルと現在の合計(XS)が含まれ、最適なナップザックを得るより少ない電流のタプル
- 最後に、これらの結果の最も貴重なを取得し、リターンそれ
* 編集:*申し訳ありませんが、何が間違っているのを忘れています...それは問題なくコンパイルします。しかし、それは間違った答えを与えます。以下の入力の場合、私は何を期待し、それが生成するもの:
knapsack [] [(1,1),(2,2)] 5
Expect: [(1,1),(2,2)]
Produces: [(1,1),(2,2)]
knapsack [] [(1,1),(2,2),(3,3)] 5
Expect: [(2,2),(3,3)]
Produces: []
knapsack [] [(2,1),(3,2),(4,3),(6,4)] 5
Expect: [(2,1),(6,4)]
Produces: []
は、だから私は不一致の原因となることができるか不思議でしたか?
ソリューション、sepp2kのおかげ:
ks = knapsack []
knapsack :: [ (Int, Int) ] -> [ (Int, Int) ] -> Int -> [ (Int, Int) ]
knapsack xs [] _ = xs
knapsack xs ys max =
foldr (maxOf) [ ] (xs : [ knapsack (y : xs) (ys #- y) max
| y <- ys, weightOf(y : xs) <= max ])
(#-) :: [ (Int, Int) ] -> (Int, Int) -> [ (Int, Int) ]
[ ] #- _ = [ ]
(x : xs) #- y = if x == y then xs else x : (xs #- y)
maxOf :: [ (Int, Int) ] -> [ (Int, Int) ] -> [ (Int, Int) ]
maxOf a b = if valueOf a > valueOf b then a else b
valueOf :: [ (Int, Int) ] -> Int
valueOf [ ] = 0
valueOf (x : xs) = fst x + valueOf xs
weightOf :: [ (Int, Int) ] -> Int
weightOf [ ] = 0
weightOf (x : xs) = snd x + weightOf xs
以上、期待される結果を返します。
問題が何ですか?それはコンパイルされませんか?間違った結果を出すのか?具体的にする。 – hammar