Strona główna Polish Python Coders Group
   Strona główna   Pomoc Zaloguj się Rejestracja  
Witamy, Gość. Zaloguj się lub zarejestruj.
Czy dotarł do Ciebie email aktywacyjny?

Zaloguj się podając nazwę użytkownika, hasło i długość sesji

Aktualności:
Szukaj Szukaj
Strony: [1]   Do dołu
Drukuj
Wątek: [VPython] Symulacja ofiar i drapieżnika  (Przeczytany 3012 razy)
« : 16:25 27/06/16 »
babooshka Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 1


Witam wszystkich.
Mam problem ze stworzeniem symulacji, gdzie grupa ofiar (ptaków) ucieka przed drapieżnikiem. Problem nie brzmi zbyt skomplikowanie, ale nie mam praktycznie żadnego doświadczenia w kodowaniu, a i prowadzący też raczej nie ma umiejętności dobrego tłumaczenia zagadnień. Mam kod do programu, w którym ptaki okrążają jeden punkt. Bardzo prosiłbym o pomoc w jego przerobieniu tak, aby ten punkt był ruchomy, a nie statyczny i ptaki starały się uciec (czyli w efekcie otrzymać jednego drapieżnika i grupę ofiar). Będę bardzo wdzięczny za wszelką pomoc.

Serdecznie wszystkich pozdrawiam.

Kod
from numpy import*
from visual import*
scena=display(title='Predator', width=1000, height=1000, range=(500,500,500))
#scena.autocenter=True
#scena.autoscale=True
liczbaboidow=50
odleglosc_d=80#80
odleglosc_min=20#20
w_1=0.03#0.03
w_2=0.05#0.05
w_3=0.005#0.005
w_4=0.015#0.015
maxpredkosc=330#nieograniczona
mnoznik_poczatkowych_wektorow=2.5#2.5
mnoznik_pocz_pol=200
boid=zeros((liczbaboidow,6),float)
wektor_spojnosci_x=zeros((liczbaboidow),float)
wektor_spojnosci_y=zeros((liczbaboidow),float)
wektor_spojnosci_z=zeros((liczbaboidow),float)
nowa_predkosc_x=zeros((liczbaboidow),float)
nowa_predkosc_y=zeros((liczbaboidow),float)
nowa_predkosc_z=zeros((liczbaboidow),float)
wektor_rozdzielnosci_x=zeros((liczbaboidow),float)
wektor_rozdzielnosci_y=zeros((liczbaboidow),float)
wektor_rozdzielnosci_z=zeros((liczbaboidow),float)
wektor_jadra_x=zeros((liczbaboidow),float)
wektor_jadra_y=zeros((liczbaboidow),float)
wektor_jadra_z=zeros((liczbaboidow),float)
def odleglosc(A_x,A_y,A_z,B_x,B_y,B_z):
   return ((A_x-B_x)**2+(A_y-B_y)**2+(A_z-B_z)**2)**0.5
#boid[nr boida]=[polozenie_x,polozenie_y,polozenie_z,predkosc_x,predkosc_y,predkosc_z]
for i in range(liczbaboidow):
   boid[i]=[random.random()*mnoznik_pocz_pol,
            random.random()*mnoznik_pocz_pol,
            random.random()*mnoznik_pocz_pol,
            random.random()*mnoznik_poczatkowych_wektorow,
            random.random()*mnoznik_poczatkowych_wektorow,
            random.random()*mnoznik_poczatkowych_wektorow]
while True:
   rate(60)
   for i in range(liczbaboidow):
       n=0
       wektor_wynikowy_x=0
       wektor_wynikowy_y=0
       wektor_wynikowy_z=0
       predkosc_wynikowa_x=0
       predkosc_wynikowa_y=0
       predkosc_wynikowa_z=0
       for j in range(liczbaboidow):
           if odleglosc(boid[i][0],boid[i][1],boid[i][2],boid[j][0],boid[j][1],boid[j][2])<odleglosc_d and i!=j:
