2016-01-12 10 views
0

Как игрушка, она работает хорошо, но, очевидно, когда она масштабируется, она болота вниз. Как я могу сделать эту систему, не спрашивая черепах, чтобы спросить других черепах? код таким образом.Нужна помощь в ускорении системы частиц (или как попросить черепах не спрашивать других черепах.)

to go 
ask turtles 
    [ 
    ask other turtles [ 
        set heading towards myself 
        let D distance myself 
        let C .1/D - 1/(D^2) 
        if C > 1 [set C 1] 
        fd C 
        ] 
    ] 

tick 

конец

Я должен знать, как это сделать, но мозг не работает. Я буду гоняться за ответом и опубликовать свой собственный, если я получу его первым.

+0

Если все частицы (черепахи) применять силу на все другие черепах (например, проблемы гравитации мульти-тела), то есть N (N-1) сила, и это то, что вы здесь. Вы можете подумать о том, чтобы каждая из черепах реагировала на все остальные черепахи, а не на каждую черепаху. – JenB

ответ

0

Вы думаете об этом?

turtles-own [m] 

to setup 
    ca 
    crt 1000 [ 
     setxy random-xcor random-ycor 
     set shape "dot" 
     set color white 
     set m random-float 5 
     set size 2 * (m/pi)^.5 
     ] 
end 

to go 
ask turtles 
[ 
    set heading weighted-mean-heading other turtles 
    let mv sum [m/(distance myself^2)/[m] of myself ] of other turtles 
    if mv > .1 [set mv 1] 
    if mv < -.1 [ set mv -1] 
    bk mv 
] 

ask turtles 
    [ 
    ask other turtles in-radius (size/4) [ask myself [set m m + [m] of myself] die ] 
    set size 2 * (m/pi)^.5 
] 
end 

to-report weighted-mean-heading [turts] 
    let mean-x sum [sin towards myself * m/(distance myself^2)] of turts/sum [m/distance myself^2] of turts/m 
    let mean-y sum [cos towards myself * m/(distance myself^2)] of turts/sum [m/distance myself^2] of turts/m 
    report atan mean-x mean-y 
    end 
1

Вы делаете по существу N-body simulation. Главное отличие состоит в том, что у вас нет скорости в вашей системе. К сожалению, нет простого способа имитировать эту систему, не прося каждую черепаху просить каждую другую черепаху. Однако существует ряд более сложных алгоритмов.

Barnes-Hut делит пространство на дерево внедренных областей и вычисляет центр масс каждой области. Затем, когда черепаха определяет, куда идти, она смотрит на области, а не на отдельных черепах. Если вы знакомы с O-нотацией, она работает в O(n log(n)). Для работы с вашим уравнением должно быть возможно изменить Barnes-Hut.

Я не верю, что particle mesh methods может использоваться в вашей модели, но, честно говоря, я не совсем понимаю, как они работают.

Я замечаю, что знаменатель в вашем уравнении (.1/D - 1/(D^2), который является .1/(D - 1 * (D^2)) является кубическим в D, что означает, что он быстро упадет. Таким образом, вы можете ограничить черепах радиусом: ask other turtles in-radius 5 .... in-radius работает во времени пропорционально количеству пятен в радиусе (плюс число черепах в радиусе), поэтому, если это число значительно меньше, чем общее количество черепах, это может привести к приличному ускорению.