2013-08-14 3 views
2

NetLogo에서 "소셜 네트워크"를 구성하려고합니다. 링크로 연결된 여러 연령대의 사람들로 구성된 그룹입니다.다른 유형의 연결된 NetLogo 에이전트의 소셜 네트워크 만들기

NetLogo 구문의 일부분을 아직 완전히 익히지 않았기 때문에 함께 사용하는 데 문제가 있습니다. 나는 지난 주에 내 코드에서 품종 만 사용하기 시작했으나 아직 완전히 완성하지 못했습니다. 또는 나는 그들을 복잡하게 끝났습니다. 확실하지 않습니다.

관련 코드는 해당 기능이 "네트워크 생성"이라는 것과 관련하여 아래에 있습니다. 각 유형의 다른 에이전트를 일정량 연결 (각 에이전트가 가득 차 있지 않은 경우)하려면 각 에이전트 (총 약 800 개가 있음)에게 문의해야합니다. 거북이가 번식 유아의 경우 예를 들어 총 10 개의 링크가 있고 그 중 5 개는 다른 유아, 2 개는 어린이, 2 개는 성인, 1 ~ 45는 1 개의 링크입니다. 첫 번째 노드가 유아이고 성인과 연결하는 경우 성인 노드가 연결하려고 시도하는 유아의 수를 감축해야합니다.

현재 거북이에게 어떤 품종인지 묻는 법을 배울 수 없으므로 올바른 품종에 연결할 수 있습니다. 누군가가 나를 도울 수 있다면 나는 미친 듯이 감사 할 것입니다. 이것은 코드의 작은 부분 일 뿐이지 만, 지금 나를 미치게 만들었습니다.

내가 시도 할 때마다 오류가 발생하고 모든 아이디어와 의지가 살아납니다. 시간 내 미리 감사드립니다. 당신은 더 나은 알고리즘에 대한 어떤 생각을 가지고 있지만 내가 또한 기능 요원 사이에 "일시 중지"링크를 할 수 있을지 궁금하네요 너무

breed [toddlers toddler] 
breed [children child] 
breed [adults adult] 
breed [over45s over45] 

globals 
[ 
    num-nodes 
] 

toddlers-own 
[ 
    tod-total-connections 
    tod-tods 
    tod-children 
    tod-adults 
    tod-over45s 
] 

children-own 
[ 
    child-total-connections 
    child-tods 
    child-children 
    child-adults 
    child-over45s 
] 

adults-own 
[ 
    adult-total-connections 
    adult-tods 
    adult-children 
    adult-adults 
    adult-over45s 
] 

over45s-own 
[ 
    over45-total-connections 
    over45-tods 
    over45-children 
    over45-adults 
    over45-over45s 
] 


to generate 
    clear-all 
    create-toddlers num-toddlers 
    create-children num-children 
    create-adults num-adults 
    create-over45s num-over45 
    create-network 
    setup 
    reset-ticks 
end 

to setup 
    ask turtles 
    [reset-node] 
    ask links 
    [set color gray + 1.5] 
    ask adults 
    [set shape "circle" 
     set size 4] 
    ask toddlers 
    [set shape "face happy" 
     set size 4] 
    ask over45s 
    [set shape "triangle" 
     set size 4] 


    ;;INITIALISE BREEDS 

    ;;Initialise Toddlers 
    ask toddlers [set total-connections 10] 
    ask toddlers [set tod-tods 5] 
    ask toddlers [set tod-children 2] 
    ask toddlers [set tod-adults 2] 
    ask toddlers [set tod-over45s 1] 

    ;;Initialise Children 
    ask children [set total-connections 17] 
    ask children [set child-tods 3] 
    ask children [set child-children 8] 
    ask children [set child-adults 5] 
    ask children [set child-over45s 1] 

    ;;Initialise Adults 
    ask adults [set total-connections 13] 
    ask adults [set adult-tods 1] 
    ask adults [set adult-children 3] 
    ask adults [set adult-adults 6] 
    ask adults [set adult-over45s 3] 

    ;;Initialise Over45s 
    ask over45s [set total-connections 12] 
    ask over45s [set over45-tods 1] 
    ask over45s [set over45-children 1] 
    ask over45s [set over45-adults 5] 
    ask over45s [set over45-over45s 5] 



    ;; Layout turtles: 
    layout-circle (sort turtles) max-pxcor - 8 
    ask turtles 
    [ 
    facexy 0 0 
    if who mod 2 = 0 [fd 4] 
    ] 
    display 
