Le dilemme du projet est un outil de simulation pour tester les algorithmes dans le dilemme du prisonnier. Il fournit une interface standard pour définir à la fois des classes d'algorithme et de simulation afin qu'elles puissent être facilement testées. Inspiré par cette vidéo Veritasium.
pip install project-dilemmapip install . Le dilemme du projet essaiera automatiquement de charger la configuration à partir des répertoires de configuration de l'utilisateur et du système, généralement définis par $XDG_CONFIG_DIRS . Pour la plupart des utilisateurs de Linux, cela vérifiera ~/.config/project_dilemma et eux quelque part dans /etc
Ce comportement peut être remplacé en spécifiant l'indicateur --config Configage dans le fichier de configuration que vous souhaitez utiliser.
Le dilemme du projet utilise le format Toml pour les fichiers de configuration. Il s'agit d'un format lisible par l'homme facile à écrire. Le schéma a été fourni ci-dessous:
simulation_id = " name of simulation "
algorithms_directory = " /path/to/algorithms/ "
nodes = [ { node_id = " node_1 " , algorithm = { file = " foo.py " , object = " Foo " }, quantity = 11 },
{ node_id = " node_2 " , algorithm = { file = " bar/baz.py " , object = " Baz " } } ]
simulation = { file = " foobar.py " , object = " GenerationalFooBar " }
generational_simulation = { file = " foobar.py " , object = " FooBar " }
simulation_arguments = { foo = " bar " }
simulation_data = " path/to/round.json "
simulation_data_output = " path/to/round.json "
simulation_results_output = " path/to/results.json "
simulations_directory = " /path/to/simulations/ "Étant donné que beaucoup d'objets, tels que les algorithmes et les simulations, peuvent ou doivent être fournis par l'utilisateur, ces données doivent être importées dynamiquement. Afin d'importer facilement ces objets sans importer chaque simulation et algorithme, le format suivant peut être utilisé pour indiquer au programme où chercher les importations:
{ file = " path/to/file " , object = " ObjectToImport " }Les algorithmes peuvent être définis très facilement. Seules quatre choses doivent être faites pour sous-classer l'interface de l'algorithme:
algorithm_iddecide La fonction decide est ce que la simulation utilise pour exécuter l'algorithme. Il accepte un objet project_dilemma.interfaces.base.Rounds qui peut être utilisé pour obtenir les résultats des tours antérieurs. La fonction doit retourner True pour la coopération et False pour la défection.
Si vous souhaitez ajouter des mutations, définissez la liste de mutations statique après avoir défini la classe comme pour éviter les importations circulaires.
Un modèle a été fourni dans templates/algorithm_template.py pour une facilité d'utilisation.
Simulations un plus compliqué à configurer par rapport aux algorithmes. Il vous suffit de remplacer les méthodes run_simulation ET process_simulation , mais celles-ci sont incroyablement importantes.
run_simulation renvoie un project_dilemma.interfaces.base.Simulations objet qui sera utilisé par process_simulation pour obtenir les résultats.
Par exemple, les simulations standard fournies traitent les données rondes pour calculer les scores pour chaque nœud qu'un modèle peut être trouvé dans templates/simulation_template.py .
Les simulations générationnelles sont trompeusement simples. Il n'y a qu'une seule fonction à remplacer: generational_hook . Cependant, cela signifie que tout le traitement générationnel doit être effectué dans cette fonction.
Un modèle a été fourni dans templates/generational_simulation_template.py .
Copyright 2023 Gabriele Ron
Licencié sous la licence Apache, version 2.0 (la "licence"); Vous ne pouvez pas utiliser ce fichier sauf conforme à la licence. Vous pouvez obtenir une copie de la licence à
http://www.apache.org/licenses/LICENSE-2.0
Ce projet utilise le projet PlatformDirs qui est autorisé sous la licence MIT. Copyright (c) 2010-202x Les développeurs de plate-forme