Suite de l'Avent du Code, jour 19.
Les fumées volcaniques n'ont pas fait du bien au Père Noël. Hier, au cœur de la nuée ardente, menacé par des blocs de lave qui filaient de toute part, il n'avait de cesse de calculer leur trajectoire pour les éviter. Ah non, il était occupé à calculer leur refroidissement pour voir si ça allait donner de l'obsidienne.
Bonne nouvelle, on a de l'obsidienne. Mauvaise nouvelle, on s'en est visiblement pris quelques coups sur la tête, ce qui n'a pas arrangé les choses. Les éléphants ont faim et commencent à se rebeller, mais pas de panique, il y a de l'argile, du minerai, de l'obsidienne et des géodes ! Tout ce qu'il faut pour faire à manger construire une armée de robots pour casser un maximum de géodes. Notre sac à dos contient tout ce qu'il faut pour ça, à croire que les lutins avaient prévu le coup.
J'ai du retard Ă rattraper, la solution attendra. :-)
# Modélisation trop longue à débugger
Posté par Yth (Mastodon) . Évalué à  4. Dernière modification le 19 décembre 2022 à 11:44.
J'ai passé un temps fou à débugger ma modélisation pourtant pas si complexe.
Après j'ai rapidement constaté que l'approche naïve était idiote et explosive, donc j'ai testé deux limitation de l'exploration des possibilités :
C'est empirique, j'ai juste testé ces règles sans chercher plus loin : ça valide les données de test !
Donc j'ai testé les données réelles et bingo.
En terme de stats pour les données de test, le nombre de possibilités testées :
Et 2 minutes 20 pour trouver ça, yuk…
Sur les données réelles, j'explore au total 492 462 chemins sur l'exercice 1, avec 30 schémas, et 4 661 927 chemins sur l'exercice 2 avec 3 schémas (les éléphants ont bouffés les autres schémas).
Ce qui ne prend que 44 secondes, donc les données réelles sont plus cool que les données de test, pour une fois.
[^] # Re: Modélisation trop longue à débugger
Posté par Yth (Mastodon) . Évalué à  3.
Et en optimisant un pouille mes structures de données (dataset immutable, ne pas recopier les données statiques dans les nouvelles instances de classes, mais les mettre en dur dans la classe, etc), je descends à 29 secondes pour les données de test et 10s pour les données réelles !
[^] # Re: Modélisation trop longue à débugger
Posté par syj . Évalué à  1.
Gg, Perso, j'y ai passé 2h ce matin et je bloque sur le fait que je ne trouve pas comment arriver à 12 sur le 2ème du test unit.
Je dois avoir un bug qui m'echape.
Malheureusement, j'ai 2 truc urgent qui sont tombé aujourd'hui. Pas sur que je puisse y rebosser aujourd'hui.
et la fin de semaine risque d'être compliqué, je suis en vacances jeudi soir.
[^] # Re: Modélisation trop longue à débugger
Posté par syj . Évalué à  1.
Est ce qu'on peut construire plusieurs robots en un tour ?
C'est probablement çà mon erreur ?
[^] # Re: Modélisation trop longue à débugger
Posté par Yth (Mastodon) . Évalué à  2. Dernière modification le 19 décembre 2022 à 15:24.
Non, on n'a qu'une seule usine de robots, donc c'est un par tour…
À noter ici que la différence entre cpython et pypy est assez délirante.
J'ai nettoyé le code, je suis à 8 secondes avec pypy3, et 2 minutes 30 avec python3 !
[^] # Re: Modélisation trop longue à débugger
Posté par syj . Évalué à  2. Dernière modification le 19 décembre 2022 à 21:01.
Au final, J'aurai mis 35min de plus.
Le problème venait que j'avais mis une règle qui réduisait le nombre d'action possible pendant mon parcours en profondeur
Il met 1min3s pour calculer le 2ème.
Pour une fois , mon code n'est pas trop moche :)
[^] # Re: Modélisation trop longue à débugger
Posté par syj . Évalué à  1.
Petite amélioration, je descends à 6s en modifiant mon DFS
L'idée est de ne pas aller jusqu'au bout si on sait déjà qu'on sera en-dessous du meilleur temps.
```
public static void executeDFS(State state) {
int leftTurn = NB_TURN_32- state.index;
int expGeode = state.geode+(NB_TURN_32-state.index) * (state.geodeRobot) + (leftTurn+1) * (leftTurn + 0) / 2;
if(bestMap.get(state.bp)Â != null && expGeode < bestMap.get(state.bp)) {
return;
}
}
```
[^] # Re: Modélisation trop longue à débugger
Posté par Yth (Mastodon) . Évalué à  2.
C'est pas mal de ne pas aller jusqu'au bout si on sait déjà qu'on sera en-dessous du meilleur temps.
J'ai ajouté un truc comme ça sur mon code, ça fonctionne nickel, et je divise le temps par deux, je suis à 5s pour les deux exercices.
Je passe de 492 462 chemins Ă 46 859 sur l'exo 1.
Et au total de 4 661 927 Ă 755 262 sur l'exo 2.
Vu la réduction sévère du nombre de chemins, je me demande où le temps est perdu tout de même…
[^] # Re: Modélisation trop longue à débugger
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à  4.
Ce n'est pas empirique ça, c'est prouvable. Comme on ne peut construire qu'un robot par tour, récolter plus d'unités de n'importe quelle ressource que la quantité qu'on peut en dépenser ne sert à rien.
[^] # Re: Modélisation trop longue à débugger
Posté par Yth (Mastodon) . Évalué à  2.
Oui, je l'ai fait instinctivement, mais après c'est apparu évident.
En pratique on maximise toujours l'ore dans les chemins gagnants, mais pas en construisant tout d'un coup.
# Du code, du code, du code !
Posté par Yth (Mastodon) . Évalué à  4.
D'abord la modélisation, avec des opérations sur triplets de matière Matters(ore, clay, obsidian). Dans un premier temps j'avais aussi geode, mais en vrai on ne produit, ne consomme, ni ne stocke de geode : c'est le score, on le gère à part.
En vrai ça change pas grand chose…
Un frozen dataclass, et les opérations retournent une nouvelle instance, ça permet d'éviter des risques de modifier un truc référencé ailleurs, et on y gagne en bugs et en perfs au bout du compte.
Chaque blueprint génère une Factory qui ne sert pas à grand chose, c'est des données, c'est figé, ça bouge pas.
Ensuite une classe d'état, State, qui stocke le temps restant, les stocks, la production, et le nombre de géodes à la fin si on touche plus à rien, donc le score actuel de cet état à la fin du temps imparti. Aussi un dataclass, je découvre, j'en mets partout, selon le biais bien connu de waooouh-nouveauté !
Ensuite le code en lui-mĂŞme :
Voilà voilà …
# Erreur bete
Posté par Eric P. . Évalué à  1.
Je suis un peu degoute sur celui-ci, j'ai perdu un temps fou pour une erreur bete.
J'avais du code qui me donnait les bonnes reponses 9 et 12 sur l'exemple, mais beaucoup trop lent.
Du coup je commence a ajouter des heuristiques d'optimisation. J'arrive a faire descendre le temps d'execution dans la minute, je commence a tester et je ne trouve plus que 7 et 10. Je me dis que mes optims sont trop brutales et je perd litteralement des heures a essayer de trouver des optims qui me redonnent le nombre correct… avant de realiser que j'avais introduit un bug et je ne collectais plus les ressources lors de la minute 24…
Bon apres fix de ce probleme, j'ai un algo suffisemment rapide qui me donne les bonnes reponses pour la partie 1, et aussi pour la partie 2.
Je ne garde qu'un nombre fixe d'options a chaque minute, je trie les options par score et je garde le top 200000 (j'aurais pu descendre beaucoup plus bas), donc le temps d'execution est a peu pres lineaire, et la partie 2 ne posait pas de probleme.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Erreur bete
Posté par Eric P. . Évalué à  2.
En fait je peux descendre mon top d'options a garder a chaque minute jusqu'a 100 et les resultats sont toujours corrects:
0.26s elapsed pour l'ensemble des deux parties!part1_quality_with_mult=2193 part2_quality_product=7200
pypy3.9-v7.3.10-linux64/bin/pypy day19.py 0.26s user 0.05s system 52% cpu 0.593 total
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Erreur bete
Posté par Yth (Mastodon) . Évalué à  2.
Parcourir en largeur et virer les chemins pourraves, c'pas mal.
Mon algo parcours en profondeur, j'ai pas cette possibilité sauf à le refaire…
Une idée de comment être raisonnablement sûr que tu as la meilleure solution en limitant à 100 ?
[^] # Re: Erreur bete
Posté par steph1978 . Évalué à  2.
Je dirai qu'il n'y a pas de règle car cela dépend de l'input.
Le code que j'ai pour la partie deux donne la bonne réponse en gardand le top 1000, ne marche pas à 700. Mais sur un autre input que j'ai testé, il a fallu monter à 2000.
[^] # Re: Erreur bete
Posté par Eric P. . Évalué à  1.
En fait j'avais commence par un DFS (en profondeur), et je l'ai reecrit completement en un BFS (en largeur) pour justement pouvoir comparer les chemins et garder les meilleurs.
Au final la partie algo est assez simple et standard, c'est assez simple de convertir un DFS en BFS.
C'est vrai que c'est impossible de savoir quand tu as la meilleure solution.
Pour moi, j'ai commence a 100 000, Advent of code m'a confirme que c'etait le bon resultat, et je suis descendu petit a petit jusqu'a 100. A 50 ca me trouvait moins de geodes.
J'aurais pu faire le contraire, commencer bas, tester dans Advent of Code, puis monter si le resultat etait trop bas.
Comme le dit le commentaire precedent, tout depend des inputs, mais ca depend aussi de la fonction de scoring et si tu as des heuristiques en plus de la fonction de scoring.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.