2015-11-07 35 views
2

對不起,如果我討厭你,但我的老師說這個代碼[1]不夠好,我應該使用代理集而不是個體值。兩個代碼括號之間的比較應該這樣做

代碼[1](第一個代碼工作很不錯)

let temp_ahead [(output-heat + 1)^ Freedom] of patch-ahead 1 
let temp_right_ahead [(output-heat + 1)^ Freedom] of patch-right-and-ahead 45 1 
let temp_right [(output-heat + 1)^ Freedom] of patch-right-and-ahead 90 1 
let temp_right_back [(output-heat + 1)^ Freedom] of patch-right-and-ahead 135 1 
let temp_back [(output-heat + 1)^ Freedom] of patch-right-and-ahead 180 1 
let temp_left_back [(output-heat + 1)^ Freedom] of patch-left-and-ahead 135 1 
let temp_left [(output-heat + 1)^ Freedom] of patch-left-and-ahead 90 1 
let temp_left_ahead [(output-heat + 1)^ Freedom] of patch-left-and-ahead 45 1 


set temp_ahead_kumulativ temp_ahead 
set temp_right_ahead_kumulativ (temp_ahead_kumulativ + temp_right_ahead) 
set temp_right_kumulativ (temp_right_ahead_kumulativ + temp_right) 
set temp_right_back_kumulativ (temp_right_kumulativ + temp_right_back) 
set temp_back_kumulativ (temp_right_back_kumulativ + temp_back) 
set temp_left_back_kumulativ (temp_back_kumulativ + temp_left_back) 
set temp_left_kumulativ (temp_left_back_kumulativ + temp_left) 
set temp_left_ahead_kumulativ (temp_left_kumulativ + temp_left_ahead) 

set propability_number (random-float (temp_left_ahead_kumulativ)) 

if propability_number < temp_ahead_kumulativ [right 0] 
if propability_number < temp_right_ahead [right 45] 
if propability_number < temp_right_kumulativ [right 90] 
if propability_number < temp_right_back_kumulativ [right 135] 
if propability_number < temp_back_kumulativ [right 180] 
if propability_number < temp_left_back_kumulativ [left 135] 
if propability_number < temp_left_kumulativ [left 90] 
if propability_number < temp_left_ahead_kumulativ [left 45] 

我的代碼[2](未正常工作代碼[1],有什麼不好?):

;;all temperatrue-values around the turtle saved in list 
set temperature_values [(output-heat + 1)^Freedom] of neighbors 


;;build cumulative value of temperatures and put each value in list 
let tempsum 0 
set tempsum_list [] 
foreach temperature_values 
    [set tempsum (tempsum + ?) 
    set tempsum_list lput tempsum tempsum_list 
    ] 


;;create a random number between 0 and the last tempsum-value 
let probability_number random-float tempsum + 1 


if probability_number < item 0 tempsum_list 
    [left 45] 
if (probability_number < item 1 tempsum_list) 
    [left 90] 
if (probability_number < item 2 tempsum_list) 
    [left 135] 
if (probability_number < item 3 tempsum_list) 
    [right 180] 
if (probability_number < item 4 tempsum_list) 
    [right 135] 
if (probability_number < item 5 tempsum_list) 
    [right 90] 
if (probability_number < item 6 tempsum_list) 
    [right 45] 
if (probability_number < item 7 tempsum_list) 
    [right 0] 

在代碼[2]中,我嘗試使用代理集,但結果看起來不像代碼[1]中的結果。在代碼[1]中,我的海龜創造了不錯的擠身,但在代碼[2]中他們不這麼做。我有點絕望... 如果有人提問。海龜應該以更高的概率移動到具有較高「輸出熱量」值的貼片。

+0

除了JenB的回答,我想推薦學習如何正確地縮進代碼。否則,別人很難閱讀你的代碼,而且犯錯誤很容易。有幾種方法可以做到這一點,這對NetLogo來說很好。我編輯你的代碼來說明一個選項。 – Mars

+1

難道問題是'neighbors'與使用'patch-left-and-ahead'和'patch-right-and-ahead'選出的補丁不是相同的補丁嗎?因爲他們通常不會是相同的補丁,這取決於補丁內的龜的確切位置及其確切的標題。 (例如,除非海龜總是在補丁中心,否則'patch-ahead 1'有時是相同的補丁,龜已經站在...!) –

+0

是的,我也這麼認爲。我現在用鄰居的座標試了一下。然後用facexy將烏龜的座標轉換爲座標。除了鄰居之外,還有其他的方式嗎? – skipperdipper

回答

2

此行set propability_number (random-float (temp_left_ahead_kumulativ))let probability_number random-float tempsum + 1不同。

做一些測試 - 在創建它之後爲probability_number打印語句,運行約10次並查看數字是否符合您的期望。

您的if聲明也存在問題,正如您之前的問題how can i set a probability for each action?所述。再次,最好的學習方法是做一些測試,看看事情是如何工作的。 ififelse之間的區別對於讓您的代碼按照您的期望行事非常重要。

+0

我測試了每個值和每個列表。我得到正確的結果。我認爲問題在於,鄰居不是從正確的方向從上到下被問到的。它總是不同的。我也需要補丁的座標。但我不知道該怎麼做。 – skipperdipper

+0

確實如此,當你詢問代理商時,代理商會以隨機順序被詢問。這是故意的 - 否則第一個要求的代理人總是會獲得優勢。例如,在交易模擬中,第一個代理將始終獲得最佳價格。但如果你所要做的只是選擇一個鄰居來面對加權概率,看看rnd的延伸 – JenB

+0

是的,我現在用facexy試了一下。我列出了鄰居的x座標和y座標。但它看起來不太好... – skipperdipper