def agt_init(self):
self.y = 25
self.speed = Universe.default_speed
self.forward(self.speed*0.01)
def agt_step(self):
mx = Universe.max_speed
mn = Universe.min_speed
saka_down = Universe.saka_down_accelerator
saka_up = Universe.saka_up_accelerator
down_start = Universe.down_start
down_finish = Universe.down_finish
up_start = Universe.up_start
up_finish = Universe.up_finish
acc = self.aku - self.brake + self.saka_accelerator
if self.x <=down_start:
self.saka_accelerator = 0
elif self.x > down_start and self.x < down_finish:
self.saka_accelerator = saka_down
elif self.x >= up_start and self.x <up_finish:
self.saka_accelerator = -saka_up
else:
self.saka_accelerator = 0
if self.speed >= mx:
self.brake += 10
self.aku = 0
self.color = COLOR_RED
if self.color == COLOR_RED and self.speed <=100:
self.brake = 0
self.aku = -self.saka_accelerator
self.color = COLOR_BLACK
if self.speed <=mn :
self.brake = 0
self.aku += 5
self.color = COLOR_BLUE
if self.color == COLOR_BLUE and self.speed >=100:
self.brake = 0
self.aku = -self.saka_accelerator
self.color = COLOR_BLACK
aroundcars = self.make_agtset_around_own(1, False)
distance_front=9999
distance_back = 9999
for c in aroundcars:
if self.id == c.id - 1:
preceding_car = c
distance_front = measure_distance(self.x, self.y, preceding_car.x, preceding_car.y, Universe.miti)
if self.id == c.id + 1:
kouhou_car = c
distance_back = measure_distance(self.x, self.y, kouhou_car.x, kouhou_car.y, Universe.miti)
#前方車に加え後方車を設けたが車は追い抜いてしまった。他の案が必要
if self.color == COLOR_BLACK:
if distance_front < 1:
self.aku = 0
self.brake += 5
self.color = rgb(150,150,150)
if distance_front <= 0.5:
if self.speed >0:
self.aku = 0
self.brake = self.saka_accelerator
if self.speed == 0:
self.color = COLOR_GREEN #停止したとき緑に変化,距離が0.5以下の時speedが0になるまでブレーキ
if distance_front >= 10:
while distance_front <= 4:
self.aku += 5
self.brake =0
self.color = rgb(150,150,150)
if distance_back < 1:
self.aku = 0
self.brake += 5
self.color = rgb(150,150,150)
if distance_back <= 0.5:
if self.speed >0:
self.aku = 0
self.brake = self.saka_accelerator
if self.speed == 0:
self.color = COLOR_GREEN
if distance_back >= 10:
while distance_back<= 4:
self.aku += 5
self.brake =0
self.color = rgb(150,150,150)
if self.color == COLOR_BLUE:
if distance_front < 1:
self.aku = 0
self.brake += 5
self.color = COLOR_CYAN
if distance_front <= 0.5:
if self.speed >0:
self.aku = 0
self.brake = self.saka_accelerator
if self.speed == 0:
self.color = COLOR_GREEN
if distance_front >= 10:
while distance_front <= 4:
self.aku += 5
self.brake =0
self.color = COLOR_CYAN
if distance_back < 1:
self.aku = 0
self.brake += 5
self.color = COLOR_CYAN
if distance_back <= 0.5:
if self.speed >0:
self.aku = 0
self.brake = self.saka_accelerator
if self.speed == 0:
self.color = COLOR_GREEN
if distance_back >= 10:
while distance_back <= 4:
self.aku += 5
self.brake =0
self.color = COLOR_CYAN
if self.color == COLOR_RED:
if distance_front < 1:
self.aku = 0
self.brake += 5
self.color = COLOR_YELLOW
if distance_front <= 0.5:
if self.speed >0:
self.aku = 0
self.brake = self.saka_accelerator
if self.speed == 0:
self.color = COLOR_GREEN
if distance_front >= 10:
while distance_front <= 4:
self.aku += 5
self.brake =0
self.color = COLOR_YELLOW
if distance_back < 1:
self.aku = 0
self.brake += 5
self.color = COLOR_YELLOW
if distance_back <= 0.5:
if self.speed >0:
self.aku = 0
self.brake = self.saka_accelerator
if self.speed == 0:
self.color = COLOR_GREEN
if distance_back >= 10:
while distance_back <= 4:
self.aku += 5
self.brake =0
self.color = COLOR_YELLOW
acc = self.aku - self.brake + self.saka_accelerator
self.speed = self.speed + acc
self.forward(self.speed * 0.01)
if self.x >= 100:
del_agt(self)
上記のコードをエージェント部分で書きました
make_agtset_around_ownを用いて近くにいるエージェントの内idが小さいほうを前方車として距離を求めるようにしました。
しかしエージェントが追い抜いたり抜かしたりのような動きになりました。後続車の設定をすればできるかと思い同じようにidの大きいほうを後続車として取り組みましたが無理でした。
何かアドバイスがいただけたら幸いです。
実行動画も添付させていただきます。
一車線の道路上にクルマが連なっているモデルですので、
各車両が前方車のIDを保持し、
前方車との車間距離と速度を見て、自車の速度を調整すればよいと思います。
自然渋滞モデルが近い研究だと思いますので参考にしてください。
https://mas.kke.co.jp/fukuzatsu/traffic_jam/