rufo Pas me confondre avec Lycos! | Une autre approche possible, c'est de passer par des algos génétiques.
Chaque "individu" est représenté par une des 0 et des 1, chaque case correspondant à un "gène", ici, l'un des nb. 1, on prend le nb dans la fonction d'éval, 0, on le prend pas. La fonction d'éval est la somme des gènes pris. L'individu est conservé si sa fonction d'éval est égale au nb recherché.
Pour générer la génération suivante, on défini 2 points de "coupure" dans les gènes (ex : après 2 ème et après le 7ème), et on prend la partie basse de l'individu qui contient les 0 et 1 (donc les gènes de 8 à 16) qu'on place en début de l'individu de la nouvelle génération, et la partie haute qu'on place à la fin de l'individu de la nouvelle génération (en gros, on donne 2 coup de ciseaux sur l'individu de la génération N, on a 3 morceaux, le morceau central reste à sa place sur l'individu de la génération N+1 et on inverse la place des 2 morceaux restants).
Cette méthode, sur des ensembles de données importants, donne de bons résultats. Comme toute heuristique, il faut bien adapter la taille de la population et le nb d'itérations pour être sûr d'avoir les meilleurs individus
J'avais développé cet algo pour 2 cas :
1) plusieurs fichiers dans la somme des tailles était > la somme des CDs à graver -> fallait trouver les fichiers à prendre (donc pas tous) pour minimiser la place perdue sur chaque CD.
2) j'ai x tickets restos pour payer des pizzas -> trouver toutes les combinaisons de pizzas (petites ou grandes) dont la somme des prix fait exactement la somme des montants des tickets restos (ben oui, on rend pas la monnaie dessus). Ce 2ème cas est proche du pb exposé par l'auteur de ce topic ---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
|