8 -GINI系数计算与 如何使用行为空间做实验
该系列笔记基于集智乐园的《Netlogo多主体建模入门》课程,感谢张江老师与各位志愿者的辛勤付出。
- 集智乐园 《Netlogo多主体建模入门》 https://campus.swarma.org/play/play?id=429
首先,我们加入保底机制。
对于每一个agent,都有一个随机的保底比例 s(每个agent的 s 不都一样,且s初始化之后不会改变)
进行交易时,双方会保留一部分的财富作为保底财富,只拿一部分出来交易。
GINI系数的计算
它是以下图中 S 面积的两倍。
用积分的思想,底乘高
( i/num_ag ents)* (wealth_so_far/total_wealth)
turtles-own [
money
save_rate ;; 新增了一个保底比例
]
to setup
clear-all
create-turtles agent_num[
setxy random-xcor random-ycor
set money (total_money / agent_num)
set save_rate random-float 1 ;;对于每一个人来说,这个保底比例不一样
]
reset-ticks
end
to go
ask turtles[
let agsets other turtles-here
if count agsets >= 1 [
transaction (one-of agsets)
]
forward 1
]
tick
end
to transaction [trader]
let deltam 0
let money1 ([money] of trader)
let epsilon (random-float 1)
set deltam (epsilon - 1) * money + epsilon * money1
if money + deltam >= 0 and money1 - deltam >= 0
[
set money money + deltam
ask trader[
set money money1 - deltam
]
]
end
to go2
ask turtles[
let agsets other turtles-here
if count agsets >= 1 [
transaction2 (one-of agsets)
]
forward 1
]
tick
end
to transaction2 [trader] ;; go2 按钮调用的函数
let deltam 0
let money0 ( (1 - save_rate) * money) ;; 自己拿出来交易的财富
let money1 ( (1 - ([save_rate] of trader)) * ( [money] of trader)) ;; 另外一个人拿出来交易的财富
let epsilon (random-float 1) ;; 随机分割财富的系数
set deltam (epsilon - 1) * money0 + epsilon * money1
if money + deltam >= 0 and ([money] of trader) - deltam >= 0
[
set money money + deltam
ask trader[
set money money - deltam
]
]
end
to to-update-plot
let lst [money] of turtles
set-histogram-num-bars 100
if not empty? lst [
set-plot-x-range 0 max lst
histogram lst
]
end
to save-file
file-open "ag.txt"
let wealths""
ask turtles[
set wealths (word wealths money "\r\n")
]
file-print wealths
file-close
end
to lorenz-plot
clear-plot
set-current-plot-pen "equal"
plot 0
plot 1
set-current-plot-pen "dominant"
plot-pen-down
plotxy 0 0
plotxy 1 0
plotxy 1 1
plot-pen-up
set-current-plot-pen "lorenz"
set-plot-pen-interval 1 / agent_num
plot 0
let sorted-wealths sort [money] of turtles
let total-weath sum sorted-wealths
let weath-sum-so-far 0
let index 0
let gini-s 0 ;;
repeat agent_num [
set weath-sum-so-far (weath-sum-so-far + item index sorted-wealths)
plot (weath-sum-so-far / total-weath)
set index (index + 1)
set gini-s gini-s + ((index / agent_num) - (weath-sum-so-far / total-weath)) / agent_num
;;
]
set-current-plot "吉尼系数"
plot gini-s * 2
end
to-report compute-gini ;;行为空间调用的重复函数
let sorted-wealths sort [money] of turtles
let total-weath sum sorted-wealths
let weath-sum-so-far 0
let index 0
let gini-s 0
repeat agent_num [
set weath-sum-so-far (weath-sum-so-far + item index sorted-wealths)
plot (weath-sum-so-far / total-weath)
set index (index + 1)
set gini-s gini-s + ((index / agent_num) - (weath-sum-so-far / total-weath)) / agent_num
]
set-current-plot "吉尼系数"
report gini-s * 2
end
行为空间
用处:
- 为了找出哪组参数控制下的 某个参数最高,我们需要重复实验,但是手动太麻烦了,我们可以用netlogo 自带的 “行为空间” 工具
新建一个行为空间
- 实验名称
- 组合起来不同的参数。
有两种方法:
1. 列出参数的取值;
示例: [ "para" 1, 3 ,8 ,9 ]
2. 指定参数的 初值、增量、终值(需要额外的中括号)。
示例: ["agent_num" [10 10 100]]
- 对于每一组参数的实验,需要 重复多次
- 调用报告函数 ,这个函数负责绘制每一组参数下的 gini 系数
- 设置每一次实验的 终止时间步数
- 实时更新 视图
- 实时更新 绘图 和 监视器
- 最大并行运算数
- 然后会让你选择需要存放 csv 数据表格的目录
- 取消 这两项实时更新的话,数据会跑的比之前快很多
to-report compute-gini ;; 这个函数是需要输出的
let sorted-wealths sort [money] of turtles
let total-weath sum sorted-wealths
let weath-sum-so-far 0
let index 0
let gini-s 0
repeat agent_num [
set weath-sum-so-far (weath-sum-so-far + item index sorted-wealths)
plot (weath-sum-so-far / total-weath)
set index (index + 1)
set gini-s gini-s + ((index / agent_num) - (weath-sum-so-far / total-weath)) / agent_num
]
set-current-plot "吉尼系数"
report gini-s * 2
end