31 lines
1.2 KiB
Python
31 lines
1.2 KiB
Python
import pickle
|
|
|
|
import numpy as np
|
|
from pyswarm import pso
|
|
|
|
from calculations import steady_state_population
|
|
from load_real_data import real_mortality_distribution, real_population_distribution
|
|
|
|
|
|
def optimized_mortality_distribution() -> np.ndarray:
|
|
population_distribution = real_population_distribution()
|
|
initial_mortality = real_mortality_distribution()
|
|
upper_bound = 0.20 * np.ones(initial_mortality.shape)
|
|
lower_bound = 0.01 * np.ones(initial_mortality.shape)
|
|
|
|
def _inner(x):
|
|
mortality = np.array(x)
|
|
try:
|
|
steady_state_population_distribution = steady_state_population(mortality,
|
|
total_population=sum(population_distribution))
|
|
except Exception:
|
|
return 1e100
|
|
population_error = np.sum(np.abs(steady_state_population_distribution-population_distribution))/sum(population_distribution)
|
|
return population_error
|
|
|
|
xopt, fopt = pso(_inner, lower_bound, upper_bound, swarmsize=1000, maxiter=100, debug=True)
|
|
with open("output/swarm-mortality.pickle", "wb") as fp:
|
|
pickle.dump(xopt, fp)
|
|
|
|
if __name__ == "__main__":
|
|
optimized_mortality_distribution() |