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

时间:2016-01-27 22:41:30

标签: graphics installation runtime delay netlogo

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

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

1 个答案:

答案 0 :(得分:1)

这是事后的一点,但除了已经发布的评论之外,您的交换机代码效率有点低,可以进行优化。

interval

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

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

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