Closed laowantong closed 4 years ago
Ce n'est pas mon instance «fétiche», c'est une instance que j'avais sous la main quand vous m'avez demandé de créé un test pour le FPTAS, je l'ai donc exécutée à la main et mise en ligne.
C'est un erreur qu'il n'y ait pas de poids à la racine, c'est le seul sommet pour lequel on est sûr qu'il doit y avoir un poids car il faut que les tuiles aient une hiérarchie en forme d'arbre.
Je ne suis pas sûre de bien comprendre le deuxième appel à difference()
mais je suis presque sûre qu'il faille laisser le premier car je crois qu'il dit qu'il ne faut pas supprimer la racine.
Je suis étonné que tu aies pu passer une demi-heure à dérouler une instance que tu as toi-même construite sans te rendre compte que la racine avait un poids de zéro. Maintenant que je te le fais remarquer, tu dis que ce poids doit être non nul et que c'était une erreur.
Jusqu'à plus ample informé, je pense quant à moi que rien n'empêche que le poids de la racine soit nul, idem pour les feuilles (leaves en anglais) ou tout autre nœud, et je vais modifier en conséquence l'algorithme de génération.
Bien sûr, je reviendrai volontiers en arrière si tu me fournis une preuve que l'existence d'une racine de poids non nul est requis. Une petite instance contre-exemple fera aussi parfaitement l'affaire.
Écrire « il faut », même en gras, n'est pas suffisant.
Je ne dis pas que les algorithmes risquent de ne pas marcher ou quoi que ce soit. Je dis que c'est nécessaire qu'il y ait une racine car c'est le cas dans lequel on s'est placés pour effectuer ce travail. Je n'ai pas de contre exemple à donner car il n'y en a pas. Nous avons fait une réflexion sur le cas où il y a une hiérarchie dans les tuiles, je ne vais pas abandonner maintenant cette hiérarchie.
Il ne s'agit « d'abandonner » cette hiérarchie. Juste de ne pas exclure arbitrairement les cas, parfaitement valides, qu'on appelle « dégénérés ».
Si tu écris un algorithme ou une preuve sur les triangles (par exemple un calcul d'aire), tu ne vas pas exclure a priori les triangles plats. Ce n'est pas pour autant que tu abandonneras la notion de triangle.
Une hiérarchie sans racine, avec des feuilles manquantes, ou même un bin-packing (i.e., sans symbole commun) sont autant de cas dégénérés parfaitement dignes de considération.
Le débat est donc clos, sauf contre-argument mathématique ou algorithmique de ta part, auquel cas je t'engage à rouvrir cette issue.
En ebac760 j'ai ajouté trois paramètres permettant de configurer le générateur d'instances :
tile_min_size
pour éviter de se retrouver avec des tuiles de taille triviale (a priori 0 ou 1) après suppression de nœuds de l'arbre complet.common_symbol_min_count
et common_symbol_max_count
pour contraindre le nombre de symboles (racine ou autres) communs à toutes les tuiles. Comme, pour des raisons qui m'échappent toujours, tu semblais tenir à ce qu'il y en ait au moins un (sauf dans la fameuse « instance que tu avais sous la main quand je t'ai demandé de créer un test pour le FPTAS, que tu as donc exécutée à la main et mise en ligne »), je t'ai donné la possibilité de mettre common_symbol_min_count
à 1 si tu le souhaites.NB: Ces éventuels symboles communs étant forcément affectés aux 2 bins, c'est dans un pré-traitement qu'il faudrait les affecter, et non dans l'algorithme proprement dit. Pour faciliter cela, j'ai ajouté un champ common_symbols
dans l'instance générée. Mais clairement le mieux serait qu'il n'y ait pas de symboles communs du tout (i.e., common_symbol_min_count
== common_symbol_max_count
== 0).
Avec la nouvelle numérotation, je pense qu'il n'y a plus aucune raison de conserver des symboles de poids nul, qui ne font qu'encombrer les données manipulées lors de la résolution.
Je m'aperçois que dans ton instance fétiche, le poids de la racine était à zéro (autrement dit, il n'y a pas de symbole commun à toutes les tuiles). Je ne me souviens plus trop de notre discussion à ce sujet, il me semble que j'en était arrivé à la conclusion que tu avais besoin de conserver systématiquement la racine et les feuilles, mais je n'en vois plus l'utilité. Dans la méthode ci-dessous : https://github.com/pagination-problem/tree_structure/blob/21a843dfc7d25e0598830efe19c75f1f669bb58a/instance_maker.py#L32-L42 j'envisage donc de supprimer les deux appels à
différence()
en ligne 38. Pas d'objection ?