【问题标题】:Monitor is not displaying maximum and minimum water in interface in Netlogo监视器在 Netlogo 的界面中未显示最大和最小水量
【发布时间】:2018-02-14 20:03:40
【问题描述】:

在发布我的问题之前,我已经尝试并探索了这个论坛上已经回答的问题。我正在为农民建立一个用水模型。我希望农民使用他们自己的水,然后从他们的补丁中使用,然后希望改变补丁、农民的水变量,并将其作为农民和补丁的地表水的全局变量总和。我希望在每个滴答声中看到最大和最小水的输出。但是我的监视器和图表显示相同的值。我找不到错误,请指导。下面给出了带有GUI图片的代码。谢谢。

globals [TW  well-depth]; total water
breed [farmers farmer]
farmers-own [SWA] ;surface water availbility
patches-own [ wtd GW ] ;water table depth and Groundwater

to setup
  clear-all
  create-farmers num-farmers [
    move-to one-of patches
    set SWA  random 12
  ]
  ask patches [
    set WTD 2
    set GW 3
    set pcolor green
  ]
  reset-ticks
end

to go
  ask farmers [
    update-water
  ]
  tick
end

to update-water
  ifelse swa < 5 [
    ask patches in-radius 1 [ 
      set pcolor blue
      set TW gw + [SWA] of myself
    ]
  ]
  [
    ask patches in-radius 1 [ 
      set gw  gw - random-float .0005
      set well-depth wtd / gw 
    ]
    set tw swa
  ]

end

界面设置:

情节设置:

您好,我想建立一个农民一年种植时间表的模型,并更新农民每年的收入、财富、可用水、用水等。为此,我尝试建立一个模型,考虑以前对此答案的建议邮政。我需要完全解决给定的问题。如果我将代码中的 access-water 作为全局变量。我的水的最大值和最小值发生了变化,但是当我停止模型时它保持不变。但是根据建议,如果我将多余的水作为农民拥有,那么多余的水图会显示一条恒定的线以及恒定的最大和最小水。尽管我试图在我的模型中包含用水量,但我需要看到波动。我的模型的预期输出主要是用水/取水、地下水和地表水。请建议更正。 谢谢

      Globals [ potential-buyers  year season  TAWS TGWU TWR   rprice wprice  excess-water ]
    Breed [rfarmers rfarmer]
    Breed [pfarmers pfarmer]
    Breed [wcrops wcrop]
    Breed [ccrops ccrop]
    Breed [rcrops rcrop]
    rfarmers-own [
  savings
    tubewell
    wyield
    ryield
    land
  CRPDCSN
   WR-wheat
  SWA-rabi
  GWA pumping-on?
   seasonality
  input-cost
wealth
  wrevenue
  wincome
  wwealth
  allowed-pumped-water
  wr-rice
  income-1
  SWA-kharif
  income-2
  rincome
  rrevenue
  rwealth
]
patches-own [Gwater well-depth
WTD]

    to setup
  clear-all
  ask patches [set pcolor green
    Set WTD 3 + random-float 18.005

  set Gwater  GW / WTD 
   ]
  create-rfarmers no-of-rfarmers [set shape "person"
                                  set color brown
                                 move-to one-of patches
                                 set land 12
                                 set wealth 1000 + random 500
                                set input-cost 5 + random 3
                                set tubewell 1
                                set wr-wheat 10 + random-float 12   
                                set SWA-rabi 4 + random-float 6.6    
                                set SWA-kharif 6 + random-float 9.6  
                                set wr-rice 18 + random-float 15
                                set GWA   pumping-on?

                                set wprice 1.300 + random 5.0  
                                set rprice 1.500 + random 1.00 
                                set wyield 25 + random 20
                                set ryield 40 + random 20
                                                               ]
Reset-ticks
end

to go
ask rfarmers [cropping-decision
;use-GW
update-wealth-w
 ]
tick
update-timeline


end
to cropping-decision
    ifelse  wealth > input-cost and land > 2 and ticks mod 2 = 0
                 [ set CRPDCSN "wheat"
                   if wr-wheat < SWA-rabi [ use-GW]
                   set seasonality "Rabi"
                    ]

                    [set CRPDCSN "rice"
                     Set seasonality "Kharif"
                    go-2]

    end
to use-GW
    ifelse (SWA-rabi - wr-wheat) < 0  [set pumping-on? true

                                                       ask patches in-radius 4 [ set wtd wtd + random-float 1.00005]
                                                      set input-cost input-cost  + 0.0005  * ( wr-wheat - SWA-rabi) / wtd ; changed from 200 to 20 t0 .05
                                                      set gwater gwater - random-float 0.0005 / wtd
                                                      set excess-water SWA-rabi - wr-wheat + sum [gwater] of patches in-radius 1
                                                      if excess-water > 0 [sell-buy-accesswater]] 


  [set pumping-on? false
    set wyield wyield - random-float 0.0005
  set excess-water SWA-rabi 
  set input-cost input-cost  - random-float 1 ]

end

to sell-buy-accesswater
                       set potential-buyers other rfarmers in-radius 4 with [(excess-water <= 0)] 
                      ask potential-buyers [set input-cost input-cost + 0.0005 * ( wr-wheat - SWA-rabi) / WTD
                                             set wyield wyield - .0005 ]
                                             set income-1 0.0005 * excess-water
                                             set wyield wyield + random-float .000005
                                             set excess-water excess-water - [excess-water] of potential-buyers

end
to update-wealth-w
set wrevenue wprice * (wyield * land)
              set wincome wrevenue - input-cost * land
              set  wwealth wealth + wincome + income-1

end
to update-timeline
 if ticks mod 2 = 0 [set season "Rabi"   set year year + 1
   set wprice wprice + 1 ]
;Ask rfarmers [set SWA-Rabi SWA-Rabi - random-float .0005]] ;to incorporate effect of climate
  if ticks mod 2 = 1 [set season "Kharif"
    set rprice rprice + 1]
 ; ask rfarmers [Set SWA-Kharif  SWA-kharif - random-float .001] 

end


to go-2
ask rfarmers [use-GW-R
;buying-selling-GW-R
;lsell-buy-water-r
update-wealth-r
update-wealth
]


end

 ;;;;;;;;;;; Same procedure is adopted for rice;;;;;;;;;;;;
to use-GW-r
  ifelse (SWA-kharif - wr-rice) < 0  [set pumping-on? true
                                                      ;set Gwater  (gwater - (SWA-rabi - wr-wheat))
                                                     ;set GWA 10 + random-float 10
                                                      set input-cost input-cost  + .0006  * ( wr-rice - SWA-kharif) / wtd ; changed from 200 to 20 t0 .05
                                                      ask patches in-radius 4 [ set wtd wtd + random-float .005 ]
                                                     set excess-water ( SWA-kharif - wr-rice + gwater )
                                                      if excess-water > 0 [sell-buy-accesswater-r] ] ; + GWater]

         [set pumping-on? false
          set ryield ryield - random 2]

end

to sell-buy-accesswater-r
  set potential-buyers other rfarmers in-radius 3 with [(excess-water <= 0)] ; and  (wtd >= allowable-lm-pumping)]
                ask potential-buyers [set input-cost input-cost + 0.0005  * ( excess-water) / WTD
                                      set ryield ryield - .005 ]
                                      set income-2 0.5 * (excess-water)

end

to update-wealth-r
 set rrevenue (rprice * ryield * land)
              set rincome rrevenue - (input-cost * land)
              set rwealth  rincome + income-2

end

to update-wealth
  if ticks mod 2 = 1
  [ set wealth  wealth + .0005 * (rwealth + wwealth) ]
end

这里是模型的界面设置

【问题讨论】:

    标签: variables output netlogo


    【解决方案1】:

    您要求绘图显示海龟的 TW,但 TW 是一个全局变量 - TW 只有一个值。当您请求[TW] of turtles 时,您将返回一个相同值的列表(无论TW 当前是什么),其长度与当前海龟数量相同。因此,例如,假设您有 5 只海龟和 11 只 TW;当您要求 plot max [TW] of turtles 时,您实际上是在要求 Netlogo 绘制 [ 11 11 11 11 11 ] 的最大值,最小值也是如此。

    此设置的另一个问题是,由于TW 是一个全局变量,因此每次运行update-water 时,每个补丁都会修改TW。在您的模型中,当前设置的任何TW 都将被最后调用的任何补丁覆盖。您可能希望修改您的 update-water 以特定于农民或补丁,而不是使用全局变量。

    我不确定您到底想绘制什么 - 您想要农民可用的最少和最多水吗?可能是这样的:

    首先,将FW 添加到farmers-own 变量中,然后尝试这个修改后的update-water 过程:

    to update-water
    
      ifelse swa < 5 [
        ask patches in-radius 1 [
          set pcolor blue
        ]
        set FW swa + sum [gw] of patches in-radius 1
      ]
      [
        ask patches in-radius 1 [
          set gw gw - random-float 0.0005
          set well-depth wtd / gw
        ]
        set FW swa
      ]
    
    end
    

    当你现在show [FW] of turtles 时,你会得到一个类似[10 17 6 19 18 7 9 15 5 10] 的列表,而不是一个相同数字的列表。现在尝试使用您之前使用的相同绘图更新命令进行绘图,但使用FW 而不是TW。如果我离题了,请告诉我你想要绘制的内容。

    编辑:

    用水的简单示例,农民每个人都“用尽”了他们可用的swa。将update-water 程序替换为下面的程序并运行您的模型-您应该看到农民开始用完他们的swa 直到他们的swa 小于5,然后他们将开始用完附近的补丁gw直到用完为止。

    to update-water
    
      ifelse swa > 5 [
        set swa swa - random-float 0.5
        set FW swa 
      ]
      [
        set swa 0
        ask patches in-radius 1 [
          if gw > 0 [
            set pcolor blue
            set gw gw - random-float 0.25
          ]
          if gw <= 0 [
            set gw 0
            set pcolor black
          ]
        ]
        set FW swa + sum [gw] of patches in-radius 1
      ]
    
    end
    

    【讨论】:

    • 感谢您的帮助。您说得对。我明白你对全局变量的看法。根据您的建议,我已更换 FW。它显示恒定的最小值和最大值。可以对代码进行哪些更改以查看上述值的变化?
    • 嗯,在模型中没有代码来实际“使用”水——农民只是注意到他们可以使用哪些水。由于农民的swa 和补丁的gw 没有变化,因此您将获得恒定值。我认为您会希望以某种方式对实际的“用水”进行编程 - 我将使用一个非常简化(不切实际)的示例来编辑我的答案。
    猜你喜欢
    • 2021-04-04
    • 2015-05-04
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    相关资源
    最近更新 更多