top of page

車が前方車を追い抜かないようにしたい

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の大きいほうを後続車として取り組みましたが無理でした。 何かアドバイスがいただけたら幸いです。 実行動画も添付させていただきます。

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の大きいほうを後続車として取り組みましたが無理でした。 何かアドバイスがいただけたら幸いです。 実行動画も添付させていただきます。

bottom of page