Меня несколько заинтриговала диаграмма, изображенная здесь, представляющая 1800 лет истории культуры в воображаемом мире, который создал какой-то парень.
Казалось бы, у такого рода приложений есть сильные приложения для разработки игр, в том числе мировой дизайн.
Похоже, он сделал эту диаграмму вручную. Меня интересует, есть ли способ создать диаграмму такого рода программно.
Если бы вам было поручено создавать диаграммы в стиле вышеупомянутого из случайных значений, как бы вы поступили? Существуют ли какие-либо конкретные структуры данных или алгоритмы, которые вы бы рассмотрели?
architecture
algorithm
pdusen
источник
источник
Ответы:
Насколько точным ты хочешь быть? Хороший, но сложный выбор будет моделировать всю эту историю:
Например: две соседние воюющие цивилизации имеют более высокую вероятность начала войны друг с другом, что приводит к снижению численности населения с течением времени. Торговые цивилизации имеют более высокие ресурсы, но являются отличной целью для вторжений. Густонаселенные будут расти быстрее, но также имеют больше шансов голода. Культурно-неоднородные цивилизации имеют меньшую вероятность внутренних войн (что может привести к распадам). И т. Д. Результаты также изменят характеристики цивилизации: более высокие технологии ведут к лучшей торговле, более сильному оружию и т. Д.
Это позволяет также использовать некоторые процедурные повествования: вы можете выводить не только диаграмму территории, но и текстовые описания истории на протяжении всего времени. Вы можете сделать эту систему настолько сложной, насколько захотите.
РЕДАКТИРОВАТЬ: задача здесь не техническая, а корректировка эвристики для реалистичной и интересной генерации истории. Присмотритесь поближе и подумайте о трех вышеупомянутых моментах ... это в значительной степени ваше техническое объяснение! Переведите это в цикл (каждая итерация может представлять столько времени, сколько вы хотите, 1 год, полгода, 1 месяц ...) и все. Вам придется работать с внутренностями (структура данных, эвристика) и адаптировать его к вашей конкретной проблеме и потребностям. Это самая сложная часть, и никто не может вам помочь, так как речь идет о воображении, пробах и ошибках.
Для этой проблемы нет общих структур данных, кроме тех, которые вы будете использовать практически для любой задачи: списки, очереди, деревья ... и они будут привязаны к вашей конкретной реализации (нужно ли мне генеалогическое дерево? Список цивилизаций) на войне - очередь заданий для каждой цивилизации ?) Конечно, вам нужен и список цивилизаций. Выбор очевиден и в значительной степени основан на здравом смысле.
Симуляция - это случайность / вероятность, и вы можете сделать это тысячами разных способов со случайными числами. Подумайте о любой другой игре, в которой задействованы симуляторы, такие как футбольные менеджеры, RPG (в конце концов, хитпоинты / статистика - это просто боевой симулятор ), стратегические игры ... Это всего лишь характеристики (так что вам понадобится способ хранения характеристик и данных цивилизации) и случайные результаты статистически основаны на них (так что вам придется случайным образом изменять состояние моделирования на основе этих характеристик).
В этом суть вашего алгоритма: сложная настройка эвристики: как распределить характеристики в начале симуляции для каждой цивилизации и как статистически изменить состояние симуляции на их основе.
Вкратце: ваш алгоритм - это просто цикл, в котором моделируется время с любым желаемым приращением. Более короткие приращения приводят к более точному историческому моделированию, но, очевидно, займут больше времени. Внутри вашего цикла будет несколько эвристик вроде (примерно):
После всей этой работы (или во время, если вы не хотите сохранять данные) вы должны интерпретировать все состояния симуляции в удобочитаемый для человека формат, такой как текст, изображения или что угодно. Это тоже метод проб и ошибок, очень специфичный для вашей реализации.
Конкретно для вашего вопроса: чтобы сгенерировать диаграмму наподобие той, что в вашем вопросе, вам нужно отслеживать регионы мира (верхняя часть диаграммы, ось x, это точка 1: создать список регионов в моем ответе) и их цивилизации (цвета в диаграмма, точка 2 ) через время (ось у, цикл моделирования в точке 3 )
Государственные машиныдовольно хорошо имитируют широкие темы (пример кода выше является приближением к жестко запрограммированному конечному автомату), поэтому вы можете начать с реализации простой структуры конечного автомата, которую в целом легко настроить. Каждая цивилизация начиналась с одного из этих конечных автоматов, и симуляция запускала каждый конечный автомат для каждого хода. Каждый конечный автомат должен был бы иметь возможность взаимодействовать с другим конечным автоматом: например, начало войны повлияет на конечный автомат другой цивилизации, возможно, с различными результатами, основанными на их внутреннем состоянии - например, если они находятся в состоянии «голода», они, вероятно, будут Я хочу договориться о мире, но цивилизация, «ищущая проблемы», скорее всего, отомстит. Каждое состояние в машине будет иметь существенное влияние на цивилизацию » s метрики, обозначенные выше в каждом «кадре» (богатство, агрессивность, население и т. д.). Самое главное, что вам не нужно переходить в каждом кадре - именно тогда, когда появляется возможность и / или случайный шанс: это позволяет происходить длительным событиям (таким как война).
источник
Да, есть. Вот простой в использовании генератор истории:
Который производит вывод как это:
Настройте эвристику для создания разных графиков.
Самый простой способ сделать это - изменить
func = random.choice([merge, split, revolt, conquest])
строку, чтобы иметь более одной функции с одинаковым именем. Например, страныfunc = random.choice([merge, split, revolt, conquest, merge, merge])
будут объединяться чаще.источник