2015-03-24 4 views
2

Привет Я пишу симуляцию, которая использует тики для представления времени в среде моделирования. Можно ли отображать счетчик тиков в графическом интерфейсе монитора? Также я попытался ввести код, но он не работает.Netlogo, Как показать количество тиков

Мой пример кода:

if [agents count = 0] 
show "count ticks" 

Это должно показать клеща точно значение, когда блок агента значение равно нулю. Например, если agent = 0 на отметке 200, он должен отображать 200 на мониторе, даже весь симулятор работает на 500 тиков.

весь код

patches-own[ 
    nest? 
    nest-scent 
    food 
    food-source-number 
    chemical 
    ] 

breed [agents agent] ;agent is ant 
breed [antiagents a-antiagent] ;antiagent spider 
antiagents-own[energy] 
agents-own[venom] 


;;;;;;;;;;;;;;;;;;;;;;;;;; Setup ;;;;;;;;;;;;;;;;;;; 
to setup 
    clear-all 

set-default-shape agents "ant" 
    create-agents initial-ants ;; create the ants, then initialize their variables 
    [ 
    set color orange 
    set size 2 ;; easier to see 
    set venom (ant-venom-strength) 

    ] 

    set-default-shape antiagents "spider" 
    create-antiagents initial-spiders ;; create the spider, then initialize their variables 
    [ 
    set color yellow 
    set size 3 ;; easier to see 
    set energy (spider-health) 
    setxy random-xcor random-ycor 
    ] 
    setup-patch 
    display-labels 



    reset-ticks 
end 


;;;;; nest food patch;;; 
to setup-patch 
    ask patches 
    [ setup-nest 
    setup-food 
    recolor-patch ] 
end 

;;;;; setup nest 
to setup-nest ;; patch procedure 
    ;; set nest? variable to true inside the nest, false elsewhere 
    set nest? (distancexy 0 0) < 5 
    ;; spread a nest-scent over the whole world -- stronger near the nest 
    set nest-scent 200 - distancexy 0 0 
end 

to setup-food ;; patch procedure 
    ;; setup food source one on the right 
    if (distancexy (0.6 * max-pxcor) 0) < 5 
    [ set food-source-number 1 ] 
    ;; setup food source two on the lower-left 
    if (distancexy (-0.6 * max-pxcor) (-0.6 * max-pycor)) < 5 
    [ set food-source-number 2 ] 
    ;; setup food source three on the upper-left 
    if (distancexy (-0.8 * max-pxcor) (0.8 * max-pycor)) < 5 
    [ set food-source-number 3 ] 
    ;; set "food" at sources to either 1 or 2, randomly 
    if food-source-number > 0 
    [ set food one-of [1 2] ] 
end 

to recolor-patch ;; patch procedure 
    ;; give color to nest and food sources 
    ifelse nest? 
    [ set pcolor violet ] 
    [ ifelse food > 0 
    [ if food-source-number = 1 [ set pcolor cyan ] 
     if food-source-number = 2 [ set pcolor sky ] 
     if food-source-number = 3 [ set pcolor blue ] 
     if food-source-number = 4 [ set pcolor brown ] ] 
    ;; scale color to show chemical concentration 
    [ set pcolor scale-color green chemical 0.1 5 ] ] 
end 


    ;;;;;;;;;;;;;;;;;;;;;;;;;;; GO ;;;;;;;;;;;;;;;;;;;;;; 


to go ;; forever button 
    ;;;;;;;;;;;;Spider ;;;;;;;; 
    ask antiagents [ 
    setup-spider-movemonet ; option for user to select spider movement 
    ;move-spider 
    catch-ant 
    spider-death 
    ] 

    ;;;;;;;;;; Ant ;;;;;;;;;;;; 
    ask agents 
    [ if who >= ticks [ stop ] ;; delay initial departure 
    ifelse color = orange 
    [ look-for-food ]  ;; not carrying food? look for it 
    [ return-to-nest ]  ;; carrying food? take it back to nest 
    wiggle 
    fd 1 ] 
    diffuse chemical (diffusion-rate/100) 
    ask patches 
    [ set chemical chemical * (100 - evaporation-rate)/100 ;; slowly evaporate chemical 
    recolor-patch ] 

    tick 
    display-labels 
    ;;;;;;;;;;; Stop function ;;;;;;;;;; 

    if count agents = 0 [stop] 

    if count patches with [pcolor = blue] = 0 [stop] 




end 

;;;;;;;;;;;;;;;;;;;;;;;;;; function in go ;;;;;;;;;;;;;;; 

to look-for-food ;; turtle procedure 
    if food > 0 
    [ set color green + 1  ;; pick up food 
    set food food - 1  ;; and reduce the food source 
    rt 180     ;; and turn around 
    stop ] 
    ;; go in the direction where the chemical smell is strongest 
    if (chemical >= 0.05) and (chemical < 2) 
    [ uphill-chemical ] 
end 

;;;;;;;;;;; ant function ;;;;;;;;;; 

;; sniff left and right, and go where the strongest smell is 
to uphill-chemical ;; turtle procedure 
    let scent-ahead chemical-scent-at-angle 0 
    let scent-right chemical-scent-at-angle 45 
    let scent-left chemical-scent-at-angle -45 
    if (scent-right > scent-ahead) or (scent-left > scent-ahead) 
    [ ifelse scent-right > scent-left 
    [ rt 45 ] 
    [ lt 45 ] ] 
