2017-05-01 8 views
1

Mac Sierra의 NetLogo (5.3.1)에서 용량 제약 조건과 우선 순위를 모델링하려고합니다. 제한된 수의 거북이 (예 : n)에게 특정 일을하고 그 거북이를 선택하여 (1) 특정 조건을 충족시키고 (2) 최대 값이 my-variablen 거북이가되도록 선택합니다.NetLogo : 변수의 값으로 순위가 정해진 제한된 수의 거북이를 묻기

let subset-of-turtles turtles with [ condition-variable = some-value ] 
ask max-n-of n subset-of-turtles [ my-variable ] [< do something >] 

을하지만 여러 문제가 있습니다 :

나는이 작업을 수행하려합니다. 어떠한 거북이 [ condition-variable = some-value ]한다는 조건을 만족하지 않는 경우

우선, NetLogo 오류 만 0 에이전트들의 세트로부터 임의의 제 N 신청

을 던진다.

은 내가 ask 명령 앞에 줄을 삽입하여 해결을 시도 :

let subset-of-turtles turtles with [ condition-variable = some-value ] 
if subset-of-turtles != nobody [ 
    ask max-n-of n subset-of-turtles [ my-variable ] [< do something >] 
    ] 

그러나 그것은 작동하지 않습니다

observer> show turtles with [ condition-variable = some-value ] 
observer: (agentset, 0 turtles) 
observer> let subset-of-turtles turtles with [ condition-variable = some-value ] show subset-of-turtles != nobody 
observer: true 

NetLogo 빈 agentset 여전히 agentset 것을 고려, 그래서 nobody과 다른 시험에 합격합니다.

두 번째로 조건을 충족시키는 거북이가 있더라도 NetLogo는 n보다 작 으면 같은 오류를 발생시킵니다. 내 모델은 용량이 처음부터 충분해야한다는 제약 조건을 충족시키는 성장 모델입니다. 따라서이 작업은 모델을 실행할 때마다 발생합니다.

나는 블록의 명령을 최대 n 번 실행하기를 NetLogo에 원합니다. 1. 경우, 모든 m 거북 에서 명령을 실행 my-variable 최고 값으로 n 거북의 명령을 실행하는 조건을 만족 m 거북있다하자. 아무도 조언 할 수 있습니까?

답변

4

일반적으로, 나는 NetLogo 아직도 계산하는 agentset를 구성 할 필요가 있기 때문에 count <agentset> = 0 여부를 테스트하는 것이 좋습니다하지 않을 것입니다. 그러나이 작업에 매우 편리한 any? 기자가 있습니다.따라서 원래 코드를 다음과 같이 수정하십시오.

let subset-of-turtles turtles with [ condition-variable = some-value ] 
if any? subset-of-turtles [ 
    ask max-n-of n subset-of-turtles [ my-variable ] [< do something >] 
    ] 
+0

감사합니다. Jen. 지금 시도해 보겠습니다. :-) – AlbertoCottica

+0

아 물론. 이것은 더 좋은 방법입니다, 감사합니다 Jen. –

2

이 설정을 가정 :

turtles-own [ 
    condition-variable 
    my-variable 
] 



to setup 
    ca 
    reset-ticks 
    crt 10 [ 
    setxy random 30 - 15 random 30 - 15 
    set condition-variable random 2 
    set my-variable 1 + random 10 
    ] 

end 

첫째, 당신은 agentset가 비어 있는지의 빠른 검사로 count을 사용하고, 대신 조건으로 그것을 사용할 수 있습니다.

이렇게하지 마십시오. @JenB가 제안한 답변에서 허용 된대로 대신 any? 프리미티브를 사용하십시오.

두 번째로 ifelse을 사용하면 "n보다 하위 집합에 거북이가 적 으면 하위 집합의 거북에게만 물어보고 하위 집합에있는 거북이에게 물어보십시오"와 같은 말을 할 수 있습니다.

to go 

    let n 5 
    let subset-of-turtles turtles with [ condition-variable = 1 ] 

    ;; obtain the number of turtles in the subset 
    let subcount count subset-of-turtles 

    ;; If there are more than 0 turtles in the subset, do the following 
    if subcount > 0 [ 
    ;; If n is greater than the number in the subset, only ask the subset 
    ifelse n >= subcount [ 
     ask max-n-of subcount subset-of-turtles [ my-variable ] [ 
     set size 2 
     ] 
    ] 
    ;; If n is NOT greater than the number in the subset, ask n of the subset 
    [ 
     ask max-n-of n subset-of-turtles [ my-variable ][ 
     set size 2 
     ] 
    ] 
    ] 
end 
+0

루크, 나는 당신에게 감사하는 방법을 모르겠다. 이것은 매우 신중하고 잘 설명 된 대답입니다. 나는 즉시 모델의 맥락에서 그것을 구현하고 다시 당신에게 연락하려고 노력할 것이다. 나는 그것을 upvoted지만, 내 평판은 너무 공개적으로 자사의 점수에 영향을 미칠 수 있습니다. – AlbertoCottica

+0

알베르토 (Alberto) - 문제 없어요. 그렇지 않다면 후속 질문을하십시오. 대답으로 문제를 해결할 수 있다면 문제를 "완료"해야합니다. –

+0

나는 아직도 문제가있다. 귀하의 제안에 감사드립니다! 내 뇌가 이제 튀었 어 - 나는 그것에 잠을 자고 내일 디버깅을 다시 시도 할 것이다. – AlbertoCottica