Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.19 KB | None | 0 0
  1. import math
  2. import random
  3.  
  4. def get_nothing():
  5.     return None
  6.  
  7. MAX_FOOD = 700
  8. MAX_WATER = 166400
  9. MIN_FOOD = 450
  10. MIN_WATER = 365 * 100
  11.  
  12. class Zone:
  13.     name = ''
  14.  
  15.     CLIMATE    = 1
  16.     CROPS      = get_nothing()
  17.     POPULATION = get_nothing()
  18.     LIVESTOCK  = get_nothing()
  19.     WATER_CONSUMPTION = get_nothing()
  20.     INCOME     = 0
  21.     MORTALITY  = get_nothing()
  22.     QUALITY_OF_LIFE = get_nothing()
  23.     AIR_POLLUTION = 0
  24.     WATER = get_nothing()
  25.     TECH_PROGRESS = 1
  26.     AIR_PURIFICATION = 0
  27.     INVESTIOTION_IN = 0
  28.     INVESTIOTION_OUT = 0
  29.     FERTILITY = get_nothing()
  30.     MORTALITY = get_nothing()
  31.     MORTALITY_0 = get_nothing()
  32.     MORTALITY_1 = get_nothing()
  33.     SOIL_DEGRADATION = 0
  34.     F = get_nothing()
  35.  
  36.     AIR_POLLUTION0 = get_nothing()
  37.     SOIL_DEGRADATION0 = get_nothing()
  38.  
  39.     MINERALS = get_nothing()
  40.     EDUCATION = get_nothing()
  41.  
  42.     def __init__(self, name):
  43.         self.name = name.replace(' ', '-')
  44.  
  45.         self.csv = open(self.name + '.csv', 'w')
  46.         self.csv.write('Time,Population,Income,TechProgress,Education,Climate,F,Crops\n')
  47.  
  48.     def post_init(self):
  49.         self.CROPS0 = self.CROPS
  50.         self.POPULATION0 = self.POPULATION
  51.         self.WATER_CONSUMPTION0 = self.WATER_CONSUMPTION
  52.         self.MORTALITY0 = self.MORTALITY
  53.         self.old_derivF = 0
  54.  
  55.     def upd(self, dt):
  56.         if self.name == 'South America' or self.name == 'South America':
  57.             self.CROPS = self.POPULATION * self.CROPS0 / self.POPULATION0
  58.             tmp1 = (self.WATER - self.POPULATION * self.WATER_CONSUMPTION) * self.CLIMATE * self.TECH_PROGRESS
  59.             tmp2 = (self.WATER0 - self.POPULATION0 * self.WATER_CONSUMPTION0) * (1 + 7.5 * self.LIVESTOCK)
  60.             self.CROPS = min(self.CROPS, self.CROPS0 * tmp1 / tmp2)
  61.             tmp1 = self.CROPS0 * (1.0 - self.SOIL_DEGRADATION) * self.CLIMATE * self.TECH_PROGRESS
  62.             tmp2 = 1 + 10 * self.LIVESTOCK
  63.             self.CROPS = min(self.CROPS, tmp1 / tmp2)
  64.         else:
  65.             self.CROPS = self.POPULATION * self.CROPS0 / self.POPULATION0
  66.             tmp1 = self.CROPS0 * (1 - self.SOIL_DEGRADATION) * self.CLIMATE * self.TECH_PROGRESS
  67.             tmp2 = 1 + 10 * self.LIVESTOCK
  68.  
  69.             self.CROPS = min(self.CROPS, tmp1 / tmp2)
  70.  
  71.         self.SOIL_DEGRADATION += self.SOIL_DEGRADATION0 / self.TECH_PROGRESS * dt
  72.         self.AIR_POLLUTION += (self.AIR_POLLUTION0 * (0.855 * self.MINERALS + 0.145 * self.LIVESTOCK * self.CROPS) / self.TECH_PROGRESS - self.AIR_PURIFICATION) * dt
  73.         self.CLIMATE += -1e-18 * self.AIR_POLLUTION * dt
  74.  
  75.         temp = (-5e2 * self.AIR_PURIFICATION / self.TECH_PROGRESS + 6e11 * self.MINERALS * self.TECH_PROGRESS + self.INVESTIOTION_IN - self.INVESTIOTION_OUT + self.F)
  76.         self.INCOME = temp / self.POPULATION
  77.  
  78.         old_EDU = self.EDUCATION
  79.         self.EDUCATION = min(3e-13 * math.pow(self.INCOME, 8.5026), 100)
  80.         deriv_EDU = self.EDUCATION - old_EDU
  81.  
  82.         oldF = self.F
  83.         self.F += (0.35 * deriv_EDU / self.EDUCATION * self.F + self.old_derivF) * dt
  84.         self.old_derivF = (self.F - oldF) / dt
  85.  
  86.         old_techp = self.TECH_PROGRESS
  87.         self.TECH_PROGRESS += (0.00000001399211484 * self.INCOME * self.EDUCATION) / self.TECH_PROGRESS * dt
  88.         deriv_TECHP = self.TECH_PROGRESS - old_techp
  89.  
  90.         self.POPULATION += (self.POPULATION / 1e3) * (self.FERTILITY - self.MORTALITY) * dt
  91.  
  92.         self.MORTALITY_0 = self.MORTALITY0 * deriv_TECHP * dt
  93.         self.MORTALITY_1 = 0
  94.  
  95.         if self.WATER_CONSUMPTION < MIN_WATER:
  96.             self.MORTALITY_1 = max(self.MORTALITY_1, 1000 * (1 - self.WATER_CONSUMPTION / MIN_WATER))
  97.  
  98.         xx = (self.CROPS * (1 + self.LIVESTOCK)) / self.POPULATION
  99.  
  100.         if xx < MIN_FOOD:
  101.             self.MORTALITY_1 = max(self.MORTALITY_1, 1000 * (1 - xx / MIN_FOOD))
  102.  
  103.         self.MORTALITY = self.MORTALITY_0 + self.MORTALITY_1
  104.  
  105.         self.QUALITY_OF_LIFE = 20 * xx / MAX_FOOD
  106.         self.QUALITY_OF_LIFE += 10 * self.LIVESTOCK
  107.         self.QUALITY_OF_LIFE += 20 * (self.WATER_CONSUMPTION / MAX_WATER)
  108.         self.QUALITY_OF_LIFE += 30 * (1 - self.MORTALITY / self.POPULATION)
  109.         self.QUALITY_OF_LIFE += 15 * (1 - 1 / (self.INCOME + 1))
  110.         self.QUALITY_OF_LIFE += 5 * (1 - 1 / (self.CLIMATE + 1))
  111.  
  112.  
  113.     def write_down(self, time):
  114.         # TODO: write all variables
  115.         line = str(time) + ',' + str(self.POPULATION)
  116.         line = line + ',' + str(self.INCOME)
  117.         line = line + ',' + str(self.TECH_PROGRESS)
  118.         line = line + ',' + str(self.EDUCATION)
  119.         line = line + ',' + str(self.CLIMATE)
  120.         line = line + ',' + str(self.F)
  121.         line = line + ',' + str(self.CROPS)
  122.  
  123.         if self.name == 'North America':
  124.             print(line)
  125.  
  126.         self.csv.write(line + '\n')
  127.  
  128. # Gr. Middle East == North Africa + Near East
  129.  
  130. africa = Zone('Africa')
  131. africa.CROPS = 10552996000
  132. africa.MINERALS = 25.3567
  133. africa.WATER = 121248399900
  134. africa.WATER_CONSUMPTION = 17.155
  135. africa.LIVESTOCK = 0.09933179102
  136. africa.SOIL_DEGRADATION0 = 0.014 * 1e-7
  137. africa.AIR_POLLUTION0 = 8.98
  138. africa.CLIMATE = 1e-18
  139. africa.FERTILITY = 49
  140. africa.MORTALITY = 14
  141. africa.POPULATION = 987240925
  142. africa.TECH_PROGRESS = 0.00000001399211484
  143. africa.F = 0.7 * 390.7 * 1e6
  144. africa.EDUCATION = 61
  145.  
  146. europe = Zone('Europe')
  147. europe.CROPS = 238395160000
  148. europe.MINERALS = 44325.28774
  149. europe.WATER = 180458288600
  150. europe.WATER_CONSUMPTION = 54.75
  151. europe.LIVESTOCK = 0.08819771984
  152. europe.SOIL_DEGRADATION0 = 0.001 * 1e-7
  153. europe.AIR_POLLUTION0 = 6.475
  154. europe.CLIMATE = 1e-18
  155. europe.FERTILITY = 13
  156. europe.MORTALITY = 7
  157. europe.POPULATION = 446377929
  158. europe.TECH_PROGRESS = 0.00000001399211484
  159. europe.F = 0.95 * 9028.2 * 1e6
  160. europe.EDUCATION = 98
  161.  
  162. east_europe = Zone('East Europe')
  163. east_europe.CROPS = 134040732000
  164. east_europe.MINERALS = 305893
  165. east_europe.WATER = 6570724502084
  166. east_europe.WATER_CONSUMPTION = 90.52
  167. east_europe.LIVESTOCK = 0.05960922493
  168. east_europe.SOIL_DEGRADATION0 = 0.033 * 1e-7
  169. east_europe.AIR_POLLUTION0 = 11.858
  170. east_europe.CLIMATE = 1e-18
  171. east_europe.FERTILITY = 15
  172. east_europe.MORTALITY = 9
  173. east_europe.POPULATION = 292897892
  174. east_europe.TECH_PROGRESS = 0.00000001399211484
  175. east_europe.F = 0.95 * 656.1 * 1e6
  176. east_europe.EDUCATION = 98
  177.  
  178. near_east = Zone('Greater Middle East')
  179. near_east.CROPS = 508607093000
  180. near_east.MINERALS = 10184.11
  181. near_east.WATER = 109235162200
  182. near_east.WATER_CONSUMPTION = 87.6
  183. near_east.LIVESTOCK = 0.207629848
  184. near_east.SOIL_DEGRADATION0 = 0.0033 * 1e-7
  185. near_east.AIR_POLLUTION0 = 6.159
  186. near_east.CLIMATE = 1e-18
  187. near_east.FERTILITY = 17
  188. near_east.MORTALITY = 7
  189. near_east.POPULATION = 436738031
  190. near_east.TECH_PROGRESS = 0.00000001399211484
  191. near_east.F = 0.25 * 967.037 * 1e6
  192. near_east.EDUCATION = 74
  193.  
  194. asia = Zone('Asia')
  195. asia.CROPS = 1137577423000
  196. asia.MINERALS = 202824
  197. asia.WATER = 1345012376629
  198. asia.WATER_CONSUMPTION = 34.675
  199. asia.LIVESTOCK = 0.08473485815
  200. asia.SOIL_DEGRADATION0 = 0.0033 * 1e-7
  201. asia.AIR_POLLUTION0 = 16.093
  202. asia.CLIMATE = 1e-18
  203. asia.FERTILITY = 10
  204. asia.MORTALITY = 7
  205. asia.POPULATION = 4461876215
  206. asia.TECH_PROGRESS = 0.00000001399211484
  207. asia.F = 0.1 * 9447.3 * 1e6
  208. asia.EDUCATION = 85
  209.  
  210. australia = Zone('Australia')
  211. australia.CROPS = 52845564000
  212. australia.MINERALS = 421.764
  213. australia.WATER = 685357950250
  214. australia.WATER_CONSUMPTION = 310
  215. australia.LIVESTOCK = 0.102410541
  216. australia.SOIL_DEGRADATION0 = 0.0034 * 1e-7
  217. australia.AIR_POLLUTION0 = 15.37
  218. australia.CLIMATE = 1e-18
  219. australia.FERTILITY = 15
  220. australia.MORTALITY = 7
  221. australia.POPULATION = 24309329
  222. australia.TECH_PROGRESS = 0.00000001399211484
  223. australia.F = 0.82 * 479.6 * 1e6
  224. australia.EDUCATION = 99
  225.  
  226. north_america = Zone('North America')
  227. north_america.CROPS = 508607093000
  228. north_america.MINERALS = 312840.2
  229. north_america.WATER = 426211950320
  230. north_america.WATER_CONSUMPTION = 210.97
  231. north_america.LIVESTOCK = 0.09882738604
  232. north_america.SOIL_DEGRADATION0 = 0.0042 * 1e-7
  233. north_america.AIR_POLLUTION0 = 16.351
  234. north_america.CLIMATE = 1e-18
  235. north_america.FERTILITY = 15
  236. north_america.MORTALITY = 8
  237. north_america.POPULATION = 359735880
  238. north_america.TECH_PROGRESS = 0.00000001399211484
  239. north_america.F = 0.8 * 11.031 * 1e6
  240. north_america.EDUCATION = 97
  241.  
  242. south_america = Zone('South America')
  243. south_america.CROPS = 186238366000
  244. south_america.MINERALS = 144553
  245. south_america.WATER = 1252548288000
  246. south_america.WATER_CONSUMPTION = 87.6
  247. south_america.LIVESTOCK = 0.2910487881
  248. south_america.SOIL_DEGRADATION0 = 0.0017 * 1e-7
  249. south_america.AIR_POLLUTION0 = 9.247
  250. south_america.CLIMATE = 1e-18
  251. south_america.FERTILITY = 14
  252. south_america.MORTALITY = 8
  253. south_america.POPULATION = 422534692
  254. south_america.TECH_PROGRESS = 0.00000001399211484
  255. south_america.F = 0.8 * 1366.6 * 1e6
  256. south_america.EDUCATION = 89
  257.  
  258. zones = [africa, europe, east_europe, near_east, asia, australia, north_america, south_america]
  259.  
  260. T = 20
  261. STEP = 1 # one year
  262.  
  263. start_time = 2000
  264. cur_time = start_time
  265.  
  266. for zone in zones:
  267.     zone.post_init()
  268.     zone.write_down(cur_time)
  269.  
  270. while cur_time < start_time + T:
  271.  
  272.     for zone in zones:
  273.         try:
  274.             zone.upd(STEP)
  275.         except:
  276.             print('error in zone:', zone.name)
  277.             break
  278.  
  279.     cur_time += STEP
  280.  
  281.     for zone in zones:
  282.         zone.write_down(math.floor(cur_time))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement