Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import math
- import random
- def get_nothing():
- return None
- MAX_FOOD = 700
- MAX_WATER = 166400
- MIN_FOOD = 450
- MIN_WATER = 365 * 100
- class Zone:
- name = ''
- CLIMATE = 1
- CROPS = get_nothing()
- POPULATION = get_nothing()
- LIVESTOCK = get_nothing()
- WATER_CONSUMPTION = get_nothing()
- INCOME = 0
- MORTALITY = get_nothing()
- QUALITY_OF_LIFE = get_nothing()
- AIR_POLLUTION = 0
- WATER = get_nothing()
- TECH_PROGRESS = 1
- AIR_PURIFICATION = 0
- INVESTIOTION_IN = 0
- INVESTIOTION_OUT = 0
- FERTILITY = get_nothing()
- MORTALITY = get_nothing()
- MORTALITY_0 = get_nothing()
- MORTALITY_1 = get_nothing()
- SOIL_DEGRADATION = 0
- F = get_nothing()
- AIR_POLLUTION0 = get_nothing()
- SOIL_DEGRADATION0 = get_nothing()
- MINERALS = get_nothing()
- EDUCATION = get_nothing()
- def __init__(self, name):
- self.name = name.replace(' ', '-')
- self.csv = open(self.name + '.csv', 'w')
- self.csv.write('Time,Population,Income,TechProgress,Education,Climate,F,Crops\n')
- def post_init(self):
- self.CROPS0 = self.CROPS
- self.POPULATION0 = self.POPULATION
- self.WATER_CONSUMPTION0 = self.WATER_CONSUMPTION
- self.MORTALITY0 = self.MORTALITY
- self.old_derivF = 0
- def upd(self, dt):
- if self.name == 'South America' or self.name == 'South America':
- self.CROPS = self.POPULATION * self.CROPS0 / self.POPULATION0
- tmp1 = (self.WATER - self.POPULATION * self.WATER_CONSUMPTION) * self.CLIMATE * self.TECH_PROGRESS
- tmp2 = (self.WATER0 - self.POPULATION0 * self.WATER_CONSUMPTION0) * (1 + 7.5 * self.LIVESTOCK)
- self.CROPS = min(self.CROPS, self.CROPS0 * tmp1 / tmp2)
- tmp1 = self.CROPS0 * (1.0 - self.SOIL_DEGRADATION) * self.CLIMATE * self.TECH_PROGRESS
- tmp2 = 1 + 10 * self.LIVESTOCK
- self.CROPS = min(self.CROPS, tmp1 / tmp2)
- else:
- self.CROPS = self.POPULATION * self.CROPS0 / self.POPULATION0
- tmp1 = self.CROPS0 * (1 - self.SOIL_DEGRADATION) * self.CLIMATE * self.TECH_PROGRESS
- tmp2 = 1 + 10 * self.LIVESTOCK
- self.CROPS = min(self.CROPS, tmp1 / tmp2)
- self.SOIL_DEGRADATION += self.SOIL_DEGRADATION0 / self.TECH_PROGRESS * dt
- self.AIR_POLLUTION += (self.AIR_POLLUTION0 * (0.855 * self.MINERALS + 0.145 * self.LIVESTOCK * self.CROPS) / self.TECH_PROGRESS - self.AIR_PURIFICATION) * dt
- self.CLIMATE += -1e-18 * self.AIR_POLLUTION * dt
- temp = (-5e2 * self.AIR_PURIFICATION / self.TECH_PROGRESS + 6e11 * self.MINERALS * self.TECH_PROGRESS + self.INVESTIOTION_IN - self.INVESTIOTION_OUT + self.F)
- self.INCOME = temp / self.POPULATION
- old_EDU = self.EDUCATION
- self.EDUCATION = min(3e-13 * math.pow(self.INCOME, 8.5026), 100)
- deriv_EDU = self.EDUCATION - old_EDU
- oldF = self.F
- self.F += (0.35 * deriv_EDU / self.EDUCATION * self.F + self.old_derivF) * dt
- self.old_derivF = (self.F - oldF) / dt
- old_techp = self.TECH_PROGRESS
- self.TECH_PROGRESS += (0.00000001399211484 * self.INCOME * self.EDUCATION) / self.TECH_PROGRESS * dt
- deriv_TECHP = self.TECH_PROGRESS - old_techp
- self.POPULATION += (self.POPULATION / 1e3) * (self.FERTILITY - self.MORTALITY) * dt
- self.MORTALITY_0 = self.MORTALITY0 * deriv_TECHP * dt
- self.MORTALITY_1 = 0
- if self.WATER_CONSUMPTION < MIN_WATER:
- self.MORTALITY_1 = max(self.MORTALITY_1, 1000 * (1 - self.WATER_CONSUMPTION / MIN_WATER))
- xx = (self.CROPS * (1 + self.LIVESTOCK)) / self.POPULATION
- if xx < MIN_FOOD:
- self.MORTALITY_1 = max(self.MORTALITY_1, 1000 * (1 - xx / MIN_FOOD))
- self.MORTALITY = self.MORTALITY_0 + self.MORTALITY_1
- self.QUALITY_OF_LIFE = 20 * xx / MAX_FOOD
- self.QUALITY_OF_LIFE += 10 * self.LIVESTOCK
- self.QUALITY_OF_LIFE += 20 * (self.WATER_CONSUMPTION / MAX_WATER)
- self.QUALITY_OF_LIFE += 30 * (1 - self.MORTALITY / self.POPULATION)
- self.QUALITY_OF_LIFE += 15 * (1 - 1 / (self.INCOME + 1))
- self.QUALITY_OF_LIFE += 5 * (1 - 1 / (self.CLIMATE + 1))
- def write_down(self, time):
- # TODO: write all variables
- line = str(time) + ',' + str(self.POPULATION)
- line = line + ',' + str(self.INCOME)
- line = line + ',' + str(self.TECH_PROGRESS)
- line = line + ',' + str(self.EDUCATION)
- line = line + ',' + str(self.CLIMATE)
- line = line + ',' + str(self.F)
- line = line + ',' + str(self.CROPS)
- if self.name == 'North America':
- print(line)
- self.csv.write(line + '\n')
- # Gr. Middle East == North Africa + Near East
- africa = Zone('Africa')
- africa.CROPS = 10552996000
- africa.MINERALS = 25.3567
- africa.WATER = 121248399900
- africa.WATER_CONSUMPTION = 17.155
- africa.LIVESTOCK = 0.09933179102
- africa.SOIL_DEGRADATION0 = 0.014 * 1e-7
- africa.AIR_POLLUTION0 = 8.98
- africa.CLIMATE = 1e-18
- africa.FERTILITY = 49
- africa.MORTALITY = 14
- africa.POPULATION = 987240925
- africa.TECH_PROGRESS = 0.00000001399211484
- africa.F = 0.7 * 390.7 * 1e6
- africa.EDUCATION = 61
- europe = Zone('Europe')
- europe.CROPS = 238395160000
- europe.MINERALS = 44325.28774
- europe.WATER = 180458288600
- europe.WATER_CONSUMPTION = 54.75
- europe.LIVESTOCK = 0.08819771984
- europe.SOIL_DEGRADATION0 = 0.001 * 1e-7
- europe.AIR_POLLUTION0 = 6.475
- europe.CLIMATE = 1e-18
- europe.FERTILITY = 13
- europe.MORTALITY = 7
- europe.POPULATION = 446377929
- europe.TECH_PROGRESS = 0.00000001399211484
- europe.F = 0.95 * 9028.2 * 1e6
- europe.EDUCATION = 98
- east_europe = Zone('East Europe')
- east_europe.CROPS = 134040732000
- east_europe.MINERALS = 305893
- east_europe.WATER = 6570724502084
- east_europe.WATER_CONSUMPTION = 90.52
- east_europe.LIVESTOCK = 0.05960922493
- east_europe.SOIL_DEGRADATION0 = 0.033 * 1e-7
- east_europe.AIR_POLLUTION0 = 11.858
- east_europe.CLIMATE = 1e-18
- east_europe.FERTILITY = 15
- east_europe.MORTALITY = 9
- east_europe.POPULATION = 292897892
- east_europe.TECH_PROGRESS = 0.00000001399211484
- east_europe.F = 0.95 * 656.1 * 1e6
- east_europe.EDUCATION = 98
- near_east = Zone('Greater Middle East')
- near_east.CROPS = 508607093000
- near_east.MINERALS = 10184.11
- near_east.WATER = 109235162200
- near_east.WATER_CONSUMPTION = 87.6
- near_east.LIVESTOCK = 0.207629848
- near_east.SOIL_DEGRADATION0 = 0.0033 * 1e-7
- near_east.AIR_POLLUTION0 = 6.159
- near_east.CLIMATE = 1e-18
- near_east.FERTILITY = 17
- near_east.MORTALITY = 7
- near_east.POPULATION = 436738031
- near_east.TECH_PROGRESS = 0.00000001399211484
- near_east.F = 0.25 * 967.037 * 1e6
- near_east.EDUCATION = 74
- asia = Zone('Asia')
- asia.CROPS = 1137577423000
- asia.MINERALS = 202824
- asia.WATER = 1345012376629
- asia.WATER_CONSUMPTION = 34.675
- asia.LIVESTOCK = 0.08473485815
- asia.SOIL_DEGRADATION0 = 0.0033 * 1e-7
- asia.AIR_POLLUTION0 = 16.093
- asia.CLIMATE = 1e-18
- asia.FERTILITY = 10
- asia.MORTALITY = 7
- asia.POPULATION = 4461876215
- asia.TECH_PROGRESS = 0.00000001399211484
- asia.F = 0.1 * 9447.3 * 1e6
- asia.EDUCATION = 85
- australia = Zone('Australia')
- australia.CROPS = 52845564000
- australia.MINERALS = 421.764
- australia.WATER = 685357950250
- australia.WATER_CONSUMPTION = 310
- australia.LIVESTOCK = 0.102410541
- australia.SOIL_DEGRADATION0 = 0.0034 * 1e-7
- australia.AIR_POLLUTION0 = 15.37
- australia.CLIMATE = 1e-18
- australia.FERTILITY = 15
- australia.MORTALITY = 7
- australia.POPULATION = 24309329
- australia.TECH_PROGRESS = 0.00000001399211484
- australia.F = 0.82 * 479.6 * 1e6
- australia.EDUCATION = 99
- north_america = Zone('North America')
- north_america.CROPS = 508607093000
- north_america.MINERALS = 312840.2
- north_america.WATER = 426211950320
- north_america.WATER_CONSUMPTION = 210.97
- north_america.LIVESTOCK = 0.09882738604
- north_america.SOIL_DEGRADATION0 = 0.0042 * 1e-7
- north_america.AIR_POLLUTION0 = 16.351
- north_america.CLIMATE = 1e-18
- north_america.FERTILITY = 15
- north_america.MORTALITY = 8
- north_america.POPULATION = 359735880
- north_america.TECH_PROGRESS = 0.00000001399211484
- north_america.F = 0.8 * 11.031 * 1e6
- north_america.EDUCATION = 97
- south_america = Zone('South America')
- south_america.CROPS = 186238366000
- south_america.MINERALS = 144553
- south_america.WATER = 1252548288000
- south_america.WATER_CONSUMPTION = 87.6
- south_america.LIVESTOCK = 0.2910487881
- south_america.SOIL_DEGRADATION0 = 0.0017 * 1e-7
- south_america.AIR_POLLUTION0 = 9.247
- south_america.CLIMATE = 1e-18
- south_america.FERTILITY = 14
- south_america.MORTALITY = 8
- south_america.POPULATION = 422534692
- south_america.TECH_PROGRESS = 0.00000001399211484
- south_america.F = 0.8 * 1366.6 * 1e6
- south_america.EDUCATION = 89
- zones = [africa, europe, east_europe, near_east, asia, australia, north_america, south_america]
- T = 20
- STEP = 1 # one year
- start_time = 2000
- cur_time = start_time
- for zone in zones:
- zone.post_init()
- zone.write_down(cur_time)
- while cur_time < start_time + T:
- for zone in zones:
- try:
- zone.upd(STEP)
- except:
- print('error in zone:', zone.name)
- break
- cur_time += STEP
- for zone in zones:
- zone.write_down(math.floor(cur_time))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement