J'ai écrit une réponse au problème de l'un havresac borné de chaque élément Scala, et avons essayé la transposition à Haskell avec le résultat suivant:Haskell Knapsack
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
Je ne cherche pas pour obtenir des conseils sur comment nettoyer le code, juste pour le faire fonctionner. A ma connaissance, il devrait faire ce qui suit:
- Pour chaque option tuple (en ys)
- si le poids du tuple courant (y) et le total de fonctionnement (xs) combinée est inférieure à la capacité
- obtenir le havresac optimal qui contient le tuple courant et le total actuel (xs), en utilisant les tuples disponibles (en ys) moins le tuple
- Enfin, obtenir le plus précieux de ces résultats et rendement
* Editer: * Désolé, j'ai oublié de dire ce qui ne va pas ... Donc ça compile bien, mais ça donne la mauvaise réponse. Pour les entrées suivantes, ce que je pense et ce qu'elle produit:
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: []
Je me demandais ce qui pourrait être la cause de l'écart?
La solution, grâce à 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
qui renvoie les résultats attendus, ci-dessus.
Quel est le problème? Ne compile-t-il pas? Cela donne-t-il de mauvais résultats? Être spécifique. – hammar