2016-08-04 52 views
1

我希望這是一個簡單的解決方案,但我遇到困難。使用代理變量而不是常量在Netlogo中輪盤選擇


問題:

我想體重的東西由變量不是一個常量

設置發生的可能性

  1. 我的代理人是農場。

  2. 農場擁有四個變量,代表其上的奶牛,山羊,豬和綿羊的數量爲 。

  3. 當一個農場想要 除去動物,我想的可能性,以除去一個 特定物種的成員被直接正比於每 物種的量在農場(即,如果有7只山羊,2頭牛和1頭豬, 有一種接受山羊70%的概率,並採取一隻羊百分之零 概率)

我發現公式是這樣的,當你知道確切的數字每個值的重量:

to-report random-weighted [values weights]   
    let selector (random-float sum weights) 
    let running-sum 0 
    (foreach values weights [ 
     set running-sum (running-sum + ?2) ; Random-Weighted Created by NickBenn 
     if (running-sum > selector) [ 
     report ?1 
     ] 
    ]) 
end 

和在rnd擴展中描述的方法。但是,當我把「牛」放入而不是常數時,這兩種方法都會拋出「預期不變」的錯誤。

喜歡的東西:

to example1 
    let values ["Cow" "Sheep" "Goat" "Pig"] 
    let probabilities [2 0 7 1] 
    let indices n-values length values [ ? ]    ; Made by Nicolas Payette 
    let index rnd:weighted-one-of indices [ item ? probabilities ] 
    let loca item index values 
end 

效果很好,但如果我是來取代它:

to example1 
     let values ["Cow" "Sheep" "Goat" "Pig"] 
     let probabilities [Num-Cows Num-Sheep Num-Goats Num-Pigs] 
     let indices n-values length values [ ? ]    ; Made by Nicolas Payette 
     let index rnd:weighted-one-of indices [ item ? probabilities ] 
     let loca item index values 
    end 

失敗。

+2

讓概率(列表Num-Cows Num-Sheep Num-Goats Num-Pigs) – Alan

回答

3

Alan是正確的:當你想從常量以外的任何東西構造一個列表時,你需要使用list原語(與括號相對)。

我想補充兩點到:

你也可以有這樣的事情:

to example1 
    let values ["Cow" "Sheep" "Goat" "Pig"] 
    let probabilities (list Num-Cows Num-Sheep Num-Goats Num-Pigs) 
    let loca first rnd:weighted-one-of-list (map list values probabilities) last 
end 

這可能有點棘手理解,但這裏是它的要點:

  • (map list values probabilities)表達既需要您的values列表和您的probabilities列表,並使用list原語將它們「拉」到一起,從而產生一對列表:[["Cow" 2] ["Sheep" 0] ["Goat" 7] ["Pig" 1]]

  • 我們將last記者傳遞給rnd:weighted-one-of-list基元,告訴它它們中每一對的最後(即第二)項應當用作概率。

  • 由於rnd:weighted-one-of-list在配對列表上運行,它返回的項目將是一對(例如,["Goat" 7])。我們只對這一對中的第一個項目感興趣,所以我們用first記者提取它。

注意路過的時候list作爲參數傳遞給maplast作爲參數傳遞給rnd:weighted-n-of,我們使用的NetLogo的簡潔的語法任務。您可以用[ (list ?1 ?2) ]last替換list[ last ? ],但它會更醜。