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