end 


;; THIS IS THE PROBLEM FUNCTION 
to create-network 
    let q 0 
    let n 0 
    while [q < count turtles] 
    [ 
    let m 1 
    while [m < count turtles] 
     [ 
      make-link-between turtle n 
        turtle ((n + m) mod count turtles) 
      set m m + 1 
;;results in a fully connected network which I don't want 
     ] 
    set n n + 1 
    set q q + 1 
    ] 

end 


;; connects the two nodes 
to make-link-between [node1 node2] 
    ask node1 [ 
    create-link-with node2 
     [ set color gray + 1.5] 
    ] 
end 

매우 환영받을 코드없는 경우에도 마찬가지입니다. 예를 들어 어린이들 사이의 링크를 모두 끄거나 끈다. 나는 링크가 타이 모드 속성을 가지고 있지만 이것이 이것을 할 수 있는지 확신하지 못한다. 내가 읽은 바로는 움직이는 요원들을 함께 모으는 것에 관한 것 같습니다. 링크를 해제하는 방법으로 untie를 사용할 수도 있지만 아직 링크를 해제 할 수 있습니까?

편집 : 링크 숨기기가 더 적절할 수 있습니다. 다음 일이 어떻게 올바른 링크를 숨기는 것입니다

+0

http://groups.yahoo.com/group/netlogo-users/message/17116에서도이 질문을했습니다. 두 곳에서 질문을하면 (netlogo 사용자와 여기), 두 장소에서 모두 그렇게 말하면 예의 바르게 처리되므로 사람들은 이미 다른 장소에서 대답 된 한 곳에서 무언가에 답하는 노력을 낭비하지 않습니다. –

+0

죄송 합니다만, 그 당시에 양쪽에 게시하는 것은 내 의도가 아니 었습니다. 나는 처음으로 야후 그룹에 올렸지 만 그룹에 게시하지 않는 대신 여기에 왔습니다. 그런 다음 나중에 야후 그룹에 게시되었음을 알게되었습니다. 나는 그것을 염두에두고 있습니다. – Steve

답변

2

먼저,이 길에서이하자 :

내가 그것을

무엇 품종 현재의 거북을 요청하는 방법을 작동하지 않을 수 있습니다

거북이는 a breed variable입니다.

그러나 저는 더 일반적으로 NetLogo의 작업 방식에 대해 아직 언급하지 않았다고 생각합니다. while 루프와 인덱스를 사용하는 코드는 매우 중요합니다. 자신의 who 숫자로 거북이를 다루는 일을 피해야합니다 (자신의 레이아웃 코드가 드문 예외 일 수 있음). NetLogo는 목록, 에이전트 세트 및 가능한 경우 기능 변형에 관한 모든 것입니다.

어쨌든 여기에 귀하의 문제에 대한 더 나은 접근 방법이 있습니다. 가장 까다로운 점은 계산 방법이 reverse-num-connexions인데 어떻게 작동하는지 알아 내려고하면 목록을 처리하는 방법을 배우기위한 훌륭한 연습이되어야합니다.

또한 거북이가 원하는 수의 연결로 끝나지 않을 수도 있습니다. 그 이유는 모든 대상이 최대치에 도달했기 때문입니다. 인구 비율에 따라 다릅니다.

breed [ toddlers toddler ] 
breed [ children child ] 
breed [ adults adult ] 
breed [ over45s over45 ] 

to setup 
    clear-all 
    create-toddlers 200 
    create-children 200 
    create-adults 200 
    create-over45s 200 
    create-network 
    reset-ticks 
end 

to create-network 

    let connexions (list 
    (list toddlers toddlers 5) 
    (list toddlers children 2) 
    (list toddlers adults 2) 
    (list toddlers over45s 1) 
    (list children toddlers 3) 
    (list children children 8) 
    (list children adults 5) 
    (list children over45s 1) 
    (list adults toddlers 1) 
    (list adults children 3) 
    (list adults adults 6) 
    (list adults over45s 3) 
    (list over45s toddlers 1) 
    (list over45s children 1) 
    (list over45s adults 5) 
    (list over45s over45s 5) 
) 

    foreach connexions [ 
    let source-breed item 0 ? 
    let target-breed item 1 ? 
    let num-connexions item 2 ? 
    let reverse-num-connexions item 2 first filter [ 
     item 0 ? = target-breed and item 1 ? = source-breed 
    ] connexions 
    ask source-breed [ 
     repeat num-connexions [ 
     let possible-targets other target-breed with [ 
      (not member? myself link-neighbors) and 
      (count link-neighbors with [ breed = source-breed ] < reverse-num-connexions) 
     ] 
     let target one-of possible-targets 
     if target != nobody [ create-link-with target ] 
     ] 
    ] 
    ] 

end 

reverse-num-connexions 설명 (편집)

의 우리가 CONNEXIONS의 번호 목록을 통과하는 가정 해 봅시다, 우리는 [toddlers adults 2]에 도착. 그것은 각 유아가 성인 2 명과의 연결을 가져야한다고 말합니다. 그러나 목록을 더 내려다 보면 어른이 1 명 미만의 유아에만 연결되어야한다는 것을 알 수 있습니다 : [adults toddlers 1]. 이 숫자 (1)는 reverse-num-connexions으로 저장하기 위해 추출하려고하는 것입니다.

먼저 할 일은 올바른 하위 목록을 찾는 것입니다. 이것은 "근원"과 "목표"품종이 현재 것과 반대의 품종이 될 것입니다. filter [ item 0 ? = target-breed and item 1 ? = source-breed ] connexions이라는 표현식은 해당 하위 목록 인 [[adults toddlers 1]] 만있는 목록을 반환합니다. 추출하려면 first을 사용합니다. 그러면 하위 목록 [adults toddlers 1] 만 제공됩니다. 이제 해당 하위 목록의 마지막 항목 인 item 2이 필요합니다. 이것은 우리에게 우리가 있었던 1을 줄 것입니다.

+0

- 놀랍습니다, 정말 고마워요. 약간의 일이 무엇인지 설명해 주시겠습니까? 나는 실제로 어떤 일이 일어나고 있는지 잘 지켜보고 있지 않으며, 내가 일하는 것을 이해하는 데 관심이 있습니다. 심지어 코드의 주석이나 두 개라도 훌륭 할 것입니다. – Steve

+1

지금은 시간이 없지만 나중에 다시 올 수 있습니다. 한편 http://ccl.northwestern.edu/netlogo/docs/programming.html과 F1이 가장 친한 친구가되어야합니다. :-) –

+0

감사합니다. 기회가 있다면 감사하게 생각합니다. 나는 NetLogo를 가르치려고 노력하고 있지만 개인적으로 누가 그것을 알고 있는지 알지 못하므로 때로는 어려울 수 있습니다. 나는 사이트와 사전에 많은 시간을 보냈다. Ctrl + F도 내 친구입니다. 나는 소스 - 품종 또는 목표 품종에 관해서는 아무것도 찾을 수 없다. (나는 그들이하는 일을 이해할 수있다. 나는 그들이 어디에서 왔는지 이해하고 싶다.) 또는 여기서 일어나고있는 일. 항목 2 첫 번째 필터 [ 항목 0? = 출처 - 유형 및 항목 1? = target-breed ] connexions' – Steve