#            if odleglosc_min<odleglosc(boid[i][0],boid[i][1],boid[i][2],boid[j][0],boid[j][1],boid[j][2])<odleglosc_d:
               n=n+1
               wektor_wynikowy_x=wektor_wynikowy_x+boid[j][0]
               wektor_wynikowy_y=wektor_wynikowy_y+boid[j][1]
               wektor_wynikowy_z=wektor_wynikowy_z+boid[j][2]
               predkosc_wynikowa_x=predkosc_wynikowa_x+boid[j][3]
               predkosc_wynikowa_y=predkosc_wynikowa_y+boid[j][4]
               predkosc_wynikowa_z=predkosc_wynikowa_z+boid[j][5]
       if n>0:
           wektor_spojnosci_x[i]=wektor_wynikowy_x/n-boid[i][0]
           wektor_spojnosci_y[i]=wektor_wynikowy_y/n-boid[i][1]
           wektor_spojnosci_z[i]=wektor_wynikowy_z/n-boid[i][2]
           nowa_predkosc_x[i]=predkosc_wynikowa_x/n-boid[i][3]
           nowa_predkosc_y[i]=predkosc_wynikowa_y/n-boid[i][4]
           nowa_predkosc_z[i]=predkosc_wynikowa_z/n-boid[i][5]
       if n==0:
           wektor_spojnosci_x[i]=0
           wektor_spojnosci_y[i]=0
           wektor_spojnosci_z[i]=0
           nowa_predkosc_x[i]=0
           nowa_predkosc_y[i]=0
           nowa_predkosc_z[i]=0
 
       wektor_rozdzielnosci_x[i]=0
       wektor_rozdzielnosci_y[i]=0
       wektor_rozdzielnosci_z[i]=0
       for j in range(liczbaboidow):
           if odleglosc(boid[i][0],boid[i][1],boid[i][2],boid[j][0],boid[j][1],boid[j][2])<odleglosc_min and i!=j:
               wektor_rozdzielnosci_x[i]=wektor_rozdzielnosci_x[i]-(boid[i][0]-boid[j][0])
               wektor_rozdzielnosci_y[i]=wektor_rozdzielnosci_y[i]-(boid[i][1]-boid[j][1])
               wektor_rozdzielnosci_z[i]=wektor_rozdzielnosci_z[i]-(boid[i][2]-boid[j][2])
 
       wektor_jadra_x[i]=-boid[i][0]
       wektor_jadra_y[i]=-boid[i][1]
       wektor_jadra_z[i]=-boid[i][2]
 
   for obj in scena.objects:
       obj.visible = False
   sphere(pos=[0,0,0],color=color.yellow, radius=10)  
   for i in range(liczbaboidow):
       box(pos=(boid[i][0],boid[i][1],boid[i][2]),color=color.white, size=(5,5,5))
       if boid[i][3]+w_1*wektor_spojnosci_x[i]+w_2*wektor_rozdzielnosci_x[i]+w_3*nowa_predkosc_x[i]+w_4*wektor_jadra_x[i]>maxpredkosc:
           boid[i][3]=maxpredkosc
       else:
               boid[i][3]=boid[i][3]+w_1*wektor_spojnosci_x[i]+w_2*wektor_rozdzielnosci_x[i]+w_3*nowa_predkosc_x[i]+w_4*wektor_jadra_x[i]
       if boid[i][4]+w_1*wektor_spojnosci_y[i]+w_2*wektor_rozdzielnosci_y[i]+w_3*nowa_predkosc_y[i]+w_4*wektor_jadra_y[i]>maxpredkosc:
           boid[i][4]=maxpredkosc
       else:
               boid[i][4]=boid[i][4]+w_1*wektor_spojnosci_y[i]+w_2*wektor_rozdzielnosci_y[i]+w_3*nowa_predkosc_y[i]+w_4*wektor_jadra_y[i]
       if boid[i][5]+w_1*wektor_spojnosci_z[i]+w_2*wektor_rozdzielnosci_z[i]+w_3*nowa_predkosc_z[i]+w_4*wektor_jadra_z[i]>maxpredkosc:
           boid[i][5]=maxpredkosc
       else:
               boid[i][5]=boid[i][5]+w_1*wektor_spojnosci_z[i]+w_2*wektor_rozdzielnosci_z[i]+w_3*nowa_predkosc_z[i]+w_4*wektor_jadra_z[i]
#        boid[i][3]=boid[i][3]+w_1*wektor_spojnosci_x[i]+w_2*wektor_rozdzielnosci_x[i]+w_3*nowa_predkosc_x[i]
#       boid[i][4]=boid[i][4]+w_1*wektor_spojnosci_y[i]+w_2*wektor_rozdzielnosci_y[i]+w_3*nowa_predkosc_y[i]
 #      boid[i][5]=boid[i][5]+w_1*wektor_spojnosci_z[i]+w_2*wektor_rozdzielnosci_z[i]+w_3*nowa_predkosc_z[i]
       boid[i][0]=boid[i][0]+boid[i][3]
       boid[i][1]=boid[i][1]+boid[i][4]
       boid[i][2]=boid[i][2]+boid[i][5]
 
Zapisane
« Odpowiedz #1 : 18:23 20/06/18 »
zamakli Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 3


Główną wadą podstawowego modelu Lotki-Volterry jest fakt, że przy zerowej populacji drapieżników liczebność ofiar wzrasta nieograniczenie. Dlatego też w bardziej realistycznych modelach opisujących to zjawisko wprowadza się chociażby pojemność środowiska {\displaystyle K} K
Tutuapp 9apps Aptoide
Zapisane
Strony: [1]   Do góry
Drukuj
Skocz do:  

© 2007 - 2018 Polish Python Coders Group
Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines | Theme by PixelSlot