-
Notifications
You must be signed in to change notification settings - Fork 0
/
simulation.jl
56 lines (47 loc) · 1.69 KB
/
simulation.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
include("./game.jl")
module Simulation
using CSV, DataFrames, Statistics, Random, LightGraphs
using ..Game
export one_episode
function game_loop(model::Game.Model, payoff_matrix::Game.PayoffMatrix, episode::Int)
Game.initialize_strategy!(model)
initial_fc = count_fc(model)
fc_hist = [initial_fc]
dg, dr = payoff_matrix.dg, payoff_matrix.dr
println("Episode: $(episode), Dg: $(dg), Dr: $(dr), Timestep: 0, Fc: $(initial_fc)")
step = 0
while true
step += 1
Game.count_payoff!(model, payoff_matrix)
Game.pairwise_fermi!(model)
fc = Game.count_fc(model)
println("Episode: $(episode), Dg: $(dg), Dr: $(dr), Timestep: $(step), Fc: $(fc)")
push!(fc_hist, fc)
if step >= 100
if (Statistics.mean(fc_hist[end-100:end-1]) - fc) / fc <= 0.001
global solution = Statistics.mean(fc_hist[end-99:end])
break
else fc == 0 || 1
global solution = fc
break
end
end
end
return solution
end
function one_episode(population::Int, topology::SimpleGraph, episode::Int)
Random.seed!()
initial_cooperators = Game.choose_initial_cooperators(population)
model = Game.Model(topology, initial_cooperators)
dilemma_range = 0.0:0.1:1.0
dg_hist, dr_hist, fc_hist = [], [], []
for dg in dilemma_range, dr in dilemma_range
payoff_matrix = Game.PayoffMatrix(dg, dr)
fc = game_loop(model, payoff_matrix, episode)
push!(dg_hist, dg)
push!(dr_hist, dr)
push!(fc_hist, fc)
end
DataFrame(Dg = dg_hist, Dr = dr_hist, Fc = fc_hist) |> CSV.write("./results/episode_$(episode).csv")
end
end