gpt4 book ai didi

graphics - 如何优化代码以使设置更快

转载 作者:行者123 更新时间:2023-12-02 18:59:07 25 4
gpt4 key购买 nike

我在设置时间方面遇到了问题。我创建了一个模型,其中使用以下代码突出显示补丁:

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

最佳答案

这有点事后,但是,除了已经发布的评论之外,您的开关代码效率有点低,可以优化。

ask patches [ if switch? [set pcolor [color] of closest-turtle ]]

这告诉每个补丁检查开关是否打开,然后做出决定。更有效的编码方法是:

if switch? TRUE [ask patches[set pcolor [color] of closest-turtle]]

这告诉观察者检查一次开关(而不是每个补丁一次),然后告诉补丁做一些事情。不是全部效率问题,而是其中一部分

关于graphics - 如何优化代码以使设置更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35049545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com