Created
January 13, 2022 13:25
-
-
Save IvanaGyro/baaf8a8718fc6ca78e2a54df69cfbe9f to your computer and use it in GitHub Desktop.
嘲諷北宜區間測速
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ''' | |
| 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