我在设置时间方面遇到问题。我创建了一个模型,其中使用以下代码突出显示补丁:
ask patches [set pcolor scale-color gray proportion 0 max-value ]
我也有一个开关,其目的在于:
ask patches [ if switch? [set pcolor [color] of closest-turtle ]]
每次按下界面中的设置/进入按钮,都非常慢。我最初认为这可能是由于模型的复杂性并检查了它,但似乎并非如此。这很可能是由于开关因此移除了开关,只是采用了以下设置,但它仍然导致延迟
ask patches [ set pcolor [color] of closest-turtle ]
有没有办法解决这个问题。我目前必须保存模型,关闭它并在每次更改时再次打开它。
提前致谢,感谢您的帮助!!
以下是我的完整代码:
breed [ parties party ]
globals [
total-votes
max-voteshare
largest-party
]
parties-own [
my-size
my-old-size
my-rule
my-benefit
my-benefit-chen
]
patches-own [
votes
vote-share
closest-party
closest-party-dist
nearest-neighbors
nearest-neighbors-dist
b
farthest-party
farthest-party-dist
b-c
f
h
votes-with-benefit
]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
to setup
clear-all
reset-ticks
create-voters
setup-parties
update-support
;update-voter-totals
setup-plot
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
to create-voters
ask patches [
let x1 (pxcor - pop1-econ-mean) / sd-pop1
let y1 (pycor - pop1-soc-mean) / sd-pop1
;;set votes (voter-population / 2) * (red-size) * exp (-0.5 * ( x1 ^ 2 + y1 ^ 2)) / (2 * pi * sd-red ^ 2)
set votes ( (pop1) * exp (-0.5 * ( x1 ^ 2 + y1 ^ 2)) / (2 * pi * sd-pop1 ^ 2) )
let x2 (pxcor - pop2-econ-mean) / sd-pop2
let y2 (pycor - pop2-soc-mean) / sd-pop2
;set votes (votes) + (voter-population / 2) * (blue-size) * exp (-0.5 * ( x2 ^ 2 + y2 ^ 2)) / (2 * pi * sd-blue ^ 2) ]
set votes ((votes) + ( (pop2) * exp (-0.5 * ( x2 ^ 2 + y2 ^ 2)) / (2 * pi * sd-pop2 ^ 2) ))
set votes-with-benefit votes
]
set total-votes sum [ votes-with-benefit ] of patches
print (word "Max votes at one point = " precision (max[votes] of patches) 2)
print (word "Min vote at one point = " precision (min[votes] of patches) 2)
print (word "Max votes at one point = " precision (max[votes-with-benefit] of patches) 2)
print (word "Min vote at one point = " precision (min[votes-with-benefit] of patches) 2)
print (word "Total votes = " round(total-votes))
ask patches [set vote-share (votes-with-benefit / total-votes)]
set max-voteshare (max[vote-share] of patches)
ask patches [set pcolor scale-color gray vote-share 0 max-voteshare ]
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
to setup-parties
create-parties 1 [set color red set label-color red set label who + 1 set size 3 setxy party1-left-right party1-lib-con ]
create-parties 1 [set color green set label-color red set label who + 1 set size 3 setxy party2-left-right party2-lib-con ]
if Num-of-parties >= 3
[ create-parties 1 [set color blue set label-color red set label who + 1 set size 3 setxy party3-left-right party3-lib-con ] ]
if Num-of-parties >= 4
[ create-parties 1 [set color orange set label-color red set label who + 1 set size 3 setxy party4-left-right party4-lib-con ] ]
if Num-of-parties >= 5
[ create-parties 1 [set color brown set label-color red set label who + 1 set size 3 setxy party5-left-right party5-lib-con ] ]
if Num-of-parties >= 6
[ create-parties 1 [set color yellow set label-color red set label who + 1 set size 3 setxy party6-left-right party6-lib-con ] ]
if Num-of-parties >= 7
[ create-parties 1 [set color lime set label-color red set label who + 1 set size 3 setxy party7-left-right party7-lib-con ] ]
if Num-of-parties >= 8
[ create-parties 1 [set color turquoise set label-color red set label "8" set size 3 setxy party8-left-right party8-lib-con ] ]
if Num-of-parties >= 9
[ create-parties 1 [set color cyan set label-color red set label who + 1 set size 3 setxy party9-left-right party9-lib-con ] ]
if Num-of-parties >= 10
[ create-parties 1 [set color magenta set label-color red set label who + 1 set size 3 setxy party10-left-right party10-lib-con ] ]
ask parties [ update-rule set my-old-size 1 set shape "default" set heading random-float 360]
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
to update-support
ask patches [ set closest-party min-one-of parties [distance myself]
set closest-party-dist [distance myself] of closest-party
set farthest-party max-one-of parties [distance myself]
set farthest-party-dist [distance myself] of farthest-party
set f ( -1 / ([my-old-size] of closest-party / total-votes) ) * (closest-party-dist + 0.0000000001)
set h ([my-old-size] of farthest-party / total-votes) * (farthest-party-dist ^ 2)
set b-c (f + h)
]
ask parties [set my-size sum [votes-with-benefit] of patches with [closest-party = myself]
set my-benefit mean[b] of patches with [closest-party = myself]
set my-benefit-chen mean[b-c] of patches with [closest-party = myself]
]
ask patches with [votes-with-benefit > 0.001] [ ifelse (b-c <= threshold)
[ set votes-with-benefit 0 set pcolor black ]
[set votes-with-benefit votes
set pcolor [color] of min-one-of parties [distance myself]
]
]
set largest-party max-one-of parties [my-size]
;ask patches with [votes-with-benefit >= 0.001] [ set pcolor [color] of closest-party ]
;ask patches [ set pcolor [color] of closest-party ]
;ask patches [set pcolor [color] of min-one-of turtles [distance myself]]
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
to update-rule
ask turtle 0 [set my-rule party1-rule ]
ask turtle 1 [set my-rule party2-rule ]
if Num-of-parties >= 3
[ ask turtle 2 [set my-rule party3-rule ] ]
if Num-of-parties >= 4
[ ask turtle 3 [set my-rule party4-rule ] ]
if Num-of-parties >= 5
[ ask turtle 4 [set my-rule party5-rule ] ]
if Num-of-parties >= 6
[ ask turtle 5 [set my-rule party6-rule ] ]
if Num-of-parties >= 7
[ ask turtle 6 [set my-rule party7-rule ] ]
if Num-of-parties >= 8
[ ask turtle 7 [set my-rule party8-rule ] ]
if Num-of-parties >= 9
[ ask turtle 8 [set my-rule party9-rule ] ]
if Num-of-parties >= 10
[ ask turtle 9 [set my-rule party10-rule ] ]
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
to adapt
if (my-rule = "hunter") [hunt]
if (my-rule = "aggregator") [aggregate]
if (my-rule = "predator") [prey]
end
to hunt
ifelse (my-size > my-old-size) [jump 1] [set heading heading + 90 + random-float 180 jump 1]
;set my-old-size my-size
end
to aggregate
if (my-size > 0)
[
set xcor (sum [votes * pxcor] of patches with [closest-party = myself] / my-size)
set ycor (sum [votes * pycor] of patches with [closest-party = myself] / my-size)
]
end
to prey
if (my-size < [my-size] of largest-party) [face largest-party jump 1]
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
to intermediate-steps
ask parties [adapt]
update-support
ask turtles [ set my-old-size my-size]
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
to setup-plot
set-current-plot "Voter Turnout"
;set-current-plot "Voter Benefit"
set-current-plot "Distribution of benefit across voters"
end
to update-turnout-plot
set-current-plot "Voter Turnout"
set-current-plot-pen "Party1"
plot 100 * [my-size] of turtle 0 / total-votes
set-current-plot-pen "Party2"
plot 100 * [my-size] of turtle 1 / total-votes
if Num-of-parties >= 3 [ set-current-plot-pen "Party3"
plot 100 * [my-size] of turtle 2 / total-votes ]
if Num-of-parties >= 4 [ set-current-plot-pen "Party4"
plot 100 * [my-size] of turtle 3 / total-votes ]
if Num-of-parties >= 5 [set-current-plot-pen "Party5"
plot 100 * [my-size] of turtle 4 / total-votes]
if Num-of-parties >= 6 [set-current-plot-pen "Party6"
plot 100 * [my-size] of turtle 5 / total-votes]
if Num-of-parties >= 7 [set-current-plot-pen "Party7"
plot 100 * [my-size] of turtle 6 / total-votes]
if Num-of-parties >= 8 [set-current-plot-pen "Party8"
plot 100 * [my-size] of turtle 7 / total-votes]
if Num-of-parties >= 9 [set-current-plot-pen "Party9"
plot 100 * [my-size] of turtle 8 / total-votes]
if Num-of-parties >= 10 [set-current-plot-pen "Party10"
plot 100 * [my-size] of turtle 9 / total-votes]
end
to update-b-chen
set-current-plot "Distribution of benefit across voters"
set-current-plot-pen "patches"
histogram [b-c] of patches
end
to go
intermediate-steps
update-turnout-plot
update-b-chen
tick
end
答案 0 :(得分:1)
这是事后的一点,但除了已经发布的评论之外,您的交换机代码效率有点低,可以进行优化。
interval
这告诉每个补丁检查开关是否打开,然后做出决定。一种更有效的代码编码方式是:
ask patches [ if switch? [set pcolor [color] of closest-turtle ]]
这告诉观察者检查一次开关(而不是每个补丁一次),然后告诉补丁做什么。不是完全效率问题,而是其中的一部分