Les algorithmes génétiques démystifiés 37: Le problème du sac à dos
Pour continuer notre exploration des algorithmes génétiques, on va s’intéresser maintenant au problème du sac à dos:
En algorithmique, le problème du sac à dos, noté également KP (en anglais,
Knapsack Problem) est un problème d'optimisation combinatoire. Il modélise une
situation analogue au remplissage d'un sac à dos, ne pouvant supporter plus
d'un certain poids, avec tout ou partie d'un ensemble donné d'objets ayant
chacun un poids et une valeur. Les objets mis dans le sac à dos doivent
maximiser la valeur totale, sans dépasser le poids maximum.
Un des intéret de ce problème est que certaines solutions invalides sont plus proches de la meilleure solution que nombres de solutions valides.
De même, c’est un problème théorique qui peut être vu comme une simplification de problèmes pratiques. Par exemple: «Mon bateau peut transporter 100 containers, pour un poids de X tonnes. Je gagne plus ou moins d’argent selon les containers transportés. Quels containers je dois embarquer parmi un choix de 300 containers ?»
La liste des objets que je vais utiliser se trouve sur le projet RosettaCode.
On commence tout de suite avec la création de la population:
Pour ceux qui ne connaissent pas Ruby, Struct
permet de définir rapidement
une classe simpliste, une espèce de POxO (Plain Old “insérez votre langage”
Object). La classe KnapsackItem
aura donc 3 accesseurs: name
, weight
et
value
. On pourra accéder à la liste des objets avec Knapsack::ITEMS
.
Maintenant la classe Individual
:
Un chromosome est défini comme un Array de booléens:
Chaque case de l’Array nous indique si un objet est sélectionné (true) ou non (false).
J’ai aussi ajouté 2 nouvelles méthodes à cette classe. Tout d’abord
chromosome_as_list
produit une chaîne de caractères avec la liste
des objets sélectionnés dans le chromosome. Puis la méthode >
nous
sera utile pour comparer deux chromosomes.
Reste la classe Population
, qui est identique à ce que nous avons
déjà écrit avec d’autres algorithmes génétiques:
La prochaine fois on verra une première version de la méthode d’évaluation.
À demain.