8 -GINI系数计算与 如何使用行为空间做实验
首先,我们加入保底机制。
对于每一个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