Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Résolution des plus court chemins et des cycles hamiltioniens en python (Thibaut Juzeau) #1

Open
wants to merge 33 commits into
base: master
Choose a base branch
from

Conversation

Thiebosh
Copy link

@Thiebosh Thiebosh commented Jul 2, 2021

Pour le plus court chemin, il y a :

  • Un A* qui génère une base de travail correcte,
  • Un "déboucleur" qui repère les points ayant plus d'un voisin et excise la portion inutile,
  • Un "lisseur" qui retire les ponts que peut laisser le déboucleur ou A*.

Pour le cycle hamiltonien, il y a :

  • Un générateur de chemin qui prend un point parmi les 10 plus proches :
    -- Les points sont transformés en "probabilité de sélection" (suite des inverses des distances) pour augmenter la proba de sélection des plus proches,
    -- Le tirage se fait selon une loi binomiale plus proche de 1 que de 0, pour tendre vers un point à courte distance tout en laissant un potentiel d'exploration.
  • Un "looper" qui garde le meilleur chemin parmi x générations (en l'occurrence 10),
  • Un "déboucleur" qui repère les intersections de segments et les décroise,
  • Un "lisseur 4 points" qui compare les deux combinaisons de segment et ressort la meilleure combinaison,
  • Un "lisseur 5 points" qui prend la meilleure combinaison possible sur un plus grand spectre,
  • Un second "looper" qui se charge d'appliquer l'algo d'optimisation transmis tant que le trajet est réduit et de conserver le meilleur résultat,
  • Un "super looper" qui se charge d'appliquer les trois derniers algos dans cet ordre (optimal) tant que le trajet est réduit et de conserver le meilleur résultat.

J'ai aussi ajouté une génération de graphe pour visualiser les cycles et m'aider dans ma réflexion.

Notes

Python a une stack d'appels limité à 1.000 par défaut donc, en l'état, cette version ne supporte pas les plus gros jeux de données. Cette limite peut être relevée (sys.setrecursionlimit(nb)) mais je ne l'ai pas fait en prévision d'une réécriture scala.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant