5

나는 줄리아에서 미세 시뮬레이션 모델을 구축 중입니다. 나는 내 기능의 구조를 만들었고 1 "사람"을 위해 훌륭하게 돌아 간다. 모델을 통해 100000 명이 넘는 사람들을 실행하고 한 위치에 결과를 저장하는 스크립트를 작성하고 싶습니다.Julia, 함수를 여러 번 실행하여 배열에 결과 저장

결국 저는 이것을 병렬로 실행하고 싶습니다.

아래에는 더미 확률을 가진 코드의 간단한 작업 버전이 포함되었습니다.

using Distributions 

# Microsim function 
function MicroSim(start_age, stages) 
    stage = 0 
    age = start_age 

    # Set all trackers to 0 
    Death_tracker = 0 
    Disease_tracker = 0 

    # While loop 
    while stage <= stages 
    age = age 

    ########################################################### 
    # Probability of Death 
    pD = 0.02 

    if age == 100 
     pD = 1.0 
    else 
     pD = pD 
    end 

    # Coin flip 
    dist_pD = Bernoulli(pD) 
    Died = rand(dist_pD, 1) 

    if Died == [1] 
     Death_tracker = 1 
     # death tracker loop break 
     if Death_tracker == 1 
     # println("I died") 
     break 
     end 
    else 
     Death_tracker = Death_tracker 
    end 
    ########################################################### 

    # Update age and stage 
    age = age + 1 
    stage = stage + 1 

    end 

return age, Death_tracker 

end 


MicroSim(18,100) 
+1

수 없습니다 당신 루프 기능 여러 번? 'for i in 1 : 100 println (MicroSim (18,100)) end' – amrods

답변

6

당신은 기능 (병렬화) mappmap 찾고 있습니다. 최소한의 작업 예제를 제공하기 위해 함수를 단순화했습니다. (궁금한 사항에 최소한의 예제를 작성하는 방법에 대해서는 나중에 this link을 참조하십시오.)

map은 (사용자가 지정하는) 함수를 사용하여 배열의 모든 요소에 적용합니다. 함수가 여러 인수를 취하는 경우 (사용자가 수행하는 것처럼) 복수 연속 배열 map을 공급하면됩니다. map은 모든 함수 결과와 함께 새로운 배열을 반환합니다.

function MicroSim(start_age, stages) 
    return rand(start_age), rand(stages) 
end 

Start_Ages = [10, 20, 15] 
Stages = [1, 4, 5] 

Results = map(MicroSim, Start_Ages, Stages) 

일을 병렬 처리하려는 경우 세 가지 간단한 조정 만 있습니다. 1. addprocs() 기능을 사용하여 원하는 추가 프로세스를 많이 추가하십시오. 2. 함수를 선언 할 때 @everywhere 매크로를 사용하여 작업자 프로세스도 매크로에 액세스 할 수 있도록하십시오. 3. map 대신 기능 pmap를 사용

addprocs(2) 

@everywhere begin 
    function MicroSim(start_age, stages) 
     return rand(start_age), rand(stages) 
    end 
end 

Results = pmap(MicroSim, Start_Ages, Stages) 
+0

@ vectorize_2arg도 사용할 수 있습니까? –

+0

답장을 보내 주셔서 감사합니다. 지도 함수는 올바른 요소를 적용하고 결과를 생성하지만 모든 요소는 벡터에 저장되며 각 요소는 튜플입니다. 배열로 변환하는 쉬운 방법이 있습니까? – MJH

+0

@MJH 지금 당신의 함수는 튜플을 출력하고 있습니다. 반환 값을 대괄호로 묶으면 배열을 출력합니다. 그런 다음,'BigArray = vcat (results ...) '를 사용하여 시뮬레이션을 실행할 때마다 하나의 배열로 변환 할 수 있습니다. –

관련 문제