2014-01-17 3 views
1

꿀벌이 거북이 대리인이고 벌꿀이 패치 특정 변수 인 '벌꿀'모델을 만들고 있습니다. 제 모델에서, 각 패치에는 특정 분포에 따라 1-100 사이의 'honey-here'값이 할당됩니다.거북이 계산시 성능 문제

꿀벌은 꿀이 1 인 꽃에서 꿀을 수집 할 수있는 것으로 시작하여 그 대신 벌꿀 1 단위를받습니다. 벌이 벌꿀 = 2 인 꽃을 '타켓팅'하기 전에 벌꿀 = 1 인 총 꽃의 X %를 점유해야합니다 (예 : 꽃가루에 벌이 있음). 예를 들어 벌이 80 % 즉, 변수 꿀 = 1 인 총 10 개의 꽃이있는 경우 꿀벌은 꿀 2 개가있는 꽃을보고/타겟팅하기 전에 해당 꽃 8 개를 차지해야합니다. 각 꿀벌이 개별적으로 행동하기 때문에 % 점유율 값은 변화.

점유율 계산에 성능 문제가 있습니다. 이상적으로 계산은 거북 프로 시저 내에서 업데이트되므로 루프 내의 각 거북이에 적용해야합니다. 저는 여기에 현재 각 꿀벌 행동을 허용하기 전에 현재 %의 점유율을 설정하는 데 필요한 변수의 값 찾아야 내용은 다음과 같습니다 확인하기 위해 확인 후,

ask bees 
[   
;; set up variable based on ratio of number of turtles occupying target patch size against total number target patch size 
;; note -- don't do this in one step to avoid divide by 0 
let patch-count-current (count patches with [honey-here = bee-honey-target-size]) 
;; don't want number of bees, want number of unique patches 
let patch-target-occupy count patches with [ (count bees-here > 0) and (honey-here = bee-honey-target-size) ] 
... 

을 나중에 코드를 패치를-카운트 현재 ISN을 't 0, patch-target-occupy/patch-count-current를 통해 % 점유율을 찾았습니다.

이것은 내 프로세서 성능에서 매우 비싼 히트입니다. 특히 내 모델에서 기하 급수적 인 꿀벌의 수가 늘어남에 따라.

루프의 각 반복마다 많은 프로세서가 필요하지 않은 더 좋은 방법이 있습니까?

감사합니다.

-dp

답변

0

백분율 점유 그룹의 특성이며, 시뮬레이션 단계 만 한 번만 계산되어야한다. 귀하의 실적에 미치는 영향은 시뮬레이션에서 모든 벌에 대한 점유율을 계산하기 때문입니다. 주어진 '대상 - 꿀'에 대한 비율을 점유에 대한 계산은 다음과 같이 수 :

to-report calc-occupancy [target-honey] 
    report (sum [count turtles-here] of patches with [honey-here = target-honey])/count turtles 
end 
+0

이해하고 동의합니다. 내 시뮬레이션에서, 모든 거북이를 업데이트하기 위해 거북이 과정에서이 계산을 실행할 수있는 방법이 있는지 궁금하고 생각했습니다. 그러나 현재 나는이 계산을 그룹 프로 시저로 옮기기 위해 위의 방법과 비슷한 방법을 사용했습니다. 내 프로세서가 처리 할 수있는 유일한 방법입니다. 감사! – thedavidprice

1

StephenGuerin에 응답을 감안할 때, 당신은 수동으로 전역 변수로 카운트를 추적 할 수 있습니다. 한 번에 하나의 bee-honey-target-size 만 있으면 매우 간단합니다. patch-count-current은 글로벌이고 patch-target-occupy입니다. 그런 다음, 상황이 변화 할 때 늘리거나 줄입니다.

모델 라이브러리의 Sandpile 모델은이 기술을 사용하여 패치를 반복하지 않고도 총 모래 양을 추적합니다. total 전역 변수가 사용되는 방법을 확인하십시오.

모든 bee-honey-target-size의 개수를 한 번에 추적해야하는 경우 목록의 색인이 bee-honey-target-size 값에 해당하는 전역 변수에 카운트 목록을 저장할 수 있습니다. 불행히도 이것은 매우 복잡하기 때문에 헬퍼 함수를 ​​작성해야합니다.

여기에 설명이 필요하면 알려주세요.