Skip to content

Instantly share code, notes, and snippets.

@IvanaGyro
Created January 13, 2022 13:25
Show Gist options
  • Select an option

  • Save IvanaGyro/baaf8a8718fc6ca78e2a54df69cfbe9f to your computer and use it in GitHub Desktop.

Select an option

Save IvanaGyro/baaf8a8718fc6ca78e2a54df69cfbe9f to your computer and use it in GitHub Desktop.
嘲諷北宜區間測速
'''
WARNING: This model does NOT reflect the situation of the real world, and
I(the author) do NOT like to decide which policy the government should
implement based on accidents data.
'''
import sys
import random
if not sys.version_info.major == 3 and sys.version_info.minor >= 7:
print("Python 3.7 or higher is required.")
sys.exit(1)
class Vehicle:
def __init__(self, expected_speed_factor, angriness_factor):
self.expected_speed_factor = expected_speed_factor
self.angriness_factor = angriness_factor
class TrafficFlow:
def __init__(self, speed_mu, speed_sigma, angriness_mu, angriness_sigma):
self.speed_mu = speed_mu
self.speed_sigma = speed_sigma
self.angriness_mu = angriness_mu
self.angriness_sigma = angriness_sigma
def generate(self, amount):
for _ in range(amount):
free_speed = random.normalvariate(self.speed_mu, self.speed_sigma)
free_speed = 0 if free_speed < 0 else free_speed
angriness = random.normalvariate(self.angriness_mu,
self.angriness_sigma)
angriness = 0 if angriness < 0 else angriness
yield Vehicle(free_speed, angriness)
return
class SimplifiedAccidentModel:
def __init__(self, traffic_flow, speed_limit):
self.traffic_flow = traffic_flow
self.speed_limit = speed_limit
def run(self, amount):
crash_probability = 0.1
magic_number = 0.001
crashed_amount = 0
for vehicle in self.traffic_flow.generate(amount):
delta_speed = vehicle.expected_speed_factor - self.speed_limit
delta_speed = 0 if delta_speed < 0 else delta_speed
danger_probability = delta_speed * vehicle.angriness_factor * magic_number
if random.random() < danger_probability * crash_probability:
crashed_amount += 1
return crashed_amount / amount
if __name__ == '__main__':
FREE_SPEED_MU = 60
FREE_SPEED_SIGMA = 10
ANGRINESS_MU = 3
ANGRINESS_SIGMA = 1
traffic_flow = TrafficFlow(FREE_SPEED_MU, FREE_SPEED_SIGMA, ANGRINESS_MU,
ANGRINESS_SIGMA)
model40 = SimplifiedAccidentModel(traffic_flow, 40)
result = model40.run(10**5)
print(
f'There are {result * 100:.2f}% of vehicles crashed under the limit of 40 kph.'
)
model60 = SimplifiedAccidentModel(traffic_flow, 60)
result = model60.run(10**5)
print(
f'There are {result * 100:.2f}% of vehicles crashed under the limit of 60 kph.'
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment