📄 ---assort-mating.nlogo
字号:
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 + -