[Algo] Regroupement

Je cherche depuis 20 min un algo sans trouver de véritable piste.

Il s’agit d’un algo qui regroupe des données. Comme un exemple vaut mieux qu’un long discours voici quelques choses de concret.

Voici plusieurs valeurs : 7, 15, 5, 10, 5, 2, 10, 13, 13

Je cherche à faire des groupes de 20, en optimisant on devrait donc trouver :
{15, 5}
{13, 7}
{13, 5, 2}
{10, 10}

Facile à dire, difficile à faire, j’ai commencé à chercher sous google avec des arbres sans rien trouver, il me faudrai juste une piste.

Actuellement, j’ai trouvé un algo moins optimisé qui me donne ça :
{7, 5, 5, 2}
{15}
{10, 10}
{13}
{13}

Il prend les valeurs dans l’ordre.
Si il s’agit de la première valeur, je crée mon premier groupe et je passe à la valeur suivante
Pour les valeurs suivantes :
(1) je met ma valeur dans le premier groupe
(2) si la somme est inférieur à 20, je laisse cette valeur dans ce groupe, sinon je le met dans le groupe suivant et je reviens en (2)
(3) Si il n’y a pas de groupe suivant, je crée un nouveau groupe.

Comme vous pouvez le remarquer, l’algo ci-dessus crée 5 groupes alors qu’il pourrait s’en contenter de 4.
Comment faire ?

Idée comme ca en passant…

En supposant que toutes les valeurs sont strictement inférieures à 20 (sinon faire des tests):

Prendre la première valeur
Tester cette valeur avec toutes les autres (dans l’ordre) pour que ca fasse 20 en additionnant.
Si on tombe sur une bonne valeur on crée le groupe avec les 2 valeurs et on les supprime de la liste.
Sinon rien
Ainsi de suite pour toutes les valeurs restantes puis faire avec 3 valeurs etc… jusqu’à ce qu’il n’y ai plus de valeur (enfin si c’est possible).

Un peu barbare comme méthode mais au moins ca doit etre efficace

Ca marche dans le cas que j’ai donnée mais imaginons qu’il n’y ai aucun groupe de 20 et seulement des groupes de 19. En plus, niveau complexité, l’idée d’essayer d’additionner 2 valeurs ensuite 3 valeurs, … n’est vraiment pas top.

Hmmm, pas vraiment d’idées, mais tu peux déjà améliorer ton algo en rangeant tes données en ordre décroissant, je pense :stuck_out_tongue:

et le même algo en rangeant les valeurs par ordre décroissant?

7, 15, 5, 10, 5, 2, 10, 13, 13
15, 13, 13, 10, 10, 7, 5, 5, 2

ca marche dans ton cas mais c’est peut être la faute de tes valeurs après :
15 5
13 7
13 5 2
10 10

10, 13, 19, 1, 2, 7, 6, 4, 18
19, 18, 13, 10, 7, 6, 4, 2, 1
19 1
18 2
13 7
10 6 4

(grillé pendant mes tests)
Merde ca marche pas en fait :
14, 13, 5, 4, 2, 2
14 5
13 4 2
2
(au lieu de 14, 4, 2 et 13, 5, 2)

Putain, cet algo il existe j’en suis sur, impossible de mettre la main dessus, je continue à fouiller

Effectivement, ca à l’air de marcher si on met dans l’ordre décroissant… à étudier pour voir si il n’existe pas de contre exemple.

Hé, copieur :stuck_out_tongue:
Bah oui, c’est logique de vouloir caser les gros morceaux d’abord, hein…

Cela dit, c’est sûrement un problème d’optimisation classique, en cherchant bien tu devrais trouver de la littérature là-dessus.

[quote=« Soltan, post:7, topic: 28082 »]Hé, copieur :stuck_out_tongue:
Bah oui, c’est logique de vouloir caser les gros morceaux d’abord, hein…

Cela dit, c’est sûrement un problème d’optimisation classique, en cherchant bien tu devrais trouver de la littérature là-dessus.[/quote]
je copie pas, je tourne 7 fois ma langue dans ma bouche avant de poster :stuck_out_tongue:

c’est surement une variante de l’algorithme glouton mais je trouve pas
Si le glouton marche pas, c’est probable que ca soit un algo de flot maximal à cout minimal (mais bon courage), mais je vois pas comment le tourner

edit ca m’énerve de pas trouver, j’ai mailé une prof on verra bien ^^

[quote=« lucasbfr, post:5, topic: 28082 »](grillé pendant mes tests)
Merde ca marche pas en fait :
14, 13, 5, 4, 2, 2
14 5
13 4 2
2
(au lieu de 14, 4, 2 et 13, 5, 2)

Putain, cet algo il existe j’en suis sur, impossible de mettre la main dessus, je continue à fouiller[/quote]

Haa!! domage :stuck_out_tongue:

Je continue de chercher aussi de mon coté… :stuck_out_tongue:

Ya un algo qui s’appelle “Subset Sum” qui fait des truc comme ca.

cool ma prof a répondu:

Le nom du problème, c’est le Bin Packing. Malheureusement, de manière simple il n’y a que des méthodes heuristiques qui fonctionnent à peu près. Le mieux c’est c’est de classer par décroissant et de remplir la 1ere boite comme on faisait tout à l’heure. (d’autres méthodes existent suivant les besoins (remplir la moins vide par exemple))

Soit B la taille des boite et ai les tailles des objets i, on a qques proprietes interessantes :

si B/3 < ai < B (il y a entre 1 et 2 objets par boites) : FFD donne tjs la solution optimale.
si ai <= B/2 FFD est au pire a 18.3 % de l’optimum et plein d’autres choses de ce style.

Par contre dans certains cas il se chie dessus le bougre :stuck_out_tongue: C’est pas un problème polinomial.

Sinon, à un cout plus cher (en CPU), on peut faire du branch and bound (je peux lui demander plus de précisions si tu veux)

Tu me parles quel langue là :stuck_out_tongue:

Déjà merci pour le nom de l’algo, je vais chercher sur internet pour plus d’informations, et n’exite pas à donner plus de détails, je suis preneur.

[Edit]

Je viens de trouver une doc au format PDF, j’aurai du suivre un peu plus de cours d’algo moi, j’ai vraiment du mal avec les termes.

Sinon, une bonne nouvelle, l’algo trouvé en premier associé avec un tri dans l’ordre décroissant s’appelle ‹ First Fit Decreasing ›. Je vais garder celui-ci pour l’instant, il marche « plutot » bien et est assez rapide.

Merci à tous.

huhu je te rassure, y’a des parties c’est du copier coller du mail :stuck_out_tongue:
Ce qu’il faut retenir c’est que FFD (First Fit Decreasingc’est à dire que tu range par ordre décroissant) est pas trop mal dans la plupart des cas, et qu’un truc qui marcherait mieux couterait très cher en temps CPU si t’as beaucoup d’échantillons.

(méthode heuristique = on fait au jugé, sans être sur d’arriver au bon résultat)

Je viens de voir qu’il s’agit de cours de DEA, effectivement, je me suis arreter à la license… :stuck_out_tongue:

Voici le lien pour ceux que ca intéresse :
http://www.loria.fr/~jcohen/enseignement/binpacking.pdf