2015-11-07 3 views
2

Извините, если я вас раздражаю, но мой учитель говорит, что этот код [1] недостаточно хорош, и я должен работать с агентами вместо invidual значений.сравнение двух кодовых скобок, которые должны делать то же самое

код [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] 

в Code [2] Я попытался работать с агентами, но результат не похож на результат в Code [1]. В Code [1] мои черепахи создают приятные huddles, но в Code [2] они этого не делают. Я немного отчаянный ... если есть вопросы. черепахи должны двигаться с большей вероятностью к патчу с более высоким значением «выходного тепла».

+0

В дополнение к ответу JenB, я хочу рекомендовать, как правильно откорректировать код. В противном случае другим трудно читать ваш код, и вам легко ошибиться. Есть несколько способов сделать это, что хорошо для NetLogo. Я отредактировал ваш код, чтобы проиллюстрировать один вариант. – Mars

+1

Может ли проблема заключаться в том, что «соседи» - это не те же патчи, что и патчи, выбранные с помощью «patch-left-and-ahead» и 'patch-right-and-ahead'? Потому что они часто не будут одинаковыми патчами, в зависимости от точного положения черепахи внутри патча и ее точного заголовка. (Например, если черепахи всегда находятся в патч-центрах, «патч-вперед 1» иногда является одним и тем же патчем, черепаха уже стоит ...!) –

+0

да, я тоже так думаю. Я попробовал это сейчас с координатами соседей. и поверните черепах в координаты с помощью facexy. есть ли другой путь, кроме соседей? – skipperdipper

ответ

2

Эта строка set propability_number (random-float (temp_left_ahead_kumulativ)) не делает то же самое, что и let probability_number random-float tempsum + 1.

Проведите некоторое тестирование. У вас есть заявление на печать для номера вероятности, после того, как вы его создали, запустите его примерно 10 раз и проверьте, соответствуют ли цифры вашим ожиданиям.

У вас также возникли проблемы с вашими заявлениями if, как описано в предыдущем вопросе how can i set a probability for each action?. Опять же, лучший способ учиться - это провести некоторое тестирование, чтобы увидеть, как все работает. Различие между if и ifelse очень важно, чтобы заставить вас делать то, что вы ожидаете.

+0

Я тестировал каждое значение и каждый список. я получаю правильные результаты. я думаю, проблема заключается в том, что соседей не спрашивают сверху вниз в правильном направлении. это всегда по-другому. Мне также нужны координаты патчей. но я не знаю, как это сделать. – skipperdipper

+0

, конечно, верно, что агенты запрашиваются в случайном порядке, когда вы запрашиваете агент. Это намеренно - в противном случае первый запросчик всегда получал бы преимущество. Например, при моделировании торговли первый агент всегда будет получать лучшую цену. Но если все, что вы пытаетесь сделать, это выбрать соседку с лицом с взвешенными вероятностями, посмотрите на расширение rnd – JenB

+0

да, я попробовал сейчас с facexy. Я составил списки x-координат и y-координат соседей. но это не выглядит лучше ... – skipperdipper

Смежные вопросы