2016-05-12 6 views
1

У меня есть этот код из книги На основе агента и индивидуального моделирования Railsback глава 16, но это не работает, и я не знаю почему. Я новый в NetLogo, программное обеспечение показывает «ожидаемый ключевое слово» в строке 22 (Create-пакеты)Ожидаемая ошибка по ключевому слову - Netlogo

breed [dogs dog] 
breed [packs pack] 
breed [disperser-groups disperser-group] 

dogs-own 
[ 
    age 
    sex 
    status 
    my-pack 
    my-disperser-group 
] 

packs-own [pack-members] 

disperser-groups-own 
[ 
    sex 
    group-members 
] 

create-packs initial-num-packs 
[ 
    ; set a location and shape just for display 
    setxy random-xcor random-ycor 
    set shape "box" 

    ; create the pack’s dogs 
    let num-dogs random-poisson initial-mean-pack-size 

    hatch-dogs num-dogs 
    [ 
    ; first, set display variables 
    set heading random 360 
    fd 1 

    ; now assign dog state variables 
    ifelse random-bernoulli 0.5 
     [set sex "male"] 
     [set sex "female"] 

    set age random 7 
    set-my-status ; a dog procedure that sets 
        ; social status from age 
    set my-pack myself ; set dog’s pack to the one 
         ; creating it 
    ] ; end of hatch-dogs 

    ; Initialize the pack’s agentset that contains its dogs 
    set pack-members dogs with [my-pack = myself] 

    ; show count pack-members ; Test output – off for now 

    ; now select the alpha dogs 
    update-pack-alphas ; a pack procedure to give the 
         ; pack 2 alphas 

] ; end of create-packs 

to go 

    tick 
    if ticks > years-to-simulate [stop] 

    ; First, age and status updates 
    ask dogs 
    [ 
    set age age + 1 
    set-my-status 
    ] 

    ask packs [update-pack-alphas] 

    ; Second, reproduction 
    ask packs [reproduce] 

    ; Third, dispersal 
    ask packs [disperse] 

    ; Fourth, mortality 
    ask dogs [do-mortality] 

    ; Fifth, mortality of collectives 
    ask packs [do-pack-mortality] 
    ask disperser-groups [if count group-members = 0 [die]] 

    ; Sixth, pack formation 
    ask disperser-groups [do-pack-formation] 

    ; Finally, produce output 
    update-output 
end 

to disperse ; a pack procedure 
    ; First, identify the subordinates and stop if none 
    let my-subordinates pack-members with 
     [status = "subordinate"] 
    if not any? my-subordinates [stop] 

    ; Now check females 
    if count my-subordinates with [sex = "female"] = 1 
    [ 
    if random-bernoulli 0.5 
    [ 
     create-disperser-group-from 
      my-subordinates with [sex = "female"] 
    ] 
    ] 

    if count my-subordinates with [sex = "female"] > 1 
    [ 
    create-disperser-group-from 
      my-subordinates with [sex = "female"] 
    ] 

    ; And check males 
    if count my-subordinates with [sex = "male"] = 1 
    [ 
    if random-bernoulli 0.5 
    [ 
     create-disperser-group-from 
      my-subordinates with [sex = "male"] 
    ] 
    ] 

    if count my-subordinates with [sex = "male"] > 1 
    [ 
    create-disperser-group-from 
      my-subordinates with [sex = "male"] 
    ] 
end ; to disperse 

to create-disperser-group-from [some-dogs] 
    ; a pack procedure 
    ; "some-dogs" is an agentset of the dispersers 

    ; First, create a disperser group and put the dogs in it 
    hatch-disperser-groups 1 
    [ 
    ; Set disperser group variables 
    set group-members some-dogs 
    set sex [sex] of one-of some-dogs 

    ; Display the group 
    set shape "car" 
    set heading random 360 
    fd 2 

    ; Now the disperser group sets the variables of the 
    ; dispersing dogs 
    ask some-dogs 
    [ 
     set my-disperser-group myself 
     set status "disperser" 
     set color green 

     ; and display them in a line from the disperser group 
     move-to my-disperser-group 
     set heading [heading] of my-disperser-group 
     fd 1 + random-float 2 
    ] ; end of ask some-dogs 

    ] ; end of hatch-disperser-groups 

    ; Finally, remove the dispersers from their former pack 
    let dogs-former-pack [my-pack] of one-of some-dogs 
    ask dogs-former-pack 
    [set pack-members pack-members with 
     [status != "disperser"]] 

end ; to create-disperser-group-from 

Благодаря

ответ

2

вам нужно начать процедуру со словом to, но вы не можете вызовите процедуру create-pack, потому что это фактически команда NetLogo. У меня нет книги, но я подозреваю, что это процедура установки. Добавьте имя процедуры в предыдущей строке, вероятно, это:

to setup 
    create-packs initial-num-packs 

вы также должны закончить каждую процедуру со словом end, который также отсутствует. Должно выглядеть так далее вниз:

end 

to go 

В будущем, сделать проверку синтаксиса (зеленая галочка) в конце каждого блока кода, а не вводить всю страницу. Таким образом, у вас есть представление о том, где ошибка, и вы можете сравнить то, что вы набрали, с тем, что находится в книге.

+2

В книге 'to setup' и ее' end' нет. Это, пожалуй, оправданно, так как текст предполагает только то, что детализация процедуры 'setup' детализируется. Тем не менее, стоит отметить, что в этой главе есть ошибки: http://www.railsback-grimm-abm-book.com/Railsback-Grimm2012_Errata.pdf – Alan