1 | importˆàrandom |
---|
2 | fromˆàmathˆàimportˆà* |
---|
3 | importˆàvector |
---|
4 | |
---|
5 | classˆàBacteriaˆà(object): |
---|
6 | ˆà ˆà defˆà__init__(self,ˆàposition,ˆàvelocity,ˆàlifetime,ˆàmutated): |
---|
7 | ˆà ˆà ˆà ˆà self.position =ˆàposition |
---|
8 | ˆà ˆà ˆà ˆà self.velocity =ˆàvelocity |
---|
9 | ˆà ˆà ˆà ˆà self.lifetime =ˆàlifetime |
---|
10 | ˆà ˆà ˆà ˆà self.mutated =ˆàmutated |
---|
11 | |
---|
12 | ˆà ˆà defˆà__eq__(self,other): |
---|
13 | ˆà ˆà ˆà ˆà ifˆàself.position==other.position and\ |
---|
14 | ˆà ˆà ˆà ˆà ˆà ˆàself.velocity==other.velocity and\ |
---|
15 | ˆà ˆà ˆà ˆà ˆà ˆàself.lifetime==other.lifetime and\ |
---|
16 | ˆà ˆà ˆà ˆà ˆà ˆàself.mutated==other.mutated: |
---|
17 | ˆà ˆà ˆà ˆà ˆà ˆà returnˆàTrue |
---|
18 | ˆà ˆà ˆà ˆà returnˆàFalse |
---|
19 | |
---|
20 | ˆà ˆà defˆà__ne__(self,other): |
---|
21 | ˆà ˆà ˆà ˆà returnˆànot(self==other) |
---|
22 | |
---|
23 | ˆà ˆà defˆàcheck_collision(self,ˆàbacteria,ˆàdelta,ˆàbact_r,delta_t): |
---|
24 | ˆà ˆà ˆà ˆà forˆàbact inˆàbacteria: |
---|
25 | ˆà ˆà ˆà ˆà ˆà ˆà ifˆà0ˆà<ˆàabs(self.position -ˆàbact.position)ˆà<ˆàdelta +ˆà2*bact_r: |
---|
26 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà returnˆàbact |
---|
27 | ˆà ˆà ˆà ˆà returnˆàFalse |
---|
28 | |
---|
29 | ˆà ˆà defˆàcheck_dish_wall(self,position,radius,delta,bact_r): |
---|
30 | ˆà ˆà ˆà ˆà ifˆàabs(position)ˆà>ˆàradius -ˆà(bact_r +ˆàdelta): |
---|
31 | ˆà ˆà ˆà ˆà ˆà ˆà returnˆàTrue |
---|
32 | ˆà ˆà ˆà ˆà returnˆàFalse |
---|
33 | |
---|
34 | ˆà ˆà defˆàmove(self,ˆàbacteria,ˆàdelta_t,ˆàradius,ˆàdelta,ˆàbact_r): |
---|
35 | ˆà ˆà ˆà ˆà ifˆàself.check_dish_wall(self.position,radius,delta,bact_r): |
---|
36 | ˆà ˆà ˆà ˆà ˆà ˆà self.velocity =ˆàself.velocity.angleToCoord(-(pi/2ˆà- |
---|
37 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆàself.velocity.angle())) |
---|
38 | ˆà ˆà ˆà ˆà self.position +=ˆàself.velocity*delta_t |
---|
39 | |
---|
40 | ˆà ˆà defˆàcollision(self,ˆàother,ˆàbacteria,ˆàdelta_t,ˆàradius,ˆàdelta,ˆàbact_r): |
---|
41 | ˆà ˆà ˆà ˆà self.velocity,ˆàother.velocity =ˆàother.velocity,ˆàself.velocity |
---|
42 | ˆà ˆà ˆà ˆà self.move(bacteria,ˆàdelta_t,ˆàradius,ˆàdelta,ˆàbact_r) |
---|
43 | ˆà ˆà ˆà ˆà other.move(bacteria,ˆàdelta_t,ˆàradius,ˆàdelta,ˆàbact_r) |
---|
44 | ˆà ˆà |
---|
45 | ˆà ˆà defˆàreprod(self,ˆàtype,ˆàenv,ˆàp_max): |
---|
46 | ˆà ˆà ˆà ˆà ifˆàtypeˆà==ˆà's': |
---|
47 | ˆà ˆà ˆà ˆà ˆà ˆà prob =ˆà1ˆà-ˆàp_max*(env/100) |
---|
48 | ˆà ˆà ˆà ˆà else: |
---|
49 | ˆà ˆà ˆà ˆà ˆà ˆà prob =ˆà0.001 |
---|
50 | ˆà ˆà ˆà ˆà returnˆàrandom.random()ˆà<ˆàprobˆà ˆà |
---|
51 | |
---|
52 | ˆà ˆà defˆàasexual(self,ˆàbacteria,ˆàdelta_t,ˆàradius,ˆàdelta,ˆàbact_r,ˆàfull_lifetime): |
---|
53 | ˆà ˆà ˆà ˆà ifˆàself.find_place_a(bacteria,ˆàdelta,ˆàbact_r)\ |
---|
54 | ˆà ˆà ˆà ˆà ˆà ˆàandˆànot(self.check_dish_wall(self.position,radius,delta,3*bact_r)): |
---|
55 | ˆà ˆà ˆà ˆà ˆà ˆà pos1=self.position +ˆàvector.Vector(-(bact_r +ˆà0.75*delta),0) |
---|
56 | ˆà ˆà ˆà ˆà ˆà ˆà vel1=vector.Vector(1,0).angleToCoord(self.velocity.angle()) |
---|
57 | ˆà ˆà ˆà ˆà ˆà ˆà bacteria.append(Bacteria(pos1,ˆàself.rnd_velocity(pi), |
---|
58 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆàfull_lifetime,ˆàself.if_mutated_a())) |
---|
59 | ˆà ˆà ˆà ˆà ˆà ˆà pos2=self.position +ˆàvector.Vector((bact_r +ˆà0.75*delta),0) |
---|
60 | ˆà ˆà ˆà ˆà ˆà ˆà bacteria.append(Bacteria(pos2,ˆàself.rnd_velocity(0), |
---|
61 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆàfull_lifetime,ˆàself.if_mutated_a())) |
---|
62 | ˆà ˆà ˆà ˆà ˆà ˆà bacteria.remove(self) |
---|
63 | ˆà ˆà ˆà ˆà ˆà ˆà returnˆà1 |
---|
64 | ˆà ˆà ˆà ˆà returnˆà0 |
---|
65 | |
---|
66 | |
---|
67 | ˆà ˆà defˆàsexualˆà(self,ˆàother,ˆàbacteria,ˆàdelta_t,ˆàradius,ˆàdelta,ˆàbact_r, |
---|
68 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà full_lifetime): |
---|
69 | ˆà ˆà ˆà ˆà num_of_mut=1 |
---|
70 | ˆà ˆà ˆà ˆà center =ˆà(self.position+other.position)*0.5 |
---|
71 | ˆà ˆà ˆà ˆà ifˆàself.find_place_s(other,ˆàbacteria,ˆàdelta,ˆàbact_r)ˆàand\ |
---|
72 | ˆà ˆà ˆà ˆà ˆà ˆànot(self.check_dish_wall(center,radius,delta,bact_r*3)): |
---|
73 | ˆà ˆà ˆà ˆà ˆà ˆà bacteria.append(Bacteria(center + |
---|
74 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆàvector.Vector(-(bact_r*sqrt(2)ˆà+ˆà0.75*delta),0), |
---|
75 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆàself.rnd_velocity(pi),ˆàfull_lifetime, |
---|
76 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆàself.if_mutated_s(other,num_of_mut))) |
---|
77 | ˆà ˆà ˆà ˆà ˆà ˆà bacteria.append(Bacteria(center + |
---|
78 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆàvector.Vector((bact_r*sqrt(2)ˆà+ˆà0.75*delta),0), |
---|
79 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆàself.rnd_velocity(0),ˆàfull_lifetime, |
---|
80 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆàself.if_mutated_s(other,num_of_mut))) |
---|
81 | ˆà ˆà ˆà ˆà ˆà ˆà bacteria.append(Bacteria(center + |
---|
82 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆàvector.Vector(0,ˆà-(bact_r*sqrt(2)ˆà+ˆà0.75*delta)), |
---|
83 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆàself.rnd_velocity(3*pi/2),ˆàfull_lifetime, |
---|
84 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆàself.if_mutated_s(other,num_of_mut))) |
---|
85 | ˆà ˆà ˆà ˆà ˆà ˆà bacteria.append(Bacteria(center + |
---|
86 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆàvector.Vector(0,ˆà(bact_r*sqrt(2)ˆà+ˆà0.75*delta)), |
---|
87 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆàself.rnd_velocity(pi/2),ˆàfull_lifetime, |
---|
88 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆàself.if_mutated_s(other,num_of_mut))) |
---|
89 | ˆà ˆà ˆà ˆà ˆà ˆà bacteria.remove(other) |
---|
90 | ˆà ˆà ˆà ˆà ˆà ˆà bacteria.remove(self) |
---|
91 | ˆà ˆà ˆà ˆà ˆà ˆà returnˆànum_of_mut |
---|
92 | ˆà ˆà ˆà ˆà else: |
---|
93 | ˆà ˆà ˆà ˆà ˆà ˆà self.collision(other,bacteria,delta_t,radius,delta,bact_r) |
---|
94 | ˆà ˆà ˆà ˆà ˆà ˆà returnˆà0 |
---|
95 | |
---|
96 | ˆà ˆà defˆàfind_place_a(self,ˆàbacteria,ˆàdelta,ˆàbact_r):ˆà#searches for place for children |
---|
97 | ˆà ˆà ˆà ˆà forˆàbact inˆàbacteria: |
---|
98 | ˆà ˆà ˆà ˆà ˆà ˆà ifˆà0ˆà<ˆàabs(bact.position -ˆàself.position)ˆà<ˆà(bact_r*3ˆà+ˆàdelta*2): |
---|
99 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà returnˆàFalse |
---|
100 | ˆà ˆà ˆà ˆà returnˆàTrue |
---|
101 | |
---|
102 | ˆà ˆà ˆà ˆà ˆà ˆà |
---|
103 | ˆà ˆà defˆàfind_place_s(self,ˆàother,ˆàbacteria,ˆàdelta,ˆàbact_r): |
---|
104 | ˆà ˆà ˆà ˆà forˆàbact inˆàbacteria: |
---|
105 | ˆà ˆà ˆà ˆà ˆà ˆà ifˆàbact!=selfˆàandˆàbact!=other: |
---|
106 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ifˆà0ˆà<ˆàabs(bact.position -ˆà(self.position +ˆàother.position)*0.5)\ |
---|
107 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà<ˆà((sqrt(2)ˆà+ˆà1)*bact_r*2ˆà+ˆàdelta*2): |
---|
108 | ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà returnˆàFalse |
---|
109 | ˆà ˆà ˆà ˆà returnˆàTrue |
---|
110 | |
---|
111 | |
---|
112 | ˆà ˆà defˆàrnd_velocity(self,angle): |
---|
113 | ˆà ˆà ˆà ˆà vel=vector.Vector(1,0) |
---|
114 | ˆà ˆà ˆà ˆà returnˆàvel.angleToCoord(angle +ˆàpi*random.randrange(-4,5)/16) |
---|
115 | |
---|
116 | ˆà ˆà defˆàif_mutated_a(self): |
---|
117 | ˆà ˆà ˆà ˆà returnˆàself.mutated |
---|
118 | |
---|
119 | ˆà ˆà defˆàif_mutated_s(self,other,n): |
---|
120 | ˆà ˆà ˆà ˆà ifˆàself.mutated==Falseˆàandˆàother.mutated ==ˆàFalse: |
---|
121 | ˆà ˆà ˆà ˆà ˆà ˆà returnˆàFalse |
---|
122 | ˆà ˆà ˆà ˆà r =ˆà(random.randint(0,ˆà3)ˆà==ˆà0) |
---|
123 | ˆà ˆà ˆà ˆà ifˆàr: |
---|
124 | ˆà ˆà ˆà ˆà ˆà ˆà n+=1 |
---|
125 | ˆà ˆà ˆà ˆà returnˆàr |
---|