2014-03-24 3 views
2

NetLogo에 값과 각 값에 대한 확률 목록이 있습니다. 이제 그 확률 (가중 무작위 추첨)을 기반으로 임의의 값을 그립니다. 나는 Rnd extension를 사용하여 생각,하지만 난 아주 잘, 당신은/필요가 당신의 가치와 가능성에 대한 두 개의 분리 된 목록을 사용하려면목록에서 가중치를 적용한 무작위 추출 : rnd-extension을 사용하는 방법?

set values [1 2 3] 
set probabilities [0.2 0.3 0.5] 

set state (rnd:weighted-one-of agentset reporter-task) 

답변

1

, 그것을 할 수있는 방법을 도와주세요 가중치를 얻는 방법을 알아내는 기운 다 확장자를 으로 지정하고을 선택하고이 색인을 사용하여 기자가 rnd:weighted-one-of으로 전달 된 확률과 해당 값이 선택되면 목록의 값에 액세스합니다. 아래 코드에 example1입니다.

그러나 동일한 목록에 값과 확률을 모두 넣을 수 있다면 확장이 더 쉽습니다. 이는 "쌍"(즉, 각 하위 목록에 두 항목이있는 목록의 목록) 목록을 작성하여 수행됩니다. 그걸 가지고 있으면, 기자의 쌍 (item 1)의 두 번째 항목을 사용하여 쌍의 첫 번째 항목 (item 0)을 사용하여 상태를 설정할 수 있습니다. example2에서는이를 수행하는 방법을 보여줍니다.

extensions [ rnd ] 

to example1 
    let values [1 2 3] 
    let probabilities [0.2 0.3 0.5] 
    let indices n-values length values [ ? ] 
    let index rnd:weighted-one-of indices [ item ? probabilities ] 
    let state item index values 
end 

to example2 
    let pairs [[1 0.2] [2 0.3] [3 0.5]] 
    let state item 0 rnd:weighted-one-of pairs [ item 1 ? ] 
end 

편집 : 코멘트에 세스에 의해 언급 한 바와 같이

, 당신은 (map list values probabilities)으로 두 개의 별도의 목록에서 쌍 목록을 구성 할 수 있습니다. 그는 또한 코드가 item 0item 1 대신에 firstlast으로 "명확해질 수있다"고 언급했다.

example3는 모두 제안을 통합 :

to example3 
    let values [1 2 3] 
    let probabilities [0.2 0.3 0.5] 
    let pairs (map list values probabilities) 
    let state first rnd:weighted-one-of pairs [ last ? ] 
end 
+0

'values'와'probabilities' :''(map list values ​​확률)''pairs '만드는 법 –

+0

'item 0'과'item 1 대신에'first'와'last'가 조금 더 명확하게 보일 수도 있습니다 '? –

+0

좋은 지적. 내 대답을 편집했습니다. –

0

당신이 하나를 추가 할 것과, 당신은 RND 확장하지 않고이 작업을 수행 할 수 없습니다 어떤 확률을 사용합니다. 예를 들어 당신은 투표의 수에 따라 후보 1, 2 또는 3을 선택하고 싶다면 :

to-report weighted-rand 
    let values [1 2 3] 
    ;let probabilities [0.2 0.3 0.5] 
    let votes [5 7 9] 

    ; calculate the cumulative probability list 
    let cum reduce [ 
    lput (?2 + (ifelse-value (empty? ?1) [0] [last ?1])) ?1 
    ] (fput [] votes) 

    ; Roll a uniform random number weighted by the cumulative probability vector 
    let x random-float sum votes 
    let j -1 
    let found false 
    while [(not found) and (j < (length cum))] 
    [ 
    set j (j + 1) 
    if (x <= item j cum) [set found true] 
    ] 

    report item j values 
end 

이 조금 복잡 (감소 특히 까다로운 사용)입니다하지만 그것은 기본적으로하는 일은 만들 누적 확률 (득표 수)를 합한 다음 균일 한 무작위 값이 떨어진 목록에서 해당 위치를 찾습니다. 그런 다음 찾은 장소에 해당하는 값 목록에서 항목을 반환합니다.

관련 문제