end 

to return-to-nest 
    ifelse nest? 
    [ ;; drop food and head out again 
    set color orange 
    rt 180 ] 
    [ set chemical chemical + 60 ;; drop some chemical 
    uphill-nest-scent ]   ;; head toward the greatest value of nest-scent 
end 

to wiggle ;; turtle procedure 
    rt random 40 
    lt random 40 
    if not can-move? 1 [ rt 180 ] 
end 
to uphill-nest-scent 
    let scent-ahead nest-scent-at-angle 0 
    let scent-right nest-scent-at-angle 45 
    let scent-left nest-scent-at-angle -45 
    if (scent-right > scent-ahead) or (scent-left > scent-ahead) 
    [ ifelse scent-right > scent-left 
    [ rt 45 ] 
    [ lt 45 ] ] 
end 

to-report chemical-scent-at-angle [angle] 
    let p patch-right-and-ahead angle 1 
    if p = nobody [ report 0 ] 
    report [chemical] of p 
end 

to-report nest-scent-at-angle [angle] 
    let p patch-right-and-ahead angle 1 
    if p = nobody [ report 0 ] 
    report [nest-scent] of p 
end 




;;;;;;;;;;;;;;;;;;;;;;;;;;;; Spider-Function ;;;;;;;;;;;;;;;;;;;;;; 
to move-spider 
    rt random 360 
    lt random 360 
    fd 3 
end 

to spider-death ;; turtle procedure 

    if energy <= 0 [ask antiagents-here [die]] 



end 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
to catch-ant 
    let prey one-of agents-here      
    if prey != nobody        
    [ ask prey [ die ]       
     set energy (energy - ant-venom-strength)] 
end 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 



;;;;; GUI Function ;;;; 
to display-labels 
    ask antiagents [ set label "" ] 
    if show-spider-health [ 
    ask antiagents [ set label round energy ] 
    ] 
end 

;;;;;;; Spider movement GUI ;;;;;; 
to setup-spider-movemonet 
     if setup-spider-movement 
     [ 
     ask antiagents [ move-spider ] 
     ] 
end 

ответ

1
  1. Ваш синтаксис неверен. Тем не менее, вы можете включить в процедуру наблюдателя (например, свою процедуру go) следующее: if (count agents = 0) [show ticks]. Это будет отображаться в области над командной строкой.
  2. Однако похоже, что вы ищете user-message, а не show. Например, if (count agents = 0) [user-message (word ticks)]. http://ccl.northwestern.edu/netlogo/docs/dict/user-message.html
+0

если (кол-агентов = 0) [пользователь-сообщение (слово клещами)] не работает в связи с ожидаемым репортером, пожалуйста, помогите –

+0

@PritTuntisak Если вы добавите этот код в свое расписание ('go'), оно не приведет к ошибке (если вы не забыли« сбросить отметки »или у вас нет агента с именем« агенты »). Опубликуйте все сообщение об ошибке, если этот комментарий не поможет вам понять это. – Alan

4

Для того, чтобы монитор, который отображает количество тиков, полный код, чтобы положить в монитор:

ticks 

Это все.

Если вы хотите, чтобы монитор, чтобы показать количество тиков, когда нет никаких агентов, но быть пустыми в противном случае, вы бы поставить этот код в:

ifelse-value any? agents 
    [ "" ] 
    [ ticks ] 
+0

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

+1

Код в моем ответе правильный; Я попробовал. Проверьте свой ввод. Если вы все еще не видите проблему, вам может потребоваться открыть новый вопрос и включить точный код, который вы используете, и точное сообщение об ошибке, которое вы получаете. –

+0

Код Прита - Сета верен, но если вы получаете сообщение о скобках, то одна из ваших ДРУГИХ пар круглых скобок несовместима, поэтому скобка в этом бите кода соединяется с вашим кодом в другом месте. Пожалуйста, разместите весь раздел кода (от 'to procedure-name' до' end') или закомментируйте эти строки в своем коде и посмотрите, куда движется ошибка. – JenB

1

Если вы хотите обновить монитор каждый тик, но только когда есть агенты, вам нужно создать отдельную глобальную переменную (называемую счетчиком ниже) и обновить ее. Внутренняя переменная ticks всегда будет увеличиваться, поэтому мониторинг всегда будет увеличиваться. Это связано с тем, что переменная тиков - это часы моделирования, они сообщают о времени.

globals [counter] 

to setup 
    ... 
    set counter 0 ; note, not required as initialise to 0 but helps readability 
    reset-ticks 
end 

to go 
    ... 
    if any? turtles [ set counter counter + 1 ] 
    ... 
    tick 
end 

Затем создайте монитор только с counter (и 0 знаков после запятой и т.д.)

+0

@Seth Tisue. Я запустил ваш код, однако значение счетчика все еще работает. после всех антиагентных штампов, он должен просто отображать точно значение счетчика, когда анти-агент умирает при моделировании, однако ваш код все еще работает до конца моделирования –

+0

@Prit Нет, счетчик увеличивается только тогда, когда есть живые агенты (вот что: «если есть? проверки агентов). Проверьте правильность этой строки. – JenB

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