El dilema del proyecto es una herramienta de simulación para probar algoritmos en el dilema del prisionero. Proporciona una interfaz estándar para definir las clases de algoritmo y simulación para que puedan probarse fácilmente. Inspirado en este video de Veritasium.
pip install project-dilemmapip install . El dilema del proyecto intentará cargar automáticamente la configuración de los directorios de configuración del usuario y del sistema, generalmente establecido por $XDG_CONFIG_DIRS . Para la mayoría de los usuarios de Linux, esto verificará ~/.config/project_dilemma y ellos en algún lugar de /etc .
Este comportamiento se puede anular especificando el indicador --config al archivo de configuración que desea usar.
El dilema del proyecto utiliza el formato TomL para archivos de configuración. Este es un formato legible por humanos que es fácil de escribir. El esquema se ha proporcionado a continuación:
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/ "Debido a que muchos de los objetos, como los algoritmos y las simulaciones, pueden o deben ser proporcionadas por el usuario, estos datos deben importarse dinámicamente. Para importar fácilmente estos objetos sin importar cada simulación y algoritmo, el siguiente formato se puede usar para decirle al programa dónde buscar las importaciones:
{ file = " path/to/file " , object = " ObjectToImport " }Los algoritmos se pueden definir muy fácilmente. Solo se deben hacer cuatro cosas para subclase la interfaz de algoritmo:
algorithm_iddecide La función decide es lo que usa la simulación para ejecutar el algoritmo. Acepta un objeto project_dilemma.interfaces.base.Rounds que puede usarse para obtener los resultados de rondas anteriores. La función debe devolver True para la cooperación y False para la deserción.
Si desea agregar mutaciones, establezca la lista de mutaciones estáticas después de definir la clase para evitar las importaciones circulares.
Se ha proporcionado una plantilla en templates/algorithm_template.py para facilitar su uso.
Las simulaciones son más complicadas de configurar en comparación con los algoritmos. Solo necesita anular los métodos run_simulation y process_simulation , pero estos son increíblemente importantes.
run_simulation Devuelve un objeto project_dilemma.interfaces.base.Simulations que será utilizado por process_simulation para obtener los resultados.
Por ejemplo, las simulaciones estándar proporcionadas procesan los datos de la redacción para calcular las puntuaciones para cada nodo, una plantilla se puede encontrar en templates/simulation_template.py .
Las simulaciones generacionales son engañosamente simples. Solo hay una función para anular: generational_hook . Sin embargo, esto significa que todo el procesamiento generacional debe hacerse en esta función.
Se ha proporcionado una plantilla en templates/generational_simulation_template.py .
Copyright 2023 Gabriele Ron
Licenciado bajo la licencia Apache, versión 2.0 (la "licencia"); No puede usar este archivo, excepto de conformidad con la licencia. Puede obtener una copia de la licencia en
http://www.apache.org/licenses/LICENSE-2.0
Este proyecto utiliza el proyecto PlatformDirs que tiene licencia bajo la licencia MIT. Copyright (c) 2010-202x Los desarrolladores de PlatformDirs