2017-02-17 2 views
0

Мне нужно сделать некоторые операции в netlogo с помощью Lists. Хотя я могу делать с ними простые задачи, я еще недостаточно разбираюсь в своих текущих требованиях.Как реализовать численную формулу по всем элементам списка netlogo

У меня есть сценарий, где черепахи имеют переменные, называемые Current-Age и Previous-Age. И черепахи могут родиться и умереть, если они не соответствуют определенному threshold.

Я хочу реализовать следующую формулу для каждого патча.

Best-list = (-1/Previous-Age) * (Distance between Patch & Turtle) for all the turtles 

Best = Min [ Best-list] 

Я знаю, какие шаги были предприняты, но они не увенчались успехом в их кодировании. Ниже приведены шаги:

  1. Создать список всех текущих черепах, которые живы
  2. Создайте второй список, который содержит предыдущий Возраст
  3. Создайте третий список с расстоянием между индивидуальным пластырем и каждый из живых черепах
  4. Затем создайте еще один список с выходом из по Best-List формулы для всех черепах в списке
  5. Наконец найти значение Min в списке и сохранить имя/кто # черепахи с минимумом значение в отдельная переменная под названием Best-Turtle

Это код, который я пробовал, но не работал.

set turtle-list (list turtles) 
set turtle-age-list n-values length(turtle-list) [0] 
set turtle-patch-dist-list n-values length(turtle-list) [0] 
set best-list n-values length(turtle-list) [0] 

ask patches[ 
foreach turtle-list(
set turtle-age-list replace-item ?1 turtle-age-list Previous-Age of turtles with [turtle= ?1] 
) 
] 

Я не мог перейти к следующим шагам, поскольку указанный выше код был неправильным.

Поблагодарили бы помощь с кодом, спасибо заранее.

С уважением

ответ

1

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

Прежде всего, любой список, прошедший до foreach, должен быть такой же длины. Итак, поскольку вы хотите сделать это для каждого патча, убедитесь, что каждый патч вызывает процедуру создания списка, а не только для проверки списков. Затем просмотрите словарь для n-values - синтаксис для репортера означает, что вам нужно использовать репортера, который вы пытаетесь получить, - используя n-values length(turtle-list) [0], вы просто укажете список нулей, размер которых равен той же длине, что и количество черепах.

Так что каждый патч должен создавать эти списки - убедитесь, что вы либо определяете patches-own для переменных списка, либо просто используйте let для определения списков внутри процедуры. Вам понадобится список упорядоченных черепах, их предыдущих возрастов и расстояние от патча, вызывающего процедуру для каждой черепахи. Затем вы можете создать список, который генерирует значение в соответствии с вашей формулой.Затем вы можете использовать примитив position, чтобы найти местоположение минимального значения в вашем списке, создаваемом формулой, и использовать его для индексации черепахи с.

Это может выглядеть как

to numerical 

    set best-turtle [] 

    ask patches [ 
    let turtle-list (sort turtles) ;;; list of sorted turtles 
    let turtle-prev-age-list n-values length(turtle-list) [ [i] -> [pre_age] of turtle i ] ;;; list of previous ages of turtles, in same order as above 
    let turtle-patch-dist n-values length(turtle-list) [ [i] -> distance turtle i ] ;;; list of distance from this patch to each turtle, in same order 
    set best-list n-values length(turtle-list) [ [i] -> ((-1/(item i turtle-prev-age-list)) * (item i turtle-patch-dist)) ] ;;; list of calculated values for each turtle 
    let best-position position (min best-list) best-list ;;; gets the index of minimum value 
    set best-turtle lput item best-position turtle-list best-turtle ;;; adds the best turtle for this patch to the global list of best turtles 
    ] 

end 

выше процедура предполагает, что ваши черепахи имеют pre_age переменную, пластыри имеют best-list переменную, и список всех патчей «лучшей черепахи» держится в глобальной переменной best-turtle. Оттуда вы можете использовать foreach, чтобы попросить черепах в списке что-то сделать. Обратите внимание, что если предыдущий возраст черепахи равен 0, вы получите деление на нулевую ошибку.

+0

спасибо. Цените помощь. – Yuvaraj

+0

Добро пожаловать! –

0
turtles-own [age previous-age] 

to-report evalfrom [_patch] 
    report (- distance _patch)/previous-age 
end 

to test 
    ca 
    crt 25 [ 
    set age (10 + random 75) 
    set previous-age age - random 10 
    ] 
    print min-one-of turtles [evalfrom (patch 0 0)] 
end 
Смежные вопросы