2017-12-01 1 views
0

ask을 사용하여 모든 거북이를 감싸고 싶지만 이 아닌은 임의 순서가 되길 원합니다. 내 솔루션이 목록을 통해 자신의 ID으로 분류 목록, 다음 루프 거북을 모두 추가하는 것입니다목록에있는 모든 거북이에게 물어 보는 방법

let sorted-turtles sort-on [who] turtles 
foreach sorted-turtles [ 
    x -> ask x [ ; x is the turtle 
    ; do something 
    ] 
] 
제대로 작동

하지만 은 크게 내 모델 속도가 느려집니다.

제 질문은 모든 거북이에게 사전 정의 된 순서로 무언가를하도록 요청하는 가장 좋은 방법입니까?

내가 직접 목록에 ask를 사용하여 시도했다 (예를 들어 ask sorted-turtles [ print who ]하지만 NetLogo이 ask이 목록보다는 agentset 필요하다고 말한다. 사전에

감사합니다, 닉

답변

2

첫째, 당신은 대신 sort turtles을 사용할 수 있습니다 sort-on [who] turtles입니다. 똑같은 일을하지만 짧고 관용적입니다. 더 빠를 지 모르겠지만 (조금 비트를 도울 수 있습니다.)

foreach sorted-turtles [ x -> ask x [ ... ] ] 패턴은 충분히 빠릅니다. 값 비싼 목록 작성입니다.

모델의 속도를 향상시키기 위해 할 수있는 중요한 작업은 정렬 된 거북 목록을 전역 변수에 저장하고 매번 다시 정렬하는 대신 해당 목록을 다시 사용하는 것입니다.

그러나 거북이를 끊임없이 만들거나 죽이지 않는다면 매번 정렬 된 목록을 다시 만들어야합니다.

+0

"... 정렬 된 목록을 다시 만들려면"또는 목록을 업데이트하십시오. 예를 들어, 새 거북이를 만들려면 이미 정렬 된 목록의 올바른 위치에 삽입하십시오. – mattsap

+2

@mattsap 좋은 지적. 삽입은 목록의 끝에서 (아마도 O (1)이기 때문에) 발생하기 때문에 쉽습니다. 그러나 O (n) 인 올바른 에이전트에 대한 목록을 스캔해야하기 때문에 삭제가 더 어려워 질 수 있습니다. 아니면 죽은 에이전트를 목록에 남겨두고 루프에'! = nobody'에 대한 체크를 추가 할 수 있지만 상황에 따라 많은 에이전트가 생성/제거되면 관리하기 어려워 질 수 있습니다. 그럴만 한 가치는 없어 ... –

+0

정확하게 '기억해두면'거북이 분류는 이미 내부적으로 정렬 된 순서이기 때문에 실제로 거북이를 분류 할 필요가 없습니다 –

관련 문제