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

 

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