⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ---assort-mating.nlogo

📁 NETLOGO
💻 NLOGO
📖 第 1 页 / 共 2 页
字号:
globals [rank_ave_m ; average rank of partnered menrank_ave_w  ; average rank of partnered womenrank_t_m  ; sum of all rankings for partnered menrank_t_w  ; sum of all rankings for partnered womennum_pair ; number of matcheslist_of_men ; list of ids for men list_of_women  ; list of ids for womennum_proposers ; number of men proposing to women in a given roundave_diff ; average difference in education]turtles-own [education ; yearslist_f ; list of opposite sex potential partners in social networklist_p ; list of proposer (who has proposed to this turtle?)available? partner rank ; rank of partner in turtle's listrank_propose ; rank of turtle in partner's list]   to setup    ca    ask patches [ set pcolor scale-color grey 5 0 10 ]    crt 2 * number ; create equal number of men and women    ask turtles [    set education random 16 ; random number between 0 and 16    set shape "person"     ifelse who < number ; scale color so that men are blue, women are red, darker = higher education     [ set color scale-color blue (16 - education) 0 16 ]    [set color scale-color red (16 - education) 0 16 ]]     set list_of_men turtles with [who < number]     set list_of_women turtles with [ who >= number ]    ask turtles [      setxy random-int-or-float screen-size-x random-int-or-float screen-size-y       set available? true       set xcor pxcor       set ycor pycor ]    ask turtles [ while [(count turtles-here) > 1] [ fd 1 set xcor pxcor set ycor pycor ]]    ask turtles [setup-partner-list]    set num_pair 0    set rank_t_m 0    set rank_t_w 0endto setup-partner-list    locals [w temp_set similar_list diff pos t]    ifelse neighborhood [    ifelse (who < number)       [set temp_set (list_of_women in-radius-nowrap radius)]      [set temp_set (list_of_men in-radius-nowrap radius)]    ]    [    ifelse (who < number)         [set temp_set list_of_women ] ; men         [set temp_set list_of_men] ; women    ]    set list_f []    if ranking = "highest edu" [    repeat (count temp_set)        [ set w max-one-of temp_set [ education ] ; man or woman with highest education         set list_f lput w list_f ; put w on list of possible parters         set temp_set temp_set with [who !=  value-from w [who] ] ; remove w from temp_set        ]   ] if ranking = "most similar" [   set similar_list []   set pos 0   set temp_set values-from temp_set [self] ; turn agentset into a list      repeat (length temp_set) ; compute difference between education of self and agents of opposite sex     [     set w item pos temp_set ; take a person in list      set diff abs((value-from w [education]) - (value-from self [education])) ; compute absolute value of difference in education      set similar_list lput diff similar_list     set pos (pos + 1)     ]     repeat (length temp_set)      [     set diff min similar_list ; lowest value from list of differences     set pos position diff similar_list ; position of lowest value     set w item pos temp_set ; get person with most similar education      set list_f lput w list_f ; put w on list of possible partners     set temp_set remove w temp_set ; remove w from list of men or women     set similar_list remove-item pos similar_list ; remove this difference in educations from list of differences     ]   ]      endto go    locals [min_rank select_m select_w num w rank_m rank_w diff tot_diff]    set num_proposers 0    ask turtles with [available? = true] [set list_p []]    ask turtles with [available? = true and length list_f > 0] [propose]    if (num_proposers = 0) [stop]    ask turtles with [available? = true and length list_p > 0] [evaluate]    set min_rank 2 * number    ask turtles       [        if (available? and length list_p > 0)        [            set w rank + rank_propose ; sum of my rank of my partner and partner's rank of me            if (w < min_rank)            [                set min_rank w ; our joint rank is the new best rank                ifelse who < number                     [set select_m self   ; info if turtle is male                    set select_w partner                     set rank_m rank                     set rank_w rank_propose]                                         [set select_w self   ; info if turtle is female                    set select_m partner                     set rank_w rank                     set rank_m rank_propose]            ]         ]    ]        if (min_rank < 2 * number)    [        ask select_m        [            set available? false            if heading != (value-from select_w [heading]) [ set heading towards select_w ]            repeat ((distance select_w))            [fd 1 wait 0.02] ; slow movement down so user can see what's happening             while [distance select_w > .2] [ fd .2] ; couple wants to be on same patch but            while [distance select_w < .15] [fd .1] ; not on top of one another            set pcolor 48            set partner select_w        ]        ask select_w ;         [            set available? false            set partner select_m            set pcolor 48        ]        set num_pair num_pair + 1        set rank_t_m rank_t_m + rank_m        set rank_t_w rank_t_w + rank_w    ]        set tot_diff 0     ask list_of_men with [available? = false] [     set diff abs((value-from partner [education]) - (value-from self [education]))    set tot_diff (tot_diff + diff)       ]     ;     ask turtles-with available? false    if num_pair != 0 [set rank_ave_m rank_t_m / num_pair                       set rank_ave_w rank_t_w / num_pair                       set ave_diff tot_diff / num_pair]  ;  type num_pair type "   " type (precision rank_ave_m 1) type "   " print (precision rank_ave_w 1)  ; print (precision ave_diff 3) ; average difference in education of partners    graphendto propose    foreach list_f    ; loop over list of people proposing to     [         if(length list_f = 0)[stop]           if (available?-of ?) = true         ; if that person is available         [             set (list_p-of ?) lput self (list_p-of ?)             ; put myself on list of proposers             set num_proposers num_proposers + 1 ; increase global list num_proposers by 1             stop ; only one proposal made by each turtle in each round          ]    ]end  to evaluate    locals [min_rank pos]    set min_rank number ; worst possible ranking    foreach list_p ; for each person on list of proposers    [        set pos position ? list_f ; what is the rank of this proposer?        if (pos < min_rank) [set min_rank pos set partner ?] ; best ranked proposer becomes partner    ]    set rank min_rank ; best proposer's rank in my list      set rank_propose position self list_f-of partner  ; my rank on my best proposer's listend         to graph    set-current-plot "Average Ranking"     set-current-plot-pen "men"    plot rank_ave_m    set-current-plot-pen "women"    plot rank_ave_w    set-current-plot "Average Educational Difference in Partnership"     plot ave_diffend@#$#@#$#@GRAPHICS-WINDOW462101207776101035.01401110111CC-WINDOW57901216885Command Center0BUTTON255210685setupsetupNIL1TOBSERVERTNILBUTTON2397104130gogoT1TOBSERVERTNILPLOT19263280462Average Rankingtimerank of partner0.0100.00.05.0truetruePENS"men" 1.0 0 -13345367 true"women" 1.0 0 -1184463 trueSLIDER1294130174numbernumber0500100101NILBUTTON24149105182

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -