2017-09-06 26 views
1

我已經嘗試並在發佈我的問題之前探討了此論壇上已回答的問題。我正在構建農民用水模型。我希望農民使用他們自己的水,然後從他們的補丁中獲得水,然後想要改變補丁,農民的水變量以及作爲農民和補丁地表水的全球變量。我期望在每次滴答時都能看到最大和最小的水量。但我的顯示器和圖表顯示相同的價值。我無法找到錯誤,請指導。下面給出GUI的圖片代碼。謝謝。監視器不顯示Netlogo界面中的最大和最小水分

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 

接口設置:

Interface setup

情節設置:

Plot setup

嗨,我想建立農民一年種植的時間表模型,並更新年度農民收入,財富,可用水量,用水量等。爲此,我試圖建立一個考慮模型來自以前回復此帖的建議。我需要徹底解決給定的問題。如果我將代碼中的訪問權作爲全局變量來使用。我的水的最大值和最小值發生了變化,但是當我停止模型時它仍然保持不變。但根據建議,如果我把多餘的水作爲農民,那麼過量水圖顯示一個恆定的線和恆定的最大和最小水量。儘管我試圖在我的模型中使用水,但我需要看到波動。我的模型的預期輸出主要是用水/通水,地下水和地表水。請推薦更正。 感謝

 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 

這裏是模型 enter image description here

回答

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修改爲針對農民或修補程序,而不是使用全局變量。

我不確定你想要繪製什麼 - 你想要一個農民可以使用的最小和最大水量?這可能是這樣的:

首先,添加FWfarmers-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 
+0

謝謝你的幫助,你的權利和重點。我明白了全局變量的觀點。根據你的建議,我已經取代了FW。它顯示恆定的最小值和最大值。在代碼中可以進行哪些可能的更改以查看上述值的變化? – Sadaf

+1

那麼,在模型中,沒有實際「使用」水的代碼 - 農民只是注意到他們可以使用哪些水。既然農民的「swa」和補丁的「gw」沒有變化,你就會得到不變的價值。我想你會想用某種方式編程實際的「用水」,我會用一個非常簡單的(不切實際的)例子來編輯我的答案。 –