Quão preciso você quer ser? Uma escolha boa, porém complexa, seria simular toda essa história:
- Gere uma lista de regiões aleatórias e adjacências entre essas regiões.
- Gere civilizações aleatórias com características como população, beligerância, tecnologia ... e preencha as regiões.
- Simule quantos anos de história você desejar, determinando resultados com base nas características da civilização.
Por exemplo: duas civilizações beligerantes adjacentes têm maior probabilidade de iniciar uma guerra entre si, o que leva a uma população menor ao longo do tempo. As civilizações mercantes têm recursos mais altos, mas são um ótimo alvo para invasões. Os altamente populosos crescerão mais rapidamente, mas também terão mais chances de fome. Civs culturalmente heterogêneos têm uma chance menor de guerras internas (o que pode levar a rompimentos.) E assim por diante ... Os resultados também modificam as características da civilização: a alta tecnologia leva a um melhor comércio, armas mais fortes etc.
Isso também permite algumas narrativas processuais: você pode gerar não apenas um diagrama de território, mas também descrições textuais da história ao longo do tempo. Você pode tornar esse sistema tão complexo quanto desejar.
EDIT: o desafio aqui não é técnico, mas é ajustar as heurísticas para gerar uma história realista e interessante. Dê uma olhada e pense nos três pontos mencionados acima ... essa é praticamente a sua explicação técnica! Traduzir para um loop (cada iteração pode representar o tempo que você quiser, 1 ano, meio ano, 1 mês ...) e é isso. Você terá que trabalhar com os internos (estruturas de dados, heurísticas) e adaptá-los ao seu problema e necessidades específicos. Essa é a parte difícil aqui e ninguém pode ajudá-lo, já que se trata de imaginação, tentativa e erro.
Não há estruturas de dados comuns para esse problema além daquelas que você usará para praticamente qualquer problema: listas, filas, árvores ... e elas serão vinculadas à sua implementação específica (preciso de uma árvore genealógica? Uma lista de civilizações em guerra - uma fila de tarefas para cada civil?) É claro que você também precisa de uma lista de civilizações. As escolhas são óbvias e praticamente senso comum.
A simulação é uma questão de chance / probabilidade e você pode fazer isso de mil maneiras diferentes com números aleatórios. Pense em qualquer outro jogo em que a simulação esteja envolvida, como gerentes de futebol, RPGs (afinal, hitpoints / estatísticas são apenas simulações de combate ), jogos de estratégia ... São apenas características (então você precisará de uma maneira de armazenar características e dados da civilização) e resultados aleatórios estatisticamente baseados neles (então você terá que alterar aleatoriamente o estado da simulação com base nessas características).
Essa é a essência do seu algoritmo: as heurísticas difíceis de ajustar: como distribuir características no início da simulação para cada civilização e como alterar estatisticamente o estado da simulação com base nelas.
Em resumo: seu algoritmo é apenas um loop que varia o tempo simulado com qualquer incremento desejado. Incrementos mais curtos levam a uma simulação histórica mais refinada, mas obviamente levarão mais tempo. Dentro do seu loop, haverá várias heurísticas como (aproximadamente):
for each civilization
if civ.isAtWar
civ.population -= civ.population * 0.05;
civ.wealth -= 1000.0;
civ.belligerence += 1.0;
if civ.population < 100
civ.negotiatePeace()
Depois de todo esse trabalho (ou durante, se você não quiser armazenar os dados), você deve interpretar todo o estado da simulação em um formato legível por humanos, como texto, imagens ou o que você desejar. Isso também é tentativa e erro e é muito específico para sua implementação.
Específico à sua pergunta: para gerar um diagrama como o da sua pergunta, você terá que rastrear regiões do mundo (parte superior do diagrama, eixo x, esse é o ponto 1: gerar lista de regiões na minha resposta) e suas civilizações (cores no diagrama, ponto 2 ) ao longo do tempo (eixo y, o loop de simulação no ponto 3 ).
Máquinas de estadosão muito bons em simular tópicos amplos (o exemplo de código acima é uma aproximação de uma máquina de estado codificada) - então você pode começar implementando uma estrutura simples de máquina de estado que é fácil de ajustar. Cada civilização começaria com uma dessas máquinas de estado e a simulação executaria cada máquina de estado a cada turno. Cada máquina de estado precisaria ser capaz de interagir com outra máquina de estado: por exemplo, iniciar uma guerra afetaria a máquina de estado de outra civilização, possivelmente com resultados diferentes com base em seu estado interno - por exemplo, se eles estiverem no estado de "fome", provavelmente deseja negociar a paz, mas uma civilização que "esteja em busca de problemas" provavelmente retaliará. Cada estado na máquina teria efeitos significativos na civilização ' métricas descritas acima durante cada 'quadro' (riqueza, beligerância, população etc.). Mais importante ainda, você não precisa fazer a transição de estados em todos os quadros - exatamente quando surgem oportunidades e / ou chances aleatórias: isso permite que eventos prolongados (como a guerra) ocorram.