Проектная дилемма является инструментом моделирования для алгоритмов тестирования в дилемме заключенного. Он обеспечивает стандартный интерфейс для определения как алгоритма, так и классов моделирования, чтобы их можно было легко протестировать. Вдохновлен этим видео Veritasium.
pip install project-dilemmapip install . Дилемма проекта автоматически попытается загрузить конфигурацию из каталогов конфигурации пользователя и системы, обычно установленных $XDG_CONFIG_DIRS . Для большинства пользователей Linux это будет проверять ~/.config/project_dilemma и их где -то в /etc . Д.
Это поведение может быть переопределено, указав флаг --config в файл конфигурации, который вы хотите использовать.
Project Dilemma использует формат TOML для файлов конфигурации. Это читаемый на человеке формат, который легко написать. Схема была представлена ниже:
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/ "Поскольку многие объекты, такие как алгоритмы и моделирование, могут или должны быть предоставлены пользователем, эти данные должны быть динамически импортировать. Чтобы легко импортировать эти объекты без импорта каждого моделирования и алгоритма, можно использовать следующий формат, чтобы рассказать программе, где искать импорт:
{ file = " path/to/file " , object = " ObjectToImport " }Алгоритмы могут быть определены очень легко. Только четыре вещи должны быть сделаны для подкласса интерфейса алгоритма:
algorithm_iddecide Функция decide - это то, что моделирование использует для запуска алгоритма. Он принимает объект project_dilemma.interfaces.base.Rounds , который можно использовать для получения результатов предыдущих раундов. Функция должна вернуть True для сотрудничества и False для дефицита.
Если вы хотите добавить мутации, установите список статических мутаций после определения класса, чтобы избежать круговых импортов.
Шаблон был предоставлен в templates/algorithm_template.py для простоты использования.
Моделирование более сложное для настройки по сравнению с алгоритмами. Вам нужно только переопределить методы run_simulation и process_simulation , но они невероятно важны.
run_simulation Возвращает объект project_dilemma.interfaces.base.Simulations , который будет использоваться process_simulation для получения результатов.
Например, предоставленное стандартное моделирование обрабатывает данные раундов для вычисления баллов для каждого узла. Шаблон можно найти в templates/simulation_template.py .
Моделирование поколений обманчиво просты. Есть только одна функция для переопределения: generational_hook . Однако это означает, что вся обработка поколений должна быть выполнена в этой функции.
Шаблон был предоставлен в templates/generational_simulation_template.py .
Copyright 2023 Габриэле Рон
Лицензировано по лицензии Apache, версия 2.0 («Лицензия»); Вы не можете использовать этот файл, кроме как в соответствии с лицензией. Вы можете получить копию лицензии на
http://www.apache.org/licenses/LICENSE-2.0
Этот проект использует проект PlatformDirs, который лицензирован по лицензии MIT. Copyright (C) 2010-202x разработчики PlatformDirs