《Netlogo多主体建模入门》笔记 8

8 -GINI系数计算与 如何使用行为空间做实验

该系列笔记基于集智乐园的《Netlogo多主体建模入门》课程,感谢张江老师与各位志愿者的辛勤付出。

  • 集智乐园 《Netlogo多主体建模入门》 https://campus.swarma.org/play/play?id=429

 

 

 

首先,我们加入保底机制。

对于每一个agent,都有一个随机的保底比例 s(每个agent的 s 不都一样,且s初始化之后不会改变)

进行交易时,双方会保留一部分的财富作为保底财富,只拿一部分出来交易。

《Netlogo多主体建模入门》笔记 8_第1张图片

 

《Netlogo多主体建模入门》笔记 8_第2张图片

 

 

GINI系数的计算

它是以下图中 S 面积的两倍。

《Netlogo多主体建模入门》笔记 8_第3张图片

用积分的思想,底乘高

( i/num_ag ents)* (wealth_so_far/total_wealth)

《Netlogo多主体建模入门》笔记 8_第4张图片

 

《Netlogo多主体建模入门》笔记 8_第5张图片


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 自带的 “行为空间” 工具

《Netlogo多主体建模入门》笔记 8_第6张图片

新建一个行为空间

《Netlogo多主体建模入门》笔记 8_第7张图片

 

  • 实验名称
  • 组合起来不同的参数。

有两种方法:

1. 列出参数的取值;

示例: [ "para" 1, 3 ,8 ,9 ]

2. 指定参数的 初值、增量、终值(需要额外的中括号)。

示例: ["agent_num" [10 10 100]]

  • 对于每一组参数的实验,需要 重复多次
  • 调用报告函数 ,这个函数负责绘制每一组参数下的 gini 系数
  • 设置每一次实验的 终止时间步数

《Netlogo多主体建模入门》笔记 8_第8张图片

 

  • 实时更新 视图
  • 实时更新 绘图 和 监视器
  • 最大并行运算数

《Netlogo多主体建模入门》笔记 8_第9张图片

  • 然后会让你选择需要存放 csv 数据表格的目录

《Netlogo多主体建模入门》笔记 8_第10张图片

  • 取消 这两项实时更新的话,数据会跑的比之前快很多

《Netlogo多主体建模入门》笔记 8_第11张图片

 

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多主体建模入门,数据仿真,Netlogo)