《Netlogo多主體建模入門》筆記8

 

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
相關文章
相關標籤/搜索