Je dois implémenter la solution à un problème Knapsack 0/1 avec des contraintes. Mon problème aura dans la plupart des cas quelques variables (~ 10-20, au plus 50). Je rappelle de l'université qu'il existe un certain nombre d'algorithmes qui dans de nombreux cas fonctionnent mieux que la force brute (je pense, par exemple, à un algorithme de branchement et de liaison). Puisque mon problème est relativement petit, je me demande s'il y a un avantage appréciable en termes d'efficacité lorsqu'on utilise une solution sophistiquée par opposition à la force brute. Si cela aide, je suis en train de programmer en Python.0/1 Sac à dos avec peu de variables: quel algorithme?
Répondre
Les trucs de force brute fonctionneraient correctement pour 10 variables, mais pour, disons, 40 vous obtiendriez quelque 1000'000'000'000 solutions possibles, ce qui serait probablement trop long à énumérer. Je considérerais des algorithmes approximatifs, par ex. l'algorithme de temps polynomial (voir, par exemple, http://math.mit.edu/~goemans/18434S06/knapsack-katherine.pdf) ou utiliser un algorithme de recherche tel que branch-and-bound, peut-être avec une heuristique supplémentaire.
Vous pouvez utiliser un algorithme pseudo-polynomial, qui utilise la programmation dynamique, si la somme des poids est suffisamment petite. Vous calculez simplement si vous pouvez obtenir le poids X avec les premiers éléments Y pour chaque X et Y. Cela s'exécute dans le temps O (NS), où N est le nombre d'éléments et S est la somme des poids.
Une autre possibilité consiste à utiliser une approche de "meet-in-the-middle". Divisez les éléments en deux moitiés et: Pour la première moitié, prenez toutes les combinaisons possibles d'éléments (il y a 2^(N/2) combinaisons possibles dans chaque moitié) et stockez son poids dans un ensemble. Pour la seconde moitié, prendre toutes les combinaisons possibles et vérifier s'il existe une combinaison en première moitié avec un poids approprié. Cela devrait fonctionner en O (2^(N/2)) fois.
Les algorithmes de force brute retourneront toujours les meilleures solutions. Le problème avec eux est que dans les problèmes d'ordre exponentiel, ils deviennent rapidement impossibles.
Si vous avez la garantie d'avoir jusqu'à 20 variables, vous ne testerez pas plus de 1 million de solutions (2^20 = 1M). Par conséquent, la force brute est réalisable et aucun autre algorithme ne renverra une meilleure solution.
Heuristiques sont bonnes, mais ils ne devraient être utilisés que lorsque nous n'avons pas de solution exacte au problème. Il y a un bon livre qui pourrait vous aider: How to Solve it, by Michalewicz.
- 1. Sac à dos avec éléments à considérer
- 2. Sac à dos à choix multiple
- 3. Algorithme génétique sur un optiproblème ressemblant à un sac à dos
- 4. Sac à dos avec un coût minimum
- 5. trouver des articles dans le sac de sac à dos
- 6. problème de sac à dos (classique)
- 7. variante de problème de sac à dos
- 8. Solution de sac à dos avec Backtraking en C++
- 9. Application de l'algorithme du sac à dos
- 10. Variation sur l'algorithme du sac à dos
- 11. Résoudre le sac à dos Integer
- 12. JaCoP: Résoudre un problème de sac à dos 0/1
- 13. Cet algorithme pour une variation du sac à dos fonctionnera-t-il?
- 14. Sac à dos Python avec contrainte par type
- 15. Imprimer les valeurs de la solution de sac à dos
- 16. Problème de sac à dos avec un nombre spécifié de poids peut être utilisé
- 17. Sac à dos - Comment identifier les poids utilisés?
- 18. C# - Remplacer un article dans le sac à dos
- 19. Sac à dos - priorité la plus basse, poids minimum
- 20. grandes données de test pour le problème de sac à dos
- 21. Calcul incrémental du sac
- 22. en utilisant la saisie semi-automatique dans l'application avec sac à dos
- 23. Résolution d'un sac à dos 3D à l'aide de force brute en Java
- 24. date d'analyse 01-01-0001 avec jodatime
- 25. sac à dos multiple gourmand (réduire/réduire le nombre de cases)
- 26. Sac à dos borné Problème de configuration. Vouloir: une liste de tous les empaquetages possibles
- 27. Comment modéliser la base de données pour une application de type sac à dos
- 28. Comment empêcher la fonction pandas.to_datetime() de convertir 0001-01-01 en 2001-01-01
- 29. Résolution de l'approche du sac à dos par bruteforce en python
- 30. Répartition des ressources w.r.t. capacité individuelle - est-ce un problème de sac à dos?
L'approche de la mi-parcours s'exécute en plus du temps O (2^(N/2)) puisque le partitionnement prend 2^(N/2) fois, puis la correspondance réelle prend N^2 fois ou Nlog (N) si vous le recherchez. –