Project Dilemma ist ein Simulationsinstrument zum Testen von Algorithmen im Dilemma des Gefangenen. Es bietet eine Standardschnittstelle, um sowohl Algorithmus- als auch Simulationsklassen so zu definieren, dass sie leicht getestet werden können. Inspiriert von diesem Veritasium -Video.
pip install project-dilemmapip install . Project Dilemma versucht automatisch, die Konfiguration aus den Konfigurationsverzeichnissen des Benutzers und des Systems zu laden, die normalerweise durch $XDG_CONFIG_DIRS festgelegt werden. Für die meisten Linux -Benutzer wird ~/.config/project_dilemma und sie irgendwo in /etc . überprüft.
Dieses Verhalten kann überschrieben werden, indem das Flag --config -Flag in der Konfigurationsdatei angegeben wird, die Sie verwenden möchten.
Das Projektdilemma verwendet das TOML -Format für Konfigurationsdateien. Dies ist ein menschliches lesbares Format, das leicht zu schreiben ist. Das Schema wurde unten bereitgestellt:
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/ "Da viele Objekte, wie die Algorithmen und Simulationen, vom Benutzer bereitgestellt werden können oder müssen, müssen diese Daten dynamisch importiert werden. Um diese Objekte einfach zu importieren, ohne jede Simulation und jeden Algorithmus zu importieren, kann das folgende Format verwendet werden, um das Programm zu mitteilen, wo nach den Importen gesucht werden soll:
{ file = " path/to/file " , object = " ObjectToImport " }Algorithmen können sehr leicht definiert werden. Es müssen nur vier Dinge getan werden, um die Algorithmus -Schnittstelle zu unterklassen:
algorithm_iddecide Die decide verwendet die Simulation, um den Algorithmus auszuführen. Es akzeptiert ein project_dilemma.interfaces.base.Rounds -Objekt, mit dem die Ergebnisse früherer Runden erzielt werden können. Die Funktion sollte für die Kooperation True und für den Überfall False zurückkehren.
Wenn Sie Mutationen hinzufügen möchten, legen Sie die statische Mutationsliste fest, nachdem Sie die Klasse definiert haben, um kreisförmige Importe zu vermeiden.
Eine Vorlage wurde in templates/algorithm_template.py zur einfachen Verwendung bereitgestellt.
Simulationen ist im Vergleich zu Algorithmen eine kompliziertere Konfiguration. Sie müssen nur die Methoden run_simulation und process_simulation überschreiben, aber diese sind unglaublich wichtig.
run_simulation gibt ein project_dilemma.interfaces.base.Simulations -Objekt zurück, das von process_simulation verwendet wird, um die Ergebnisse zu erhalten.
Beispielsweise verarbeiten die bereitgestellten Standardsimulationen die Rundendaten, um die Bewertungen für jeden Knoten zu berechnen. Eine Vorlage finden Sie in templates/simulation_template.py .
Generationensimulationen sind täuschend einfach. Es gibt nur eine Funktion zu überschreiben: generational_hook . Dies bedeutet jedoch, dass in dieser Funktion die gesamte Generationsverarbeitung durchgeführt werden muss.
Eine Vorlage wurde in templates/generational_simulation_template.py bereitgestellt.
Copyright 2023 Gabriele Ron
Lizenziert unter der Apache -Lizenz, Version 2.0 (der "Lizenz"); Sie dürfen diese Datei nur in Übereinstimmung mit der Lizenz verwenden. Sie können eine Kopie der Lizenz bei erhalten
http://www.apache.org/licenses/LICENSE-2.0
Dieses Projekt nutzt das PlatformDirs -Projekt, das im Rahmen der MIT -Lizenz lizenziert ist. Copyright (C) 2010-202X Die PlatformDirs-Entwickler