In [ ]:
import numpy as np
import json 
import matplotlib.pyplot as plt

Section 1 - Data Loading and Parsing

In [ ]:
# load satellite ephemeris data from the satellite.json file
with open('/content/drive/My Drive/Planet/Optim/satellites.json') as f: data_f = json.load(f)

# load sun ephemeris data from the sun.json file
with open('/content/drive/My Drive/Planet/Optim/sun.json') as f: data_sun = json.load(f)

# load city location data from the targets.json file
with open('/content/drive/My Drive/Planet/Optim/targets.json') as f: data_targets = json.load(f)
In [ ]:
# dictionary labels for satellite ephemeris 
dict_def_satellite = ["RV_ecef_km","t_ISO","timestamp","name","timestamp_minute"]
# what we want = [time_minute, x, y, z, vx, vy, vz] 
# vector of [7,] for 1441 times for 15 satellites
In [ ]:
# store satellite state data into an array
satellite_state = np.zeros([7,len(data_f[0]['timestamp_minute']),len(data_f)])
t_iso_list = data_f[0]['t_ISO']
sat_name_list = []
# len(data_f[0]['timestamp_minute']) = 1441 measurements

for i in range(len(data_f)):
  satellite_state[0,:,i] = np.array(data_f[i]['timestamp_minute'])
  satellite_state[1:7,:,i] = np.array(data_f[i]['RV_ecef_km']).T
  sat_name_list.append(data_f[i]['name'])
In [ ]:
# check format for a single state for a single timestep for 1 satellite
# ----------------------------------------------------------------------------
print('State:',satellite_state[:,0,0])
print('Shape:',satellite_state[:,0,0].shape)
State: [ 2.57716800e+07  4.61547828e+03 -4.70323845e+02 -5.19207356e+03
  5.31214840e+00 -2.40243423e+00  4.92383260e+00]
Shape: (7,)
In [ ]:
# dictionary labels for satellite ephemeris 
dict_def_sun = ["RV_ecef_km","t_ISO","timestamp","name","timestamp_minute"]
# what we want = [time_minute, x, y, z, vx, vy, vz] 
# vector of [7,] for 1441 times
In [ ]:
# store sun ephemeris data into an array
sun_state = np.zeros([7,len(data_sun['timestamp_minute'])])
sun_state[0,:] = np.array(data_sun['timestamp_minute'])
sun_state[1:7,:] = np.array(data_sun['RV_ecef_km']).T
In [ ]:
# check format for a single timestep for sun
# ----------------------------------------------------------------------------
print('State:',sun_state[:,0])
print('Shape:',sun_state[:,0].shape)
State: [ 2.57716800e+07 -1.35355435e+08 -1.90468838e+06 -5.75679146e+07
 -1.39364918e+02  9.84006163e+03  2.15243734e+00]
Shape: (7,)
In [ ]:
# dictionary labels for targets
dict_def_targets = ["name","country","population","lat_deg","lon_deg","alt_m","R_ecef_km","id"]
# what we want = [id, population, lat_deg, long_deg, alt_m, x, y, z] 
# vector of [8,] for 5000 targets
In [ ]:
targets_array = np.zeros([8,len(data_targets)])
target_id_list = []

for i in range(len(data_targets)):
  targets_array[0,i] = np.array(data_targets[i]["id"])
  targets_array[1,i] = np.array(data_targets[i]["population"])
  targets_array[2,i] = np.array(data_targets[i]["lat_deg"])
  targets_array[3,i] = np.array(data_targets[i]["lon_deg"])
  targets_array[4,i] = np.array(data_targets[i]["alt_m"])
  targets_array[5:8,i] = np.array(data_targets[i]["R_ecef_km"])
  target_id_list.append(data_targets[i]["id"])
In [ ]:
# check format for a single target
# ----------------------------------------------------------------------------
print('Target:',targets_array[:,0])
print('Shape:',targets_array[:,0].shape)
Target: [ 4.41000000e+02  3.53100000e+04 -2.10335000e+01  5.57128000e+01
  0.00000000e+00  3.35511257e+03  4.92077217e+03 -2.27485731e+03]
Shape: (8,)
In [ ]:
# Looks like targets are repeated in the file
counts, bins, bars = plt.hist(targets_array[0,:],bins=5000)
In [ ]:
# see if all locations in the file are unique
id_list = targets_array[0,:].tolist()
from collections import Counter
a = Counter(id_list)
print(a)

# function to delete repeated targets and get a unique target array
def unique(list1): 
    unique_list = [] 
    # traverse for all elements 
    for x in list1: 
        # check if exists in unique_list or not 
        if x not in unique_list: 
            unique_list.append(x) 
    return unique_list

id_list = targets_array[0,:].tolist()
unique_list = unique(id_list)
num_uniq = len(unique_list)
print('number of unique locations:',num_uniq)

unique_targets = np.zeros([8,num_uniq])

for i in range(num_uniq):
    index = np.where(targets_array[0,:]==unique_list[i])
    ind_val = index[0][0]
    unique_targets[0,i] = np.array(data_targets[ind_val]["id"])
    unique_targets[1,i] = np.array(data_targets[ind_val]["population"])
    unique_targets[2,i] = np.array(data_targets[ind_val]["lat_deg"])
    unique_targets[3,i] = np.array(data_targets[ind_val]["lon_deg"])
    unique_targets[4,i] = np.array(data_targets[ind_val]["alt_m"])
    unique_targets[5:8,i] = np.array(data_targets[ind_val]["R_ecef_km"])
Counter({3126.0: 4, 3949.0: 4, 3621.0: 4, 4680.0: 4, 4339.0: 4, 1905.0: 4, 4168.0: 4, 4823.0: 4, 1713.0: 4, 2960.0: 4, 4776.0: 4, 4579.0: 4, 3941.0: 4, 4468.0: 4, 4811.0: 4, 3007.0: 4, 4500.0: 4, 4347.0: 4, 4535.0: 4, 4678.0: 3, 2987.0: 3, 4927.0: 3, 4335.0: 3, 4138.0: 3, 4830.0: 3, 4851.0: 3, 4937.0: 3, 4632.0: 3, 3308.0: 3, 3115.0: 3, 3972.0: 3, 3629.0: 3, 2459.0: 3, 4919.0: 3, 4814.0: 3, 2823.0: 3, 4674.0: 3, 4656.0: 3, 4718.0: 3, 2269.0: 3, 3346.0: 3, 4577.0: 3, 4664.0: 3, 4623.0: 3, 4230.0: 3, 3807.0: 3, 2797.0: 3, 3800.0: 3, 4601.0: 3, 3248.0: 3, 4614.0: 3, 1559.0: 3, 4409.0: 3, 4122.0: 3, 4638.0: 3, 3954.0: 3, 4626.0: 3, 4506.0: 3, 2923.0: 3, 3217.0: 3, 2555.0: 3, 1847.0: 3, 3786.0: 3, 1925.0: 3, 4803.0: 3, 1968.0: 3, 3945.0: 3, 4533.0: 3, 3415.0: 3, 4616.0: 3, 2374.0: 3, 4423.0: 3, 3482.0: 3, 3975.0: 3, 2486.0: 3, 1833.0: 3, 3891.0: 3, 3736.0: 3, 2614.0: 3, 4529.0: 3, 4277.0: 3, 3015.0: 3, 1504.0: 3, 4781.0: 3, 2810.0: 3, 4495.0: 3, 4982.0: 3, 3091.0: 3, 1641.0: 3, 1922.0: 3, 4097.0: 3, 4407.0: 3, 4484.0: 3, 3885.0: 3, 2821.0: 3, 3194.0: 3, 4879.0: 3, 4986.0: 3, 2209.0: 3, 3390.0: 3, 3676.0: 3, 4364.0: 3, 4733.0: 3, 3605.0: 3, 4293.0: 3, 2399.0: 3, 3140.0: 3, 4037.0: 3, 4662.0: 3, 4098.0: 3, 3841.0: 3, 3258.0: 3, 2864.0: 3, 4010.0: 3, 2177.0: 3, 3369.0: 3, 3505.0: 3, 4142.0: 3, 3674.0: 3, 2830.0: 3, 2365.0: 3, 3669.0: 3, 3070.0: 3, 2921.0: 3, 4518.0: 3, 3356.0: 3, 2377.0: 3, 3493.0: 3, 4317.0: 3, 3670.0: 3, 3927.0: 3, 2099.0: 3, 2813.0: 3, 4246.0: 3, 4804.0: 3, 4160.0: 3, 4327.0: 3, 4588.0: 3, 4820.0: 3, 4629.0: 3, 3997.0: 3, 4838.0: 3, 3837.0: 3, 3386.0: 3, 3897.0: 3, 4774.0: 3, 4598.0: 3, 4411.0: 3, 3640.0: 3, 4508.0: 3, 4641.0: 3, 3639.0: 3, 4627.0: 3, 4749.0: 3, 4967.0: 3, 4539.0: 3, 4672.0: 3, 441.0: 2, 1569.0: 2, 3487.0: 2, 2617.0: 2, 2046.0: 2, 1572.0: 2, 2134.0: 2, 2648.0: 2, 3157.0: 2, 2652.0: 2, 2244.0: 2, 3197.0: 2, 305.0: 2, 4625.0: 2, 1322.0: 2, 4793.0: 2, 388.0: 2, 2886.0: 2, 907.0: 2, 2774.0: 2, 2811.0: 2, 3078.0: 2, 787.0: 2, 1523.0: 2, 2369.0: 2, 1669.0: 2, 1661.0: 2, 1077.0: 2, 1693.0: 2, 1681.0: 2, 4036.0: 2, 3311.0: 2, 2430.0: 2, 4025.0: 2, 2199.0: 2, 558.0: 2, 3574.0: 2, 2260.0: 2, 454.0: 2, 1321.0: 2, 662.0: 2, 2350.0: 2, 4149.0: 2, 4963.0: 2, 1625.0: 2, 1645.0: 2, 2804.0: 2, 4049.0: 2, 4412.0: 2, 4211.0: 2, 3900.0: 2, 3782.0: 2, 3511.0: 2, 2780.0: 2, 3131.0: 2, 2188.0: 2, 607.0: 2, 735.0: 2, 2144.0: 2, 4687.0: 2, 806.0: 2, 1800.0: 2, 2553.0: 2, 1342.0: 2, 1848.0: 2, 413.0: 2, 2754.0: 2, 4760.0: 2, 2104.0: 2, 3417.0: 2, 3572.0: 2, 1335.0: 2, 1472.0: 2, 4799.0: 2, 2054.0: 2, 752.0: 2, 2022.0: 2, 4748.0: 2, 809.0: 2, 3502.0: 2, 3227.0: 2, 1555.0: 2, 3202.0: 2, 2443.0: 2, 4972.0: 2, 865.0: 2, 1807.0: 2, 4096.0: 2, 4490.0: 2, 4046.0: 2, 4943.0: 2, 1327.0: 2, 736.0: 2, 1233.0: 2, 3340.0: 2, 754.0: 2, 4671.0: 2, 1279.0: 2, 3824.0: 2, 1937.0: 2, 3377.0: 2, 4084.0: 2, 677.0: 2, 1166.0: 2, 4058.0: 2, 3932.0: 2, 1318.0: 2, 2113.0: 2, 2547.0: 2, 3304.0: 2, 4415.0: 2, 3318.0: 2, 4446.0: 2, 1053.0: 2, 3075.0: 2, 3496.0: 2, 3918.0: 2, 2656.0: 2, 2649.0: 2, 1786.0: 2, 439.0: 2, 4835.0: 2, 2071.0: 2, 2327.0: 2, 4385.0: 2, 1416.0: 2, 1033.0: 2, 1629.0: 2, 4568.0: 2, 4045.0: 2, 3479.0: 2, 4128.0: 2, 4140.0: 2, 751.0: 2, 4960.0: 2, 457.0: 2, 4236.0: 2, 1773.0: 2, 4088.0: 2, 2768.0: 2, 458.0: 2, 3803.0: 2, 1091.0: 2, 3720.0: 2, 2785.0: 2, 3656.0: 2, 2526.0: 2, 2396.0: 2, 3303.0: 2, 3691.0: 2, 3887.0: 2, 1313.0: 2, 1399.0: 2, 4979.0: 2, 3998.0: 2, 2917.0: 2, 4676.0: 2, 3554.0: 2, 3509.0: 2, 837.0: 2, 3457.0: 2, 4756.0: 2, 1898.0: 2, 4531.0: 2, 818.0: 2, 4640.0: 2, 1708.0: 2, 995.0: 2, 4489.0: 2, 3447.0: 2, 2548.0: 2, 2855.0: 2, 4658.0: 2, 4826.0: 2, 3446.0: 2, 3777.0: 2, 1518.0: 2, 1715.0: 2, 4566.0: 2, 4057.0: 2, 1720.0: 2, 1947.0: 2, 1753.0: 2, 1464.0: 2, 3966.0: 2, 1031.0: 2, 3763.0: 2, 2749.0: 2, 1822.0: 2, 1013.0: 2, 1846.0: 2, 3381.0: 2, 4502.0: 2, 2663.0: 2, 2528.0: 2, 762.0: 2, 2222.0: 2, 4350.0: 2, 3114.0: 2, 4538.0: 2, 2364.0: 2, 1899.0: 2, 3431.0: 2, 4330.0: 2, 3130.0: 2, 1400.0: 2, 2925.0: 2, 2910.0: 2, 1957.0: 2, 2932.0: 2, 1598.0: 2, 3700.0: 2, 3314.0: 2, 2742.0: 2, 953.0: 2, 4005.0: 2, 3054.0: 2, 2623.0: 2, 939.0: 2, 1479.0: 2, 1597.0: 2, 4859.0: 2, 3445.0: 2, 2021.0: 2, 4221.0: 2, 4033.0: 2, 4077.0: 2, 3593.0: 2, 3524.0: 2, 946.0: 2, 3404.0: 2, 3922.0: 2, 3714.0: 2, 4476.0: 2, 4120.0: 2, 1528.0: 2, 3492.0: 2, 1585.0: 2, 1428.0: 2, 3396.0: 2, 3254.0: 2, 2287.0: 2, 4822.0: 2, 2390.0: 2, 1303.0: 2, 1402.0: 2, 3826.0: 2, 3905.0: 2, 1867.0: 2, 4039.0: 2, 1021.0: 2, 1754.0: 2, 4988.0: 2, 2900.0: 2, 971.0: 2, 4721.0: 2, 3817.0: 2, 3200.0: 2, 4703.0: 2, 1686.0: 2, 940.0: 2, 1958.0: 2, 4590.0: 2, 1992.0: 2, 2966.0: 2, 3228.0: 2, 2263.0: 2, 1095.0: 2, 1118.0: 2, 2397.0: 2, 2513.0: 2, 4530.0: 2, 3282.0: 2, 3270.0: 2, 2258.0: 2, 2451.0: 2, 2388.0: 2, 1306.0: 2, 3906.0: 2, 3467.0: 2, 2988.0: 2, 4628.0: 2, 1046.0: 2, 3359.0: 2, 4602.0: 2, 4111.0: 2, 4479.0: 2, 2657.0: 2, 3330.0: 2, 2678.0: 2, 4205.0: 2, 4247.0: 2, 4738.0: 2, 3628.0: 2, 2777.0: 2, 4349.0: 2, 4596.0: 2, 3241.0: 2, 4309.0: 2, 3036.0: 2, 2103.0: 2, 3684.0: 2, 4002.0: 2, 2371.0: 2, 1747.0: 2, 3942.0: 2, 2589.0: 2, 3543.0: 2, 2314.0: 2, 1164.0: 2, 4999.0: 2, 1384.0: 2, 3889.0: 2, 2945.0: 2, 4570.0: 2, 3958.0: 2, 2224.0: 2, 2499.0: 2, 4233.0: 2, 4172.0: 2, 4532.0: 2, 4434.0: 2, 3659.0: 2, 2801.0: 2, 1422.0: 2, 2577.0: 2, 3600.0: 2, 1876.0: 2, 3562.0: 2, 3247.0: 2, 4265.0: 2, 3514.0: 2, 3301.0: 2, 1515.0: 2, 1709.0: 2, 3533.0: 2, 1245.0: 2, 3904.0: 2, 4657.0: 2, 3873.0: 2, 4164.0: 2, 2769.0: 2, 4060.0: 2, 4782.0: 2, 2064.0: 2, 2795.0: 2, 4150.0: 2, 4239.0: 2, 1931.0: 2, 2602.0: 2, 3591.0: 2, 3449.0: 2, 3057.0: 2, 3938.0: 2, 3163.0: 2, 4222.0: 2, 1855.0: 2, 2808.0: 2, 2017.0: 2, 4155.0: 2, 3118.0: 2, 1580.0: 2, 4966.0: 2, 4571.0: 2, 3606.0: 2, 1732.0: 2, 2460.0: 2, 3132.0: 2, 2136.0: 2, 2842.0: 2, 2030.0: 2, 4477.0: 2, 4414.0: 2, 2991.0: 2, 4654.0: 2, 4358.0: 2, 2198.0: 2, 1994.0: 2, 2039.0: 2, 3622.0: 2, 4883.0: 2, 2328.0: 2, 2994.0: 2, 3907.0: 2, 3462.0: 2, 3285.0: 2, 1997.0: 2, 2280.0: 2, 3740.0: 2, 3648.0: 2, 2827.0: 2, 3262.0: 2, 2671.0: 2, 3724.0: 2, 2155.0: 2, 3038.0: 2, 3679.0: 2, 3050.0: 2, 2272.0: 2, 1700.0: 2, 4866.0: 2, 2313.0: 2, 2634.0: 2, 3835.0: 2, 1832.0: 2, 2532.0: 2, 4422.0: 2, 1554.0: 2, 3850.0: 2, 3283.0: 2, 2964.0: 2, 2815.0: 2, 3902.0: 2, 1590.0: 2, 2239.0: 2, 4394.0: 2, 2341.0: 2, 3441.0: 2, 4705.0: 2, 3620.0: 2, 4401.0: 2, 1636.0: 2, 2262.0: 2, 2514.0: 2, 2129.0: 2, 1630.0: 2, 4965.0: 2, 3031.0: 2, 3725.0: 2, 4795.0: 2, 2212.0: 2, 2192.0: 2, 4715.0: 2, 3138.0: 2, 4493.0: 2, 3747.0: 2, 4815.0: 2, 2233.0: 2, 2366.0: 2, 4510.0: 2, 1939.0: 2, 4276.0: 2, 2828.0: 2, 4286.0: 2, 3121.0: 2, 4086.0: 2, 3221.0: 2, 4925.0: 2, 2981.0: 2, 1929.0: 2, 4462.0: 2, 3696.0: 2, 3730.0: 2, 2711.0: 2, 3798.0: 2, 4589.0: 2, 4248.0: 2, 4768.0: 2, 2674.0: 2, 2467.0: 2, 4580.0: 2, 4667.0: 2, 2675.0: 2, 4195.0: 2, 3055.0: 2, 2301.0: 2, 4113.0: 2, 2440.0: 2, 1969.0: 2, 3448.0: 2, 3631.0: 2, 2154.0: 2, 1966.0: 2, 3168.0: 2, 3020.0: 2, 4016.0: 2, 2724.0: 2, 4710.0: 2, 3137.0: 2, 2511.0: 2, 3879.0: 2, 2793.0: 2, 4134.0: 2, 4797.0: 2, 4634.0: 2, 4040.0: 2, 3752.0: 2, 2735.0: 2, 2202.0: 2, 2184.0: 2, 2478.0: 2, 4565.0: 2, 2872.0: 2, 3039.0: 2, 3024.0: 2, 2911.0: 2, 2504.0: 2, 2249.0: 2, 4390.0: 2, 2147.0: 2, 4213.0: 2, 4619.0: 2, 3540.0: 2, 4237.0: 2, 3980.0: 2, 3811.0: 2, 3271.0: 2, 3367.0: 2, 4391.0: 2, 4437.0: 2, 3863.0: 2, 2773.0: 2, 2588.0: 2, 4119.0: 2, 3174.0: 2, 4229.0: 2, 2118.0: 2, 2665.0: 2, 3830.0: 2, 4787.0: 2, 2871.0: 2, 3894.0: 2, 2517.0: 2, 2876.0: 2, 2697.0: 2, 3913.0: 2, 4591.0: 2, 4701.0: 2, 4964.0: 2, 4003.0: 2, 3592.0: 2, 3361.0: 2, 3937.0: 2, 3527.0: 2, 3522.0: 2, 4091.0: 2, 4208.0: 2, 3315.0: 2, 3750.0: 2, 3575.0: 2, 2265.0: 2, 3667.0: 2, 2310.0: 2, 4818.0: 2, 4292.0: 2, 4015.0: 2, 2929.0: 2, 3860.0: 2, 4163.0: 2, 3464.0: 2, 3982.0: 2, 4258.0: 2, 3883.0: 2, 4272.0: 2, 2957.0: 2, 3804.0: 2, 3181.0: 2, 4843.0: 2, 2927.0: 2, 2492.0: 2, 2387.0: 2, 4200.0: 2, 2411.0: 2, 3839.0: 2, 2543.0: 2, 4544.0: 2, 4914.0: 2, 3320.0: 2, 4720.0: 2, 2556.0: 2, 4026.0: 2, 2557.0: 2, 3992.0: 2, 3931.0: 2, 2930.0: 2, 4785.0: 2, 2892.0: 2, 4313.0: 2, 2539.0: 2, 3204.0: 2, 4225.0: 2, 2393.0: 2, 3959.0: 2, 4714.0: 2, 4975.0: 2, 4357.0: 2, 2580.0: 2, 4789.0: 2, 4633.0: 2, 3819.0: 2, 3586.0: 2, 3641.0: 2, 4808.0: 2, 3848.0: 2, 3234.0: 2, 3370.0: 2, 2703.0: 2, 3393.0: 2, 2708.0: 2, 3025.0: 2, 4486.0: 2, 3333.0: 2, 3133.0: 2, 4583.0: 2, 2805.0: 2, 3149.0: 2, 3148.0: 2, 3239.0: 2, 4360.0: 2, 4087.0: 2, 3838.0: 2, 3101.0: 2, 3788.0: 2, 4837.0: 2, 3749.0: 2, 3278.0: 2, 4592.0: 2, 4287.0: 2, 3302.0: 2, 4856.0: 2, 2836.0: 2, 4117.0: 2, 2590.0: 2, 2943.0: 2, 3705.0: 2, 4190.0: 2, 2869.0: 2, 4750.0: 2, 4759.0: 2, 2950.0: 2, 4995.0: 2, 4019.0: 2, 4069.0: 2, 3623.0: 2, 2978.0: 2, 3853.0: 2, 2722.0: 2, 3748.0: 2, 4030.0: 2, 4263.0: 2, 4475.0: 2, 2895.0: 2, 4805.0: 2, 2818.0: 2, 3993.0: 2, 4496.0: 2, 4323.0: 2, 4562.0: 2, 4991.0: 2, 4567.0: 2, 4143.0: 2, 3678.0: 2, 4480.0: 2, 3636.0: 2, 4853.0: 2, 2788.0: 2, 3663.0: 2, 4194.0: 2, 3500.0: 2, 3192.0: 2, 3208.0: 2, 3378.0: 2, 4466.0: 2, 3589.0: 2, 4846.0: 2, 3797.0: 2, 4021.0: 2, 3547.0: 2, 4874.0: 2, 4755.0: 2, 4245.0: 2, 4393.0: 2, 3909.0: 2, 4973.0: 2, 4404.0: 2, 4936.0: 2, 3551.0: 2, 4275.0: 2, 3951.0: 2, 4283.0: 2, 3272.0: 2, 4512.0: 2, 4109.0: 2, 3444.0: 2, 3517.0: 2, 3165.0: 2, 3292.0: 2, 3712.0: 2, 4133.0: 2, 4612.0: 2, 3833.0: 2, 4524.0: 2, 4367.0: 2, 3523.0: 2, 3702.0: 2, 4931.0: 2, 4346.0: 2, 4232.0: 2, 3595.0: 2, 3545.0: 2, 4329.0: 2, 4920.0: 2, 4504.0: 2, 4176.0: 2, 3637.0: 2, 3534.0: 2, 3875.0: 2, 4051.0: 2, 3812.0: 2, 4639.0: 2, 3416.0: 2, 3706.0: 2, 3569.0: 2, 3647.0: 2, 4834.0: 2, 3495.0: 2, 4405.0: 2, 3643.0: 2, 4085.0: 2, 3331.0: 2, 3564.0: 2, 3655.0: 2, 3880.0: 2, 4871.0: 2, 4780.0: 2, 3490.0: 2, 3783.0: 2, 4396.0: 2, 4240.0: 2, 4052.0: 2, 3413.0: 2, 4971.0: 2, 4187.0: 2, 3884.0: 2, 4013.0: 2, 4563.0: 2, 4470.0: 2, 4873.0: 2, 3816.0: 2, 4894.0: 2, 3650.0: 2, 3815.0: 2, 3737.0: 2, 3912.0: 2, 4238.0: 2, 4998.0: 2, 4169.0: 2, 4018.0: 2, 4575.0: 2, 3635.0: 2, 3742.0: 2, 3849.0: 2, 4269.0: 2, 3751.0: 2, 4958.0: 2, 4688.0: 2, 4706.0: 2, 4353.0: 2, 4126.0: 2, 3890.0: 2, 3969.0: 2, 4181.0: 2, 4833.0: 2, 4897.0: 2, 4763.0: 2, 4670.0: 2, 4888.0: 2, 4419.0: 2, 3940.0: 2, 4382.0: 2, 4371.0: 2, 4255.0: 2, 4561.0: 2, 4817.0: 2, 4840.0: 2, 4148.0: 2, 4268.0: 2, 4757.0: 2, 4841.0: 2, 4905.0: 2, 4983.0: 2, 4850.0: 2, 4440.0: 2, 4724.0: 2, 4342.0: 2, 4962.0: 2, 4428.0: 2, 4655.0: 2, 4895.0: 2, 4439.0: 2, 4957.0: 2, 4984.0: 2, 4942.0: 2, 4572.0: 2, 4885.0: 2, 4681.0: 2, 4994.0: 2, 4959.0: 2, 4886.0: 2, 1.0: 1, 2.0: 1, 3.0: 1, 6.0: 1, 9.0: 1, 10.0: 1, 14.0: 1, 16.0: 1, 17.0: 1, 19.0: 1, 20.0: 1, 22.0: 1, 23.0: 1, 24.0: 1, 25.0: 1, 27.0: 1, 32.0: 1, 33.0: 1, 34.0: 1, 37.0: 1, 43.0: 1, 46.0: 1, 47.0: 1, 49.0: 1, 50.0: 1, 51.0: 1, 52.0: 1, 54.0: 1, 55.0: 1, 58.0: 1, 59.0: 1, 61.0: 1, 65.0: 1, 67.0: 1, 68.0: 1, 69.0: 1, 70.0: 1, 74.0: 1, 76.0: 1, 77.0: 1, 80.0: 1, 84.0: 1, 85.0: 1, 86.0: 1, 87.0: 1, 88.0: 1, 89.0: 1, 91.0: 1, 92.0: 1, 94.0: 1, 96.0: 1, 97.0: 1, 98.0: 1, 99.0: 1, 101.0: 1, 102.0: 1, 103.0: 1, 104.0: 1, 105.0: 1, 106.0: 1, 107.0: 1, 108.0: 1, 109.0: 1, 110.0: 1, 113.0: 1, 114.0: 1, 115.0: 1, 116.0: 1, 117.0: 1, 118.0: 1, 119.0: 1, 120.0: 1, 121.0: 1, 122.0: 1, 123.0: 1, 124.0: 1, 125.0: 1, 127.0: 1, 131.0: 1, 132.0: 1, 135.0: 1, 137.0: 1, 138.0: 1, 140.0: 1, 141.0: 1, 144.0: 1, 146.0: 1, 147.0: 1, 150.0: 1, 153.0: 1, 154.0: 1, 158.0: 1, 160.0: 1, 161.0: 1, 162.0: 1, 163.0: 1, 164.0: 1, 167.0: 1, 172.0: 1, 173.0: 1, 176.0: 1, 177.0: 1, 178.0: 1, 181.0: 1, 182.0: 1, 183.0: 1, 184.0: 1, 185.0: 1, 186.0: 1, 187.0: 1, 188.0: 1, 190.0: 1, 192.0: 1, 193.0: 1, 195.0: 1, 197.0: 1, 199.0: 1, 200.0: 1, 201.0: 1, 205.0: 1, 207.0: 1, 210.0: 1, 211.0: 1, 212.0: 1, 213.0: 1, 214.0: 1, 217.0: 1, 221.0: 1, 222.0: 1, 223.0: 1, 224.0: 1, 225.0: 1, 228.0: 1, 230.0: 1, 233.0: 1, 235.0: 1, 236.0: 1, 239.0: 1, 240.0: 1, 241.0: 1, 242.0: 1, 243.0: 1, 244.0: 1, 246.0: 1, 247.0: 1, 248.0: 1, 249.0: 1, 251.0: 1, 253.0: 1, 254.0: 1, 256.0: 1, 258.0: 1, 261.0: 1, 263.0: 1, 265.0: 1, 267.0: 1, 268.0: 1, 270.0: 1, 271.0: 1, 272.0: 1, 273.0: 1, 275.0: 1, 276.0: 1, 278.0: 1, 279.0: 1, 283.0: 1, 284.0: 1, 285.0: 1, 286.0: 1, 287.0: 1, 288.0: 1, 290.0: 1, 291.0: 1, 292.0: 1, 294.0: 1, 295.0: 1, 296.0: 1, 297.0: 1, 299.0: 1, 300.0: 1, 303.0: 1, 304.0: 1, 308.0: 1, 309.0: 1, 310.0: 1, 311.0: 1, 312.0: 1, 314.0: 1, 315.0: 1, 316.0: 1, 317.0: 1, 320.0: 1, 321.0: 1, 323.0: 1, 326.0: 1, 327.0: 1, 329.0: 1, 330.0: 1, 331.0: 1, 332.0: 1, 333.0: 1, 334.0: 1, 338.0: 1, 339.0: 1, 342.0: 1, 343.0: 1, 344.0: 1, 345.0: 1, 346.0: 1, 347.0: 1, 348.0: 1, 349.0: 1, 350.0: 1, 351.0: 1, 352.0: 1, 353.0: 1, 354.0: 1, 355.0: 1, 356.0: 1, 357.0: 1, 358.0: 1, 359.0: 1, 366.0: 1, 369.0: 1, 371.0: 1, 373.0: 1, 374.0: 1, 375.0: 1, 376.0: 1, 382.0: 1, 383.0: 1, 384.0: 1, 389.0: 1, 390.0: 1, 391.0: 1, 392.0: 1, 393.0: 1, 396.0: 1, 398.0: 1, 403.0: 1, 404.0: 1, 405.0: 1, 409.0: 1, 411.0: 1, 412.0: 1, 418.0: 1, 420.0: 1, 421.0: 1, 422.0: 1, 424.0: 1, 426.0: 1, 428.0: 1, 429.0: 1, 430.0: 1, 431.0: 1, 432.0: 1, 433.0: 1, 435.0: 1, 437.0: 1, 443.0: 1, 445.0: 1, 448.0: 1, 449.0: 1, 451.0: 1, 453.0: 1, 455.0: 1, 456.0: 1, 459.0: 1, 461.0: 1, 462.0: 1, 463.0: 1, 466.0: 1, 467.0: 1, 468.0: 1, 470.0: 1, 472.0: 1, 473.0: 1, 474.0: 1, 476.0: 1, 477.0: 1, 480.0: 1, 483.0: 1, 485.0: 1, 486.0: 1, 487.0: 1, 488.0: 1, 491.0: 1, 492.0: 1, 494.0: 1, 498.0: 1, 499.0: 1, 500.0: 1, 501.0: 1, 502.0: 1, 504.0: 1, 507.0: 1, 508.0: 1, 509.0: 1, 510.0: 1, 515.0: 1, 516.0: 1, 517.0: 1, 519.0: 1, 520.0: 1, 521.0: 1, 522.0: 1, 523.0: 1, 524.0: 1, 525.0: 1, 526.0: 1, 527.0: 1, 530.0: 1, 532.0: 1, 533.0: 1, 534.0: 1, 535.0: 1, 536.0: 1, 537.0: 1, 539.0: 1, 540.0: 1, 542.0: 1, 543.0: 1, 545.0: 1, 549.0: 1, 550.0: 1, 551.0: 1, 552.0: 1, 554.0: 1, 556.0: 1, 557.0: 1, 559.0: 1, 561.0: 1, 563.0: 1, 564.0: 1, 565.0: 1, 567.0: 1, 569.0: 1, 570.0: 1, 573.0: 1, 576.0: 1, 578.0: 1, 579.0: 1, 580.0: 1, 582.0: 1, 587.0: 1, 588.0: 1, 589.0: 1, 590.0: 1, 591.0: 1, 592.0: 1, 593.0: 1, 595.0: 1, 596.0: 1, 597.0: 1, 598.0: 1, 600.0: 1, 601.0: 1, 606.0: 1, 609.0: 1, 610.0: 1, 614.0: 1, 616.0: 1, 618.0: 1, 619.0: 1, 620.0: 1, 621.0: 1, 622.0: 1, 626.0: 1, 627.0: 1, 628.0: 1, 629.0: 1, 630.0: 1, 631.0: 1, 634.0: 1, 637.0: 1, 638.0: 1, 639.0: 1, 640.0: 1, 642.0: 1, 643.0: 1, 646.0: 1, 647.0: 1, 648.0: 1, 649.0: 1, 652.0: 1, 653.0: 1, 654.0: 1, 657.0: 1, 658.0: 1, 659.0: 1, 660.0: 1, 661.0: 1, 664.0: 1, 666.0: 1, 667.0: 1, 669.0: 1, 671.0: 1, 672.0: 1, 674.0: 1, 676.0: 1, 679.0: 1, 680.0: 1, 682.0: 1, 683.0: 1, 684.0: 1, 685.0: 1, 687.0: 1, 688.0: 1, 691.0: 1, 692.0: 1, 693.0: 1, 695.0: 1, 696.0: 1, 697.0: 1, 698.0: 1, 699.0: 1, 702.0: 1, 704.0: 1, 705.0: 1, 706.0: 1, 707.0: 1, 708.0: 1, 709.0: 1, 710.0: 1, 712.0: 1, 713.0: 1, 715.0: 1, 717.0: 1, 718.0: 1, 722.0: 1, 726.0: 1, 728.0: 1, 729.0: 1, 731.0: 1, 732.0: 1, 737.0: 1, 738.0: 1, 739.0: 1, 742.0: 1, 743.0: 1, 745.0: 1, 746.0: 1, 747.0: 1, 749.0: 1, 750.0: 1, 753.0: 1, 756.0: 1, 757.0: 1, 758.0: 1, 760.0: 1, 761.0: 1, 763.0: 1, 764.0: 1, 765.0: 1, 766.0: 1, 768.0: 1, 770.0: 1, 775.0: 1, 776.0: 1, 778.0: 1, 779.0: 1, 781.0: 1, 782.0: 1, 784.0: 1, 785.0: 1, 790.0: 1, 791.0: 1, 792.0: 1, 793.0: 1, 794.0: 1, 795.0: 1, 798.0: 1, 799.0: 1, 800.0: 1, 801.0: 1, 803.0: 1, 804.0: 1, 808.0: 1, 811.0: 1, 812.0: 1, 813.0: 1, 814.0: 1, 815.0: 1, 816.0: 1, 817.0: 1, 819.0: 1, 820.0: 1, 821.0: 1, 822.0: 1, 823.0: 1, 825.0: 1, 827.0: 1, 829.0: 1, 831.0: 1, 833.0: 1, 835.0: 1, 836.0: 1, 838.0: 1, 839.0: 1, 841.0: 1, 842.0: 1, 843.0: 1, 848.0: 1, 849.0: 1, 850.0: 1, 852.0: 1, 853.0: 1, 855.0: 1, 856.0: 1, 857.0: 1, 858.0: 1, 859.0: 1, 861.0: 1, 863.0: 1, 864.0: 1, 866.0: 1, 868.0: 1, 870.0: 1, 871.0: 1, 872.0: 1, 874.0: 1, 875.0: 1, 876.0: 1, 877.0: 1, 878.0: 1, 879.0: 1, 880.0: 1, 882.0: 1, 883.0: 1, 884.0: 1, 885.0: 1, 887.0: 1, 890.0: 1, 892.0: 1, 893.0: 1, 894.0: 1, 897.0: 1, 899.0: 1, 900.0: 1, 901.0: 1, 902.0: 1, 903.0: 1, 905.0: 1, 908.0: 1, 909.0: 1, 910.0: 1, 911.0: 1, 912.0: 1, 913.0: 1, 914.0: 1, 915.0: 1, 916.0: 1, 917.0: 1, 918.0: 1, 923.0: 1, 924.0: 1, 925.0: 1, 926.0: 1, 928.0: 1, 937.0: 1, 942.0: 1, 943.0: 1, 944.0: 1, 945.0: 1, 947.0: 1, 948.0: 1, 949.0: 1, 955.0: 1, 957.0: 1, 958.0: 1, 960.0: 1, 963.0: 1, 966.0: 1, 968.0: 1, 972.0: 1, 973.0: 1, 974.0: 1, 975.0: 1, 976.0: 1, 977.0: 1, 978.0: 1, 979.0: 1, 983.0: 1, 984.0: 1, 987.0: 1, 988.0: 1, 992.0: 1, 993.0: 1, 996.0: 1, 1000.0: 1, 1001.0: 1, 1002.0: 1, 1003.0: 1, 1004.0: 1, 1005.0: 1, 1006.0: 1, 1007.0: 1, 1009.0: 1, 1010.0: 1, 1011.0: 1, 1015.0: 1, 1016.0: 1, 1017.0: 1, 1018.0: 1, 1022.0: 1, 1024.0: 1, 1025.0: 1, 1026.0: 1, 1028.0: 1, 1029.0: 1, 1030.0: 1, 1035.0: 1, 1036.0: 1, 1038.0: 1, 1041.0: 1, 1044.0: 1, 1047.0: 1, 1048.0: 1, 1051.0: 1, 1052.0: 1, 1054.0: 1, 1056.0: 1, 1058.0: 1, 1061.0: 1, 1062.0: 1, 1063.0: 1, 1065.0: 1, 1068.0: 1, 1069.0: 1, 1072.0: 1, 1073.0: 1, 1074.0: 1, 1075.0: 1, 1076.0: 1, 1078.0: 1, 1080.0: 1, 1081.0: 1, 1083.0: 1, 1085.0: 1, 1086.0: 1, 1087.0: 1, 1088.0: 1, 1089.0: 1, 1093.0: 1, 1094.0: 1, 1096.0: 1, 1098.0: 1, 1099.0: 1, 1100.0: 1, 1101.0: 1, 1102.0: 1, 1103.0: 1, 1104.0: 1, 1105.0: 1, 1106.0: 1, 1108.0: 1, 1109.0: 1, 1110.0: 1, 1111.0: 1, 1112.0: 1, 1113.0: 1, 1114.0: 1, 1115.0: 1, 1116.0: 1, 1117.0: 1, 1119.0: 1, 1121.0: 1, 1122.0: 1, 1123.0: 1, 1125.0: 1, 1126.0: 1, 1127.0: 1, 1128.0: 1, 1132.0: 1, 1133.0: 1, 1134.0: 1, 1135.0: 1, 1137.0: 1, 1139.0: 1, 1140.0: 1, 1141.0: 1, 1143.0: 1, 1144.0: 1, 1145.0: 1, 1147.0: 1, 1148.0: 1, 1149.0: 1, 1152.0: 1, 1156.0: 1, 1157.0: 1, 1158.0: 1, 1159.0: 1, 1160.0: 1, 1161.0: 1, 1163.0: 1, 1165.0: 1, 1167.0: 1, 1168.0: 1, 1169.0: 1, 1170.0: 1, 1172.0: 1, 1173.0: 1, 1174.0: 1, 1175.0: 1, 1177.0: 1, 1178.0: 1, 1179.0: 1, 1180.0: 1, 1182.0: 1, 1184.0: 1, 1187.0: 1, 1190.0: 1, 1191.0: 1, 1193.0: 1, 1194.0: 1, 1196.0: 1, 1197.0: 1, 1198.0: 1, 1199.0: 1, 1201.0: 1, 1203.0: 1, 1204.0: 1, 1205.0: 1, 1206.0: 1, 1207.0: 1, 1210.0: 1, 1211.0: 1, 1212.0: 1, 1215.0: 1, 1216.0: 1, 1218.0: 1, 1219.0: 1, 1220.0: 1, 1221.0: 1, 1224.0: 1, 1227.0: 1, 1228.0: 1, 1232.0: 1, 1236.0: 1, 1238.0: 1, 1239.0: 1, 1240.0: 1, 1241.0: 1, 1247.0: 1, 1249.0: 1, 1250.0: 1, 1251.0: 1, 1252.0: 1, 1253.0: 1, 1254.0: 1, 1256.0: 1, 1258.0: 1, 1260.0: 1, 1261.0: 1, 1262.0: 1, 1263.0: 1, 1265.0: 1, 1266.0: 1, 1267.0: 1, 1268.0: 1, 1269.0: 1, 1272.0: 1, 1273.0: 1, 1274.0: 1, 1275.0: 1, 1276.0: 1, 1277.0: 1, 1278.0: 1, 1280.0: 1, 1281.0: 1, 1282.0: 1, 1285.0: 1, 1287.0: 1, 1288.0: 1, 1289.0: 1, 1290.0: 1, 1291.0: 1, 1293.0: 1, 1295.0: 1, 1297.0: 1, 1298.0: 1, 1299.0: 1, 1300.0: 1, 1302.0: 1, 1308.0: 1, 1309.0: 1, 1310.0: 1, 1311.0: 1, 1314.0: 1, 1315.0: 1, 1316.0: 1, 1317.0: 1, 1320.0: 1, 1323.0: 1, 1328.0: 1, 1329.0: 1, 1330.0: 1, 1331.0: 1, 1332.0: 1, 1337.0: 1, 1338.0: 1, 1344.0: 1, 1345.0: 1, 1346.0: 1, 1348.0: 1, 1349.0: 1, 1350.0: 1, 1351.0: 1, 1354.0: 1, 1355.0: 1, 1356.0: 1, 1359.0: 1, 1360.0: 1, 1361.0: 1, 1362.0: 1, 1363.0: 1, 1364.0: 1, 1365.0: 1, 1366.0: 1, 1369.0: 1, 1372.0: 1, 1373.0: 1, 1374.0: 1, 1375.0: 1, 1376.0: 1, 1378.0: 1, 1379.0: 1, 1380.0: 1, 1382.0: 1, 1387.0: 1, 1388.0: 1, 1389.0: 1, 1393.0: 1, 1394.0: 1, 1396.0: 1, 1397.0: 1, 1398.0: 1, 1401.0: 1, 1403.0: 1, 1404.0: 1, 1405.0: 1, 1408.0: 1, 1409.0: 1, 1410.0: 1, 1411.0: 1, 1412.0: 1, 1414.0: 1, 1417.0: 1, 1424.0: 1, 1430.0: 1, 1431.0: 1, 1432.0: 1, 1435.0: 1, 1436.0: 1, 1437.0: 1, 1438.0: 1, 1439.0: 1, 1440.0: 1, 1441.0: 1, 1442.0: 1, 1443.0: 1, 1444.0: 1, 1446.0: 1, 1447.0: 1, 1449.0: 1, 1450.0: 1, 1451.0: 1, 1452.0: 1, 1453.0: 1, 1454.0: 1, 1455.0: 1, 1456.0: 1, 1457.0: 1, 1460.0: 1, 1462.0: 1, 1467.0: 1, 1468.0: 1, 1469.0: 1, 1470.0: 1, 1471.0: 1, 1473.0: 1, 1475.0: 1, 1477.0: 1, 1478.0: 1, 1480.0: 1, 1483.0: 1, 1485.0: 1, 1486.0: 1, 1487.0: 1, 1488.0: 1, 1489.0: 1, 1490.0: 1, 1493.0: 1, 1495.0: 1, 1496.0: 1, 1499.0: 1, 1500.0: 1, 1501.0: 1, 1502.0: 1, 1503.0: 1, 1505.0: 1, 1507.0: 1, 1509.0: 1, 1511.0: 1, 1516.0: 1, 1517.0: 1, 1519.0: 1, 1520.0: 1, 1524.0: 1, 1525.0: 1, 1527.0: 1, 1530.0: 1, 1531.0: 1, 1532.0: 1, 1534.0: 1, 1535.0: 1, 1537.0: 1, 1538.0: 1, 1541.0: 1, 1542.0: 1, 1544.0: 1, 1548.0: 1, 1551.0: 1, 1552.0: 1, 1553.0: 1, 1557.0: 1, 1558.0: 1, 1560.0: 1, 1561.0: 1, 1563.0: 1, 1564.0: 1, 1565.0: 1, 1568.0: 1, 1571.0: 1, 1573.0: 1, 1574.0: 1, 1575.0: 1, 1576.0: 1, 1578.0: 1, 1581.0: 1, 1583.0: 1, 1586.0: 1, 1587.0: 1, 1589.0: 1, 1591.0: 1, 1593.0: 1, 1594.0: 1, 1595.0: 1, 1596.0: 1, 1599.0: 1, 1600.0: 1, 1601.0: 1, 1602.0: 1, 1603.0: 1, 1605.0: 1, 1606.0: 1, 1609.0: 1, 1611.0: 1, 1612.0: 1, 1614.0: 1, 1615.0: 1, 1616.0: 1, 1619.0: 1, 1620.0: 1, 1621.0: 1, 1622.0: 1, 1631.0: 1, 1632.0: 1, 1633.0: 1, 1634.0: 1, 1635.0: 1, 1637.0: 1, 1638.0: 1, 1639.0: 1, 1640.0: 1, 1644.0: 1, 1648.0: 1, 1649.0: 1, 1651.0: 1, 1652.0: 1, 1653.0: 1, 1654.0: 1, 1655.0: 1, 1659.0: 1, 1660.0: 1, 1662.0: 1, 1663.0: 1, 1664.0: 1, 1665.0: 1, 1666.0: 1, 1670.0: 1, 1671.0: 1, 1673.0: 1, 1678.0: 1, 1682.0: 1, 1684.0: 1, 1685.0: 1, 1687.0: 1, 1695.0: 1, 1697.0: 1, 1698.0: 1, 1699.0: 1, 1701.0: 1, 1702.0: 1, 1703.0: 1, 1705.0: 1, 1707.0: 1, 1710.0: 1, 1711.0: 1, 1712.0: 1, 1716.0: 1, 1718.0: 1, 1719.0: 1, 1721.0: 1, 1727.0: 1, 1728.0: 1, 1729.0: 1, 1730.0: 1, 1731.0: 1, 1734.0: 1, 1735.0: 1, 1736.0: 1, 1737.0: 1, 1738.0: 1, 1740.0: 1, 1741.0: 1, 1745.0: 1, 1746.0: 1, 1748.0: 1, 1750.0: 1, 1751.0: 1, 1756.0: 1, 1757.0: 1, 1759.0: 1, 1760.0: 1, 1761.0: 1, 1762.0: 1, 1763.0: 1, 1764.0: 1, 1765.0: 1, 1766.0: 1, 1768.0: 1, 1769.0: 1, 1770.0: 1, 1771.0: 1, 1772.0: 1, 1775.0: 1, 1776.0: 1, 1777.0: 1, 1778.0: 1, 1780.0: 1, 1781.0: 1, 1784.0: 1, 1787.0: 1, 1789.0: 1, 1791.0: 1, 1792.0: 1, 1793.0: 1, 1794.0: 1, 1796.0: 1, 1797.0: 1, 1801.0: 1, 1802.0: 1, 1805.0: 1, 1806.0: 1, 1809.0: 1, 1812.0: 1, 1813.0: 1, 1814.0: 1, 1815.0: 1, 1816.0: 1, 1817.0: 1, 1818.0: 1, 1820.0: 1, 1823.0: 1, 1824.0: 1, 1825.0: 1, 1826.0: 1, 1827.0: 1, 1830.0: 1, 1831.0: 1, 1834.0: 1, 1835.0: 1, 1836.0: 1, 1837.0: 1, 1838.0: 1, 1839.0: 1, 1840.0: 1, 1841.0: 1, 1842.0: 1, 1843.0: 1, 1845.0: 1, 1849.0: 1, 1853.0: 1, 1854.0: 1, 1856.0: 1, 1858.0: 1, 1860.0: 1, 1861.0: 1, 1863.0: 1, 1864.0: 1, 1865.0: 1, 1866.0: 1, 1868.0: 1, 1872.0: 1, 1874.0: 1, 1875.0: 1, 1877.0: 1, 1878.0: 1, 1879.0: 1, 1880.0: 1, 1882.0: 1, 1884.0: 1, 1887.0: 1, 1888.0: 1, 1891.0: 1, 1893.0: 1, 1894.0: 1, 1903.0: 1, 1904.0: 1, 1906.0: 1, 1907.0: 1, 1909.0: 1, 1910.0: 1, 1913.0: 1, 1918.0: 1, 1919.0: 1, 1920.0: 1, 1921.0: 1, 1927.0: 1, 1932.0: 1, 1934.0: 1, 1935.0: 1, 1936.0: 1, 1938.0: 1, 1940.0: 1, 1941.0: 1, 1942.0: 1, 1945.0: 1, 1949.0: 1, 1952.0: 1, 1953.0: 1, 1956.0: 1, 1959.0: 1, 1960.0: 1, 1961.0: 1, 1964.0: 1, 1967.0: 1, 1971.0: 1, 1975.0: 1, 1976.0: 1, 1977.0: 1, 1979.0: 1, 1981.0: 1, 1984.0: 1, 1985.0: 1, 1986.0: 1, 1987.0: 1, 1988.0: 1, 1989.0: 1, 1990.0: 1, 1991.0: 1, 1993.0: 1, 1995.0: 1, 1996.0: 1, 1998.0: 1, 2001.0: 1, 2003.0: 1, 2004.0: 1, 2005.0: 1, 2007.0: 1, 2009.0: 1, 2012.0: 1, 2015.0: 1, 2016.0: 1, 2018.0: 1, 2019.0: 1, 2020.0: 1, 2023.0: 1, 2026.0: 1, 2027.0: 1, 2029.0: 1, 2031.0: 1, 2034.0: 1, 2035.0: 1, 2037.0: 1, 2040.0: 1, 2042.0: 1, 2043.0: 1, 2044.0: 1, 2045.0: 1, 2048.0: 1, 2052.0: 1, 2053.0: 1, 2055.0: 1, 2057.0: 1, 2059.0: 1, 2060.0: 1, 2061.0: 1, 2066.0: 1, 2067.0: 1, 2069.0: 1, 2072.0: 1, 2073.0: 1, 2074.0: 1, 2075.0: 1, 2076.0: 1, 2078.0: 1, 2080.0: 1, 2081.0: 1, 2082.0: 1, 2083.0: 1, 2089.0: 1, 2092.0: 1, 2093.0: 1, 2094.0: 1, 2095.0: 1, 2096.0: 1, 2098.0: 1, 2101.0: 1, 2102.0: 1, 2105.0: 1, 2107.0: 1, 2109.0: 1, 2111.0: 1, 2112.0: 1, 2114.0: 1, 2115.0: 1, 2116.0: 1, 2117.0: 1, 2121.0: 1, 2122.0: 1, 2124.0: 1, 2125.0: 1, 2126.0: 1, 2127.0: 1, 2130.0: 1, 2131.0: 1, 2132.0: 1, 2135.0: 1, 2139.0: 1, 2140.0: 1, 2142.0: 1, 2143.0: 1, 2145.0: 1, 2146.0: 1, 2148.0: 1, 2149.0: 1, 2150.0: 1, 2151.0: 1, 2152.0: 1, 2153.0: 1, 2156.0: 1, 2157.0: 1, 2158.0: 1, 2159.0: 1, 2161.0: 1, 2164.0: 1, 2165.0: 1, 2174.0: 1, 2175.0: 1, 2179.0: 1, 2181.0: 1, 2182.0: 1, 2183.0: 1, 2186.0: 1, 2187.0: 1, 2189.0: 1, 2190.0: 1, 2191.0: 1, 2193.0: 1, 2194.0: 1, 2196.0: 1, 2197.0: 1, 2200.0: 1, 2201.0: 1, 2204.0: 1, 2205.0: 1, 2206.0: 1, 2210.0: 1, 2213.0: 1, 2214.0: 1, 2215.0: 1, 2216.0: 1, 2217.0: 1, 2219.0: 1, 2220.0: 1, 2221.0: 1, 2223.0: 1, 2226.0: 1, 2229.0: 1, 2230.0: 1, 2231.0: 1, 2234.0: 1, 2237.0: 1, 2238.0: 1, 2240.0: 1, 2242.0: 1, 2243.0: 1, 2245.0: 1, 2248.0: 1, 2251.0: 1, 2253.0: 1, 2254.0: 1, 2255.0: 1, 2256.0: 1, 2257.0: 1, 2259.0: 1, 2264.0: 1, 2266.0: 1, 2270.0: 1, 2271.0: 1, 2274.0: 1, 2275.0: 1, 2276.0: 1, 2277.0: 1, 2278.0: 1, 2279.0: 1, 2283.0: 1, 2284.0: 1, 2286.0: 1, 2288.0: 1, 2289.0: 1, 2292.0: 1, 2293.0: 1, 2294.0: 1, 2295.0: 1, 2296.0: 1, 2299.0: 1, 2302.0: 1, 2303.0: 1, 2304.0: 1, 2308.0: 1, 2309.0: 1, 2311.0: 1, 2312.0: 1, 2315.0: 1, 2317.0: 1, 2318.0: 1, 2319.0: 1, 2320.0: 1, 2322.0: 1, 2323.0: 1, 2324.0: 1, 2326.0: 1, 2330.0: 1, 2331.0: 1, 2332.0: 1, 2333.0: 1, 2335.0: 1, 2337.0: 1, 2338.0: 1, 2339.0: 1, 2340.0: 1, 2343.0: 1, 2346.0: 1, 2347.0: 1, 2348.0: 1, 2349.0: 1, 2351.0: 1, 2355.0: 1, 2358.0: 1, 2360.0: 1, 2361.0: 1, 2362.0: 1, 2367.0: 1, 2368.0: 1, 2372.0: 1, 2379.0: 1, 2380.0: 1, 2382.0: 1, 2384.0: 1, 2385.0: 1, 2386.0: 1, 2389.0: 1, 2391.0: 1, 2392.0: 1, 2394.0: 1, 2400.0: 1, 2401.0: 1, 2403.0: 1, 2406.0: 1, 2407.0: 1, 2408.0: 1, 2409.0: 1, 2413.0: 1, 2415.0: 1, 2416.0: 1, 2417.0: 1, 2418.0: 1, 2419.0: 1, 2420.0: 1, 2422.0: 1, 2423.0: 1, 2426.0: 1, 2427.0: 1, 2428.0: 1, 2429.0: 1, 2431.0: 1, 2432.0: 1, 2433.0: 1, 2434.0: 1, 2435.0: 1, 2436.0: 1, 2437.0: 1, 2441.0: 1, 2444.0: 1, 2445.0: 1, 2446.0: 1, 2447.0: 1, 2448.0: 1, 2449.0: 1, 2450.0: 1, 2453.0: 1, 2454.0: 1, 2455.0: 1, 2456.0: 1, 2457.0: 1, 2458.0: 1, 2461.0: 1, 2463.0: 1, 2464.0: 1, 2468.0: 1, 2469.0: 1, 2470.0: 1, 2471.0: 1, 2472.0: 1, 2473.0: 1, 2477.0: 1, 2479.0: 1, 2484.0: 1, 2485.0: 1, 2487.0: 1, 2488.0: 1, 2489.0: 1, 2490.0: 1, 2491.0: 1, 2493.0: 1, 2494.0: 1, 2495.0: 1, 2498.0: 1, 2500.0: 1, 2502.0: 1, 2503.0: 1, 2505.0: 1, 2506.0: 1, 2507.0: 1, 2508.0: 1, 2509.0: 1, 2512.0: 1, 2515.0: 1, 2523.0: 1, 2524.0: 1, 2525.0: 1, 2527.0: 1, 2529.0: 1, 2530.0: 1, 2531.0: 1, 2533.0: 1, 2534.0: 1, 2536.0: 1, 2537.0: 1, 2538.0: 1, 2541.0: 1, 2545.0: 1, 2546.0: 1, 2549.0: 1, 2550.0: 1, 2551.0: 1, 2552.0: 1, 2554.0: 1, 2558.0: 1, 2560.0: 1, 2561.0: 1, 2563.0: 1, 2564.0: 1, 2566.0: 1, 2568.0: 1, 2570.0: 1, 2572.0: 1, 2574.0: 1, 2575.0: 1, 2576.0: 1, 2578.0: 1, 2581.0: 1, 2582.0: 1, 2583.0: 1, 2584.0: 1, 2585.0: 1, 2587.0: 1, 2591.0: 1, 2592.0: 1, 2593.0: 1, 2594.0: 1, 2596.0: 1, 2597.0: 1, 2599.0: 1, 2600.0: 1, 2603.0: 1, 2604.0: 1, 2606.0: 1, 2607.0: 1, 2608.0: 1, 2610.0: 1, 2611.0: 1, 2612.0: 1, 2613.0: 1, 2615.0: 1, 2616.0: 1, 2619.0: 1, 2621.0: 1, 2622.0: 1, 2625.0: 1, 2626.0: 1, 2628.0: 1, 2630.0: 1, 2631.0: 1, 2632.0: 1, 2635.0: 1, 2636.0: 1, 2637.0: 1, 2638.0: 1, 2639.0: 1, 2641.0: 1, 2643.0: 1, 2646.0: 1, 2647.0: 1, 2650.0: 1, 2653.0: 1, 2655.0: 1, 2658.0: 1, 2659.0: 1, 2661.0: 1, 2662.0: 1, 2664.0: 1, 2667.0: 1, 2669.0: 1, 2670.0: 1, 2673.0: 1, 2676.0: 1, 2677.0: 1, 2679.0: 1, 2680.0: 1, 2681.0: 1, 2684.0: 1, 2685.0: 1, 2688.0: 1, 2689.0: 1, 2690.0: 1, 2691.0: 1, 2692.0: 1, 2694.0: 1, 2695.0: 1, 2696.0: 1, 2701.0: 1, 2702.0: 1, 2704.0: 1, 2705.0: 1, 2706.0: 1, 2707.0: 1, 2709.0: 1, 2712.0: 1, 2713.0: 1, 2714.0: 1, 2717.0: 1, 2718.0: 1, 2721.0: 1, 2723.0: 1, 2725.0: 1, 2726.0: 1, 2727.0: 1, 2728.0: 1, 2729.0: 1, 2730.0: 1, 2731.0: 1, 2732.0: 1, 2733.0: 1, 2734.0: 1, 2737.0: 1, 2738.0: 1, 2739.0: 1, 2741.0: 1, 2743.0: 1, 2745.0: 1, 2747.0: 1, 2748.0: 1, 2751.0: 1, 2752.0: 1, 2753.0: 1, 2755.0: 1, 2756.0: 1, 2757.0: 1, 2758.0: 1, 2759.0: 1, 2760.0: 1, 2763.0: 1, 2765.0: 1, 2766.0: 1, 2767.0: 1, 2771.0: 1, 2772.0: 1, 2775.0: 1, 2776.0: 1, 2778.0: 1, 2784.0: 1, 2786.0: 1, 2787.0: 1, 2789.0: 1, 2790.0: 1, 2794.0: 1, 2796.0: 1, 2798.0: 1, 2799.0: 1, 2800.0: 1, 2803.0: 1, 2807.0: 1, 2809.0: 1, 2812.0: 1, 2814.0: 1, 2816.0: 1, 2817.0: 1, 2819.0: 1, 2820.0: 1, 2822.0: 1, 2824.0: 1, 2829.0: 1, 2831.0: 1, 2832.0: 1, 2833.0: 1, 2834.0: 1, 2835.0: 1, 2837.0: 1, 2838.0: 1, 2839.0: 1, 2840.0: 1, 2841.0: 1, 2843.0: 1, 2845.0: 1, 2846.0: 1, 2847.0: 1, 2850.0: 1, 2851.0: 1, 2853.0: 1, 2856.0: 1, 2857.0: 1, 2858.0: 1, 2859.0: 1, 2861.0: 1, 2862.0: 1, 2865.0: 1, 2866.0: 1, 2867.0: 1, 2868.0: 1, 2870.0: 1, 2873.0: 1, 2874.0: 1, 2875.0: 1, 2878.0: 1, 2879.0: 1, 2880.0: 1, 2881.0: 1, 2883.0: 1, 2890.0: 1, 2891.0: 1, 2893.0: 1, 2894.0: 1, 2896.0: 1, 2897.0: 1, 2899.0: 1, 2901.0: 1, 2903.0: 1, 2904.0: 1, 2906.0: 1, 2909.0: 1, 2912.0: 1, 2913.0: 1, 2915.0: 1, 2919.0: 1, 2922.0: 1, 2924.0: 1, 2931.0: 1, 2933.0: 1, 2934.0: 1, 2935.0: 1, 2936.0: 1, 2938.0: 1, 2939.0: 1, 2940.0: 1, 2941.0: 1, 2942.0: 1, 2944.0: 1, 2946.0: 1, 2947.0: 1, 2949.0: 1, 2951.0: 1, 2952.0: 1, 2954.0: 1, 2955.0: 1, 2956.0: 1, 2958.0: 1, 2961.0: 1, 2962.0: 1, 2963.0: 1, 2965.0: 1, 2967.0: 1, 2968.0: 1, 2969.0: 1, 2970.0: 1, 2973.0: 1, 2975.0: 1, 2976.0: 1, 2977.0: 1, 2979.0: 1, 2980.0: 1, 2984.0: 1, 2985.0: 1, 2986.0: 1, 2989.0: 1, 2992.0: 1, 2993.0: 1, 2995.0: 1, 2998.0: 1, 2999.0: 1, 3000.0: 1, 3001.0: 1, 3002.0: 1, 3003.0: 1, 3004.0: 1, 3005.0: 1, 3008.0: 1, 3009.0: 1, 3010.0: 1, 3011.0: 1, 3013.0: 1, 3014.0: 1, 3016.0: 1, 3017.0: 1, 3018.0: 1, 3019.0: 1, 3021.0: 1, 3022.0: 1, 3023.0: 1, 3026.0: 1, 3027.0: 1, 3028.0: 1, 3029.0: 1, 3033.0: 1, 3034.0: 1, 3035.0: 1, 3040.0: 1, 3041.0: 1, 3042.0: 1, 3043.0: 1, 3044.0: 1, 3045.0: 1, 3046.0: 1, 3047.0: 1, 3048.0: 1, 3049.0: 1, 3051.0: 1, 3052.0: 1, 3053.0: 1, 3056.0: 1, 3058.0: 1, 3059.0: 1, 3060.0: 1, 3061.0: 1, 3063.0: 1, 3065.0: 1, 3066.0: 1, 3068.0: 1, 3069.0: 1, 3071.0: 1, 3072.0: 1, 3073.0: 1, 3076.0: 1, 3077.0: 1, 3081.0: 1, 3082.0: 1, 3083.0: 1, 3084.0: 1, 3085.0: 1, 3090.0: 1, 3092.0: 1, 3093.0: 1, 3094.0: 1, 3096.0: 1, 3097.0: 1, 3098.0: 1, 3099.0: 1, 3102.0: 1, 3103.0: 1, 3104.0: 1, 3107.0: 1, 3108.0: 1, 3109.0: 1, 3110.0: 1, 3111.0: 1, 3117.0: 1, 3119.0: 1, 3120.0: 1, 3122.0: 1, 3123.0: 1, 3124.0: 1, 3125.0: 1, 3127.0: 1, 3128.0: 1, 3129.0: 1, 3134.0: 1, 3135.0: 1, 3136.0: 1, 3141.0: 1, 3142.0: 1, 3143.0: 1, 3144.0: 1, 3146.0: 1, 3147.0: 1, 3150.0: 1, 3151.0: 1, 3152.0: 1, 3153.0: 1, 3155.0: 1, 3156.0: 1, 3158.0: 1, 3160.0: 1, 3161.0: 1, 3166.0: 1, 3167.0: 1, 3169.0: 1, 3170.0: 1, 3171.0: 1, 3173.0: 1, 3176.0: 1, 3177.0: 1, 3178.0: 1, 3179.0: 1, 3180.0: 1, 3182.0: 1, 3183.0: 1, 3184.0: 1, 3186.0: 1, 3187.0: 1, 3188.0: 1, 3189.0: 1, 3191.0: 1, 3193.0: 1, 3195.0: 1, 3196.0: 1, 3199.0: 1, 3201.0: 1, 3203.0: 1, 3205.0: 1, 3206.0: 1, 3207.0: 1, 3210.0: 1, 3211.0: 1, 3213.0: 1, 3215.0: 1, 3218.0: 1, 3219.0: 1, 3220.0: 1, 3223.0: 1, 3224.0: 1, 3225.0: 1, 3226.0: 1, 3230.0: 1, 3231.0: 1, 3236.0: 1, 3237.0: 1, 3238.0: 1, 3242.0: 1, 3244.0: 1, 3245.0: 1, 3246.0: 1, 3249.0: 1, 3251.0: 1, 3252.0: 1, 3253.0: 1, 3255.0: 1, 3256.0: 1, 3259.0: 1, 3260.0: 1, 3261.0: 1, 3263.0: 1, 3264.0: 1, 3265.0: 1, 3268.0: 1, 3269.0: 1, 3273.0: 1, 3274.0: 1, 3275.0: 1, 3276.0: 1, 3277.0: 1, 3279.0: 1, 3280.0: 1, 3286.0: 1, 3287.0: 1, 3288.0: 1, 3289.0: 1, 3290.0: 1, 3293.0: 1, 3294.0: 1, 3297.0: 1, 3298.0: 1, 3299.0: 1, 3300.0: 1, 3305.0: 1, 3306.0: 1, 3307.0: 1, 3309.0: 1, 3310.0: 1, 3312.0: 1, 3313.0: 1, 3316.0: 1, 3321.0: 1, 3322.0: 1, 3323.0: 1, 3324.0: 1, 3325.0: 1, 3326.0: 1, 3327.0: 1, 3328.0: 1, 3329.0: 1, 3332.0: 1, 3334.0: 1, 3337.0: 1, 3338.0: 1, 3339.0: 1, 3341.0: 1, 3343.0: 1, 3348.0: 1, 3349.0: 1, 3350.0: 1, 3351.0: 1, 3352.0: 1, 3354.0: 1, 3355.0: 1, 3357.0: 1, 3358.0: 1, 3360.0: 1, 3362.0: 1, 3363.0: 1, 3364.0: 1, 3365.0: 1, 3366.0: 1, 3368.0: 1, 3371.0: 1, 3373.0: 1, 3374.0: 1, 3376.0: 1, 3379.0: 1, 3380.0: 1, 3382.0: 1, 3383.0: 1, 3384.0: 1, 3385.0: 1, 3387.0: 1, 3391.0: 1, 3394.0: 1, 3395.0: 1, 3397.0: 1, 3398.0: 1, 3400.0: 1, 3401.0: 1, 3402.0: 1, 3405.0: 1, 3406.0: 1, 3407.0: 1, 3408.0: 1, 3409.0: 1, 3410.0: 1, 3411.0: 1, 3412.0: 1, 3414.0: 1, 3418.0: 1, 3419.0: 1, 3420.0: 1, 3423.0: 1, 3424.0: 1, 3425.0: 1, 3426.0: 1, 3429.0: 1, 3430.0: 1, 3432.0: 1, 3433.0: 1, 3434.0: 1, 3435.0: 1, 3436.0: 1, 3437.0: 1, 3438.0: 1, 3439.0: 1, 3440.0: 1, 3442.0: 1, 3450.0: 1, 3452.0: 1, 3453.0: 1, 3454.0: 1, 3455.0: 1, 3458.0: 1, 3459.0: 1, 3460.0: 1, 3461.0: 1, 3463.0: 1, 3465.0: 1, 3466.0: 1, 3468.0: 1, 3469.0: 1, 3470.0: 1, 3471.0: 1, 3473.0: 1, 3474.0: 1, 3476.0: 1, 3477.0: 1, 3478.0: 1, 3480.0: 1, 3481.0: 1, 3483.0: 1, 3484.0: 1, 3485.0: 1, 3486.0: 1, 3488.0: 1, 3489.0: 1, 3491.0: 1, 3497.0: 1, 3498.0: 1, 3501.0: 1, 3503.0: 1, 3504.0: 1, 3506.0: 1, 3507.0: 1, 3508.0: 1, 3510.0: 1, 3512.0: 1, 3513.0: 1, 3515.0: 1, 3516.0: 1, 3518.0: 1, 3519.0: 1, 3520.0: 1, 3521.0: 1, 3528.0: 1, 3529.0: 1, 3530.0: 1, 3531.0: 1, 3532.0: 1, 3535.0: 1, 3536.0: 1, 3537.0: 1, 3538.0: 1, 3541.0: 1, 3542.0: 1, 3544.0: 1, 3546.0: 1, 3548.0: 1, 3549.0: 1, 3550.0: 1, 3552.0: 1, 3553.0: 1, 3555.0: 1, 3556.0: 1, 3557.0: 1, 3558.0: 1, 3560.0: 1, 3563.0: 1, 3567.0: 1, 3568.0: 1, 3573.0: 1, 3576.0: 1, 3577.0: 1, 3578.0: 1, 3579.0: 1, 3580.0: 1, 3581.0: 1, 3583.0: 1, 3584.0: 1, 3585.0: 1, 3587.0: 1, 3588.0: 1, 3594.0: 1, 3597.0: 1, 3598.0: 1, 3599.0: 1, 3602.0: 1, 3604.0: 1, 3607.0: 1, 3608.0: 1, 3610.0: 1, 3611.0: 1, 3612.0: 1, 3613.0: 1, 3614.0: 1, 3616.0: 1, 3617.0: 1, 3618.0: 1, 3619.0: 1, 3624.0: 1, 3625.0: 1, 3626.0: 1, 3627.0: 1, 3630.0: 1, 3633.0: 1, 3634.0: 1, 3638.0: 1, 3642.0: 1, 3645.0: 1, 3646.0: 1, 3649.0: 1, 3651.0: 1, 3652.0: 1, 3653.0: 1, 3654.0: 1, 3658.0: 1, 3660.0: 1, 3661.0: 1, 3662.0: 1, 3664.0: 1, 3665.0: 1, 3668.0: 1, 3671.0: 1, 3673.0: 1, 3675.0: 1, 3677.0: 1, 3680.0: 1, 3681.0: 1, 3682.0: 1, 3686.0: 1, 3687.0: 1, 3688.0: 1, 3689.0: 1, 3690.0: 1, 3692.0: 1, 3693.0: 1, 3694.0: 1, 3695.0: 1, 3697.0: 1, 3698.0: 1, 3699.0: 1, 3701.0: 1, 3703.0: 1, 3704.0: 1, 3707.0: 1, 3708.0: 1, 3709.0: 1, 3710.0: 1, 3713.0: 1, 3715.0: 1, 3716.0: 1, 3717.0: 1, 3718.0: 1, 3719.0: 1, 3721.0: 1, 3723.0: 1, 3726.0: 1, 3727.0: 1, 3728.0: 1, 3731.0: 1, 3732.0: 1, 3733.0: 1, 3734.0: 1, 3735.0: 1, 3738.0: 1, 3739.0: 1, 3743.0: 1, 3744.0: 1, 3745.0: 1, 3746.0: 1, 3753.0: 1, 3754.0: 1, 3755.0: 1, 3757.0: 1, 3758.0: 1, 3759.0: 1, 3760.0: 1, 3762.0: 1, 3764.0: 1, 3765.0: 1, 3767.0: 1, 3768.0: 1, 3769.0: 1, 3771.0: 1, 3772.0: 1, 3774.0: 1, 3775.0: 1, 3776.0: 1, 3779.0: 1, 3780.0: 1, 3784.0: 1, 3785.0: 1, 3787.0: 1, 3789.0: 1, 3790.0: 1, 3791.0: 1, 3792.0: 1, 3793.0: 1, 3794.0: 1, 3795.0: 1, 3799.0: 1, 3801.0: 1, 3802.0: 1, 3806.0: 1, 3808.0: 1, 3810.0: 1, 3813.0: 1, 3814.0: 1, 3818.0: 1, 3820.0: 1, 3822.0: 1, 3827.0: 1, 3829.0: 1, 3831.0: 1, 3832.0: 1, 3834.0: 1, 3836.0: 1, 3840.0: 1, 3842.0: 1, 3843.0: 1, 3844.0: 1, 3845.0: 1, 3846.0: 1, 3847.0: 1, 3854.0: 1, 3855.0: 1, 3856.0: 1, 3857.0: 1, 3858.0: 1, 3861.0: 1, 3862.0: 1, 3864.0: 1, 3865.0: 1, 3866.0: 1, 3867.0: 1, 3868.0: 1, 3869.0: 1, 3870.0: 1, 3871.0: 1, 3872.0: 1, 3876.0: 1, 3877.0: 1, 3881.0: 1, 3882.0: 1, 3886.0: 1, 3888.0: 1, 3892.0: 1, 3893.0: 1, 3895.0: 1, 3896.0: 1, 3898.0: 1, 3899.0: 1, 3903.0: 1, 3908.0: 1, 3910.0: 1, 3911.0: 1, 3914.0: 1, 3915.0: 1, 3916.0: 1, 3917.0: 1, 3919.0: 1, 3921.0: 1, 3923.0: 1, 3924.0: 1, 3925.0: 1, 3926.0: 1, 3928.0: 1, 3930.0: 1, 3933.0: 1, 3935.0: 1, 3936.0: 1, 3939.0: 1, 3943.0: 1, 3944.0: 1, 3946.0: 1, 3947.0: 1, 3948.0: 1, 3950.0: 1, 3952.0: 1, 3955.0: 1, 3956.0: 1, 3957.0: 1, 3960.0: 1, 3961.0: 1, 3962.0: 1, 3963.0: 1, 3964.0: 1, 3965.0: 1, 3967.0: 1, 3968.0: 1, 3970.0: 1, 3971.0: 1, 3973.0: 1, 3976.0: 1, 3977.0: 1, 3978.0: 1, 3979.0: 1, 3981.0: 1, 3984.0: 1, 3985.0: 1, 3986.0: 1, 3987.0: 1, 3989.0: 1, 3990.0: 1, 3991.0: 1, 3994.0: 1, 3996.0: 1, 3999.0: 1, 4000.0: 1, 4004.0: 1, 4007.0: 1, 4008.0: 1, 4009.0: 1, 4011.0: 1, 4014.0: 1, 4017.0: 1, 4020.0: 1, 4022.0: 1, 4023.0: 1, 4024.0: 1, 4027.0: 1, 4028.0: 1, 4029.0: 1, 4031.0: 1, 4032.0: 1, 4034.0: 1, 4035.0: 1, 4038.0: 1, 4041.0: 1, 4042.0: 1, 4043.0: 1, 4044.0: 1, 4048.0: 1, 4050.0: 1, 4053.0: 1, 4054.0: 1, 4056.0: 1, 4061.0: 1, 4062.0: 1, 4063.0: 1, 4064.0: 1, 4065.0: 1, 4066.0: 1, 4067.0: 1, 4070.0: 1, 4071.0: 1, 4072.0: 1, 4073.0: 1, 4074.0: 1, 4075.0: 1, 4076.0: 1, 4078.0: 1, 4079.0: 1, 4082.0: 1, 4083.0: 1, 4089.0: 1, 4090.0: 1, 4092.0: 1, 4093.0: 1, 4094.0: 1, 4099.0: 1, 4100.0: 1, 4101.0: 1, 4102.0: 1, 4103.0: 1, 4104.0: 1, 4105.0: 1, 4106.0: 1, 4107.0: 1, 4108.0: 1, 4110.0: 1, 4112.0: 1, 4114.0: 1, 4115.0: 1, 4116.0: 1, 4118.0: 1, 4121.0: 1, 4123.0: 1, 4124.0: 1, 4125.0: 1, 4127.0: 1, 4129.0: 1, 4130.0: 1, 4131.0: 1, 4132.0: 1, 4136.0: 1, 4137.0: 1, 4141.0: 1, 4144.0: 1, 4146.0: 1, 4147.0: 1, 4151.0: 1, 4152.0: 1, 4153.0: 1, 4154.0: 1, 4156.0: 1, 4157.0: 1, 4158.0: 1, 4159.0: 1, 4161.0: 1, 4165.0: 1, 4166.0: 1, 4167.0: 1, 4170.0: 1, 4171.0: 1, 4173.0: 1, 4174.0: 1, 4175.0: 1, 4177.0: 1, 4178.0: 1, 4179.0: 1, 4180.0: 1, 4182.0: 1, 4183.0: 1, 4184.0: 1, 4185.0: 1, 4186.0: 1, 4188.0: 1, 4189.0: 1, 4191.0: 1, 4192.0: 1, 4193.0: 1, 4196.0: 1, 4197.0: 1, 4198.0: 1, 4199.0: 1, 4201.0: 1, 4202.0: 1, 4203.0: 1, 4204.0: 1, 4206.0: 1, 4207.0: 1, 4209.0: 1, 4212.0: 1, 4214.0: 1, 4216.0: 1, 4217.0: 1, 4218.0: 1, 4219.0: 1, 4220.0: 1, 4223.0: 1, 4224.0: 1, 4226.0: 1, 4227.0: 1, 4228.0: 1, 4231.0: 1, 4234.0: 1, 4235.0: 1, 4241.0: 1, 4242.0: 1, 4243.0: 1, 4244.0: 1, 4249.0: 1, 4250.0: 1, 4251.0: 1, 4252.0: 1, 4253.0: 1, 4254.0: 1, 4256.0: 1, 4257.0: 1, 4259.0: 1, 4260.0: 1, 4261.0: 1, 4262.0: 1, 4264.0: 1, 4266.0: 1, 4267.0: 1, 4270.0: 1, 4273.0: 1, 4274.0: 1, 4278.0: 1, 4279.0: 1, 4280.0: 1, 4282.0: 1, 4284.0: 1, 4285.0: 1, 4288.0: 1, 4289.0: 1, 4290.0: 1, 4291.0: 1, 4294.0: 1, 4295.0: 1, 4296.0: 1, 4297.0: 1, 4298.0: 1, 4299.0: 1, 4300.0: 1, 4301.0: 1, 4302.0: 1, 4303.0: 1, 4305.0: 1, 4306.0: 1, 4307.0: 1, 4308.0: 1, 4310.0: 1, 4311.0: 1, 4312.0: 1, 4315.0: 1, 4316.0: 1, 4318.0: 1, 4319.0: 1, 4320.0: 1, 4321.0: 1, 4322.0: 1, 4324.0: 1, 4325.0: 1, 4326.0: 1, 4328.0: 1, 4331.0: 1, 4333.0: 1, 4334.0: 1, 4337.0: 1, 4340.0: 1, 4341.0: 1, 4343.0: 1, 4344.0: 1, 4345.0: 1, 4348.0: 1, 4352.0: 1, 4354.0: 1, 4355.0: 1, 4356.0: 1, 4359.0: 1, 4361.0: 1, 4363.0: 1, 4365.0: 1, 4366.0: 1, 4368.0: 1, 4369.0: 1, 4370.0: 1, 4372.0: 1, 4373.0: 1, 4375.0: 1, 4376.0: 1, 4377.0: 1, 4378.0: 1, 4379.0: 1, 4380.0: 1, 4381.0: 1, 4383.0: 1, 4384.0: 1, 4387.0: 1, 4388.0: 1, 4389.0: 1, 4392.0: 1, 4395.0: 1, 4397.0: 1, 4398.0: 1, 4399.0: 1, 4400.0: 1, 4402.0: 1, 4403.0: 1, 4406.0: 1, 4408.0: 1, 4413.0: 1, 4416.0: 1, 4417.0: 1, 4418.0: 1, 4420.0: 1, 4421.0: 1, 4424.0: 1, 4425.0: 1, 4426.0: 1, 4427.0: 1, 4429.0: 1, 4430.0: 1, 4431.0: 1, 4432.0: 1, 4433.0: 1, 4435.0: 1, 4436.0: 1, 4438.0: 1, 4442.0: 1, 4443.0: 1, 4444.0: 1, 4445.0: 1, 4447.0: 1, 4448.0: 1, 4449.0: 1, 4451.0: 1, 4452.0: 1, 4453.0: 1, 4454.0: 1, 4455.0: 1, 4456.0: 1, 4457.0: 1, 4458.0: 1, 4459.0: 1, 4463.0: 1, 4464.0: 1, 4465.0: 1, 4467.0: 1, 4469.0: 1, 4471.0: 1, 4472.0: 1, 4473.0: 1, 4474.0: 1, 4478.0: 1, 4481.0: 1, 4482.0: 1, 4483.0: 1, 4485.0: 1, 4487.0: 1, 4488.0: 1, 4491.0: 1, 4492.0: 1, 4494.0: 1, 4497.0: 1, 4498.0: 1, 4499.0: 1, 4503.0: 1, 4505.0: 1, 4507.0: 1, 4509.0: 1, 4511.0: 1, 4513.0: 1, 4514.0: 1, 4515.0: 1, 4516.0: 1, 4517.0: 1, 4520.0: 1, 4521.0: 1, 4522.0: 1, 4523.0: 1, 4525.0: 1, 4526.0: 1, 4527.0: 1, 4528.0: 1, 4534.0: 1, 4536.0: 1, 4537.0: 1, 4540.0: 1, 4541.0: 1, 4542.0: 1, 4543.0: 1, 4545.0: 1, 4546.0: 1, 4547.0: 1, 4548.0: 1, 4549.0: 1, 4550.0: 1, 4551.0: 1, 4552.0: 1, 4553.0: 1, 4554.0: 1, 4555.0: 1, 4556.0: 1, 4557.0: 1, 4558.0: 1, 4559.0: 1, 4560.0: 1, 4564.0: 1, 4569.0: 1, 4573.0: 1, 4574.0: 1, 4576.0: 1, 4578.0: 1, 4581.0: 1, 4582.0: 1, 4584.0: 1, 4585.0: 1, 4586.0: 1, 4587.0: 1, 4593.0: 1, 4594.0: 1, 4595.0: 1, 4597.0: 1, 4599.0: 1, 4600.0: 1, 4603.0: 1, 4604.0: 1, 4605.0: 1, 4606.0: 1, 4607.0: 1, 4608.0: 1, 4609.0: 1, 4610.0: 1, 4611.0: 1, 4613.0: 1, 4615.0: 1, 4617.0: 1, 4618.0: 1, 4620.0: 1, 4621.0: 1, 4624.0: 1, 4630.0: 1, 4631.0: 1, 4635.0: 1, 4636.0: 1, 4637.0: 1, 4642.0: 1, 4643.0: 1, 4644.0: 1, 4645.0: 1, 4646.0: 1, 4647.0: 1, 4648.0: 1, 4649.0: 1, 4650.0: 1, 4651.0: 1, 4652.0: 1, 4653.0: 1, 4659.0: 1, 4660.0: 1, 4661.0: 1, 4663.0: 1, 4665.0: 1, 4666.0: 1, 4668.0: 1, 4669.0: 1, 4673.0: 1, 4677.0: 1, 4679.0: 1, 4682.0: 1, 4683.0: 1, 4685.0: 1, 4686.0: 1, 4689.0: 1, 4690.0: 1, 4691.0: 1, 4692.0: 1, 4693.0: 1, 4694.0: 1, 4695.0: 1, 4696.0: 1, 4697.0: 1, 4698.0: 1, 4699.0: 1, 4700.0: 1, 4702.0: 1, 4704.0: 1, 4707.0: 1, 4708.0: 1, 4709.0: 1, 4711.0: 1, 4712.0: 1, 4713.0: 1, 4716.0: 1, 4717.0: 1, 4719.0: 1, 4722.0: 1, 4723.0: 1, 4725.0: 1, 4726.0: 1, 4727.0: 1, 4728.0: 1, 4729.0: 1, 4730.0: 1, 4731.0: 1, 4732.0: 1, 4734.0: 1, 4735.0: 1, 4736.0: 1, 4737.0: 1, 4739.0: 1, 4740.0: 1, 4741.0: 1, 4742.0: 1, 4743.0: 1, 4744.0: 1, 4745.0: 1, 4746.0: 1, 4747.0: 1, 4751.0: 1, 4752.0: 1, 4753.0: 1, 4754.0: 1, 4758.0: 1, 4761.0: 1, 4762.0: 1, 4764.0: 1, 4765.0: 1, 4766.0: 1, 4767.0: 1, 4769.0: 1, 4770.0: 1, 4771.0: 1, 4772.0: 1, 4773.0: 1, 4775.0: 1, 4777.0: 1, 4778.0: 1, 4779.0: 1, 4783.0: 1, 4784.0: 1, 4786.0: 1, 4788.0: 1, 4790.0: 1, 4791.0: 1, 4792.0: 1, 4794.0: 1, 4796.0: 1, 4800.0: 1, 4801.0: 1, 4802.0: 1, 4806.0: 1, 4807.0: 1, 4809.0: 1, 4810.0: 1, 4812.0: 1, 4813.0: 1, 4816.0: 1, 4819.0: 1, 4821.0: 1, 4824.0: 1, 4825.0: 1, 4827.0: 1, 4828.0: 1, 4829.0: 1, 4831.0: 1, 4832.0: 1, 4836.0: 1, 4839.0: 1, 4842.0: 1, 4844.0: 1, 4845.0: 1, 4847.0: 1, 4848.0: 1, 4849.0: 1, 4852.0: 1, 4854.0: 1, 4855.0: 1, 4857.0: 1, 4858.0: 1, 4860.0: 1, 4861.0: 1, 4862.0: 1, 4863.0: 1, 4864.0: 1, 4865.0: 1, 4867.0: 1, 4868.0: 1, 4869.0: 1, 4870.0: 1, 4872.0: 1, 4875.0: 1, 4876.0: 1, 4877.0: 1, 4878.0: 1, 4880.0: 1, 4881.0: 1, 4882.0: 1, 4884.0: 1, 4887.0: 1, 4889.0: 1, 4890.0: 1, 4891.0: 1, 4892.0: 1, 4893.0: 1, 4896.0: 1, 4898.0: 1, 4899.0: 1, 4900.0: 1, 4901.0: 1, 4902.0: 1, 4903.0: 1, 4904.0: 1, 4906.0: 1, 4907.0: 1, 4908.0: 1, 4909.0: 1, 4910.0: 1, 4911.0: 1, 4912.0: 1, 4913.0: 1, 4915.0: 1, 4916.0: 1, 4917.0: 1, 4918.0: 1, 4921.0: 1, 4922.0: 1, 4923.0: 1, 4924.0: 1, 4926.0: 1, 4928.0: 1, 4929.0: 1, 4930.0: 1, 4932.0: 1, 4933.0: 1, 4934.0: 1, 4935.0: 1, 4938.0: 1, 4939.0: 1, 4940.0: 1, 4941.0: 1, 4944.0: 1, 4945.0: 1, 4946.0: 1, 4947.0: 1, 4948.0: 1, 4949.0: 1, 4950.0: 1, 4951.0: 1, 4952.0: 1, 4953.0: 1, 4954.0: 1, 4955.0: 1, 4956.0: 1, 4961.0: 1, 4968.0: 1, 4969.0: 1, 4970.0: 1, 4974.0: 1, 4976.0: 1, 4977.0: 1, 4978.0: 1, 4980.0: 1, 4981.0: 1, 4985.0: 1, 4987.0: 1, 4989.0: 1, 4990.0: 1, 4992.0: 1, 4993.0: 1, 4996.0: 1, 4997.0: 1})
number of unique locations: 3868
In [ ]:
num_uniq
Out[ ]:
3868
In [ ]:
# satellite array -> [time_minute, x, y, z, vx, vy, vz]' = 7 X 1441 X 15 
print("Sat array shape:",satellite_state.shape)
# sun array -> [time_minute, x, y, z, vx, vy, vz]' = 7 X 1441
print("Sun array shape:",sun_state.shape)
# target array -> [id, population, lat_deg, long_deg, alt_m, x, y, z] = 8 X 5000
print("Unique targets array shape:",unique_targets.shape)
Sat array shape: (7, 1441, 15)
Sun array shape: (7, 1441)
Unique targets array shape: (8, 3868)

Section 2 - Creating Lookup Tables

In [ ]:
# create a cmobined 3D vector for Sat1,....Sat15, Sun [16 X 1441] X 3 (x, y, z) coordinates
coordinates_all = np.zeros([16,1441,3])

for j in range(3):
  coordinates_all[-1,:,j] = sun_state[j+1,:]
  for i in range(15):
    coordinates_all[i,:,j] = satellite_state[j+1,:,i]    
In [ ]:
import time 
start = time.time()

# create an elevation and azimuth table -> 16 X 1441 X 3868
elevation_table = np.zeros([16,1441,num_uniq])
azimuth_table = np.zeros([16,1441,num_uniq])
slantR_table = np.zeros([16,1441,num_uniq])

# compute values for each location and each time step
for i in range(num_uniq):
  cos_phi, sin_phi = np.cos(np.deg2rad(unique_targets[2,i])), np.sin(np.deg2rad(unique_targets[2,i])) 
  cos_lam, sin_lam = np.cos(np.deg2rad(unique_targets[3,i])), np.sin(np.deg2rad(unique_targets[3,i]))
  
  u, v, w = coordinates_all[:,:,0] - unique_targets[-3,i], coordinates_all[:,:,1] - unique_targets[-2,i], coordinates_all[:,:,2] - unique_targets[-1,i]

  t = cos_lam*u + sin_lam*v
  xEast = -sin_lam*u + cos_lam*v
  zUp = cos_phi*t + sin_phi*w
  yNorth = -sin_phi*t + cos_phi*w

  r = np.sqrt(xEast**2+yNorth**2)
  slantR_table[:,:,i] = np.sqrt(r**2+zUp**2)
  elevation_table[:,:,i] = np.rad2deg(np.arctan2(zUp,r))
  azimuth_table[:,:,i] = np.mod(np.rad2deg(np.arctan2(xEast,yNorth)), 360)

print("time taken to compute:",time.time()-start)
time taken to compute: 12.975801467895508
In [ ]:
print("At t = 0, elevation, azimuth and Range from location id=441 for all satellites + sun")
print("Elevation: ",elevation_table[:,0,0], " \n Azimuth: ", azimuth_table[:,0,0], "\n Range: " ,slantR_table[:,0,0])
# each with shape [16 X 1441 X 5000]
At t = 0, elevation, azimuth and Range from location id=441 for all satellites + sun
Elevation:  [-23.02523179 -47.12800101 -30.12315226 -28.84825633 -43.18624283
 -65.72759723 -67.97035958 -44.16058572 -20.97021175 -15.53280509
 -57.03036697 -45.12832721 -85.62530309 -55.76623132 -58.62948353
 -20.69444796]  
 Azimuth:  [225.0820919  300.93108497 237.89988715 162.62296687 155.62114837
 119.31218932  19.73879054 337.43932396 304.44521809 199.73444379
 349.11750628  99.46297443 125.1260619  344.4781595   17.63197826
 126.40157004] 
 Range:  [6.25800196e+03 9.99281022e+03 7.32759398e+03 7.11978220e+03
 9.45309034e+03 1.21775263e+04 1.23401378e+04 9.55276545e+03
 5.72039566e+03 4.85532838e+03 1.13571579e+04 9.82259419e+03
 1.33475063e+04 1.11112274e+04 1.14404285e+04 1.47103541e+08]
In [ ]:
num_sats = 2
plt.figure(1)
for i in range(num_sats): plt.plot(satellite_state[0,:,0],elevation_table[i,:,0],alpha=0.3)
plt.title("Elevation change for Location_Id=441 with time")
plt.xlabel("timestamp_minute")
plt.ylabel("Elevation angle (deg)")
plt.show()

plt.figure(2)
for i in range(num_sats): plt.plot(satellite_state[0,:,0],azimuth_table[i,:,0],alpha=0.3)
plt.title("Azimuth change for Location_Id=441 with time")
plt.xlabel("timestamp_minute")
plt.ylabel("Azimuth angle (deg)")
plt.show()

plt.figure(3)
for i in range(num_sats): plt.plot(satellite_state[0,:,0],slantR_table[i,:,0],alpha=0.3)
plt.title("Range change for Location_Id=441 with time")
plt.xlabel("timestamp_minute")
plt.ylabel("Range angle (km)")
plt.show()
In [ ]:
# check elevation and azimuth tables with results provided
print("timestamp_minute:",satellite_state[0,364,0])
print("satellite_azimuth_deg:", azimuth_table[3,364,0])
print("satellite_elevation_deg:", elevation_table[3,364,0])
print("sun_azimuth_deg:", azimuth_table[-1,364,0])
print("sun_elevation_deg:", elevation_table[-1,364,0])
timestamp_minute: 25772044.0
satellite_azimuth_deg: 82.57491712319134
satellite_elevation_deg: 47.00700544303632
sun_azimuth_deg: 100.05043779330067
sun_elevation_deg: 58.373567309768724

Section 3 - Data Visualization and Manipulation

In [ ]:
# elevation look up table = [15 sats + sun X 1441 timesteps X 3868 locations]
print('Elevation table shape:',elevation_table.shape)
# azimuth look up table = [15 sats + sun X 1441 timesteps X 3868 locations]
print('Azimuth table shape:',azimuth_table.shape)
# range look up table = [15 sats + sun X 1441 timesteps X 3968 locations]
print('Range table shape:',slantR_table.shape)
Elevation table shape: (16, 1441, 3868)
Azimuth table shape: (16, 1441, 3868)
Range table shape: (16, 1441, 3868)
In [ ]:
# create array for satellite and sun differently
# satellite tables for elevation and range
sats_elevation_table = np.zeros([15,1441,num_uniq])
sats_elevation_table += elevation_table[0:15,:,:] # [15 X 1441 X 3868]
sats_range_table = slantR_table[0:15,:,:]

# sun table for elevation
sun_elevation_table = np.zeros([1,1441,num_uniq])
sun_elevation_table += elevation_table[-1,:,:] # [1 X 1441 X 3868]

# time vactor
time_vector = satellite_state[0,:,0]
In [ ]:
# modify the sun elevation table to set elevation values to 0 for elev < 5
modif_sun_ele_table = sun_elevation_table[:,:]
modif_sun_ele_table[sun_elevation_table<5]=0
print("Shape of new sun elevation table:",modif_sun_ele_table.shape)
Shape of new sun elevation table: (1, 1441, 3868)
In [ ]:
# modify each table to meet minimum requirement for elevation
modif_sat_ele_table_45 = sats_elevation_table[:,:,:]
modif_sat_ele_table_45[sats_elevation_table<45]=0
# sanity check
print("number of value with elevation > 45:",np.count_nonzero(modif_sat_ele_table_45[:,:,:]>45))
print("Shape of new sat elevation table:",modif_sat_ele_table_45.shape)
number of value with elevation > 45: 95586
Shape of new sat elevation table: (15, 1441, 3868)
In [ ]:
# visualize the elevation for three different locations for the entire time history for all satellites
num_sats = 15

for j in range(3):
    plt.figure(j)
    for i in range(num_sats): plt.plot(time_vector,modif_sat_ele_table_45[i,:,j],':^',alpha=0.3)
    plt.plot(time_vector,modif_sun_ele_table[0,:,j],'--k',alpha=0.3,label='sun elevation')
    plt.xlabel("timestamp_minute")
    plt.ylabel("Elevation angle (deg)")
    plt.legend()
    plt.show()

As seen above, even though the elevation is greater 45 deg for location 0 for many of the satellites, it will not always recieve a sun elevation greater than 5 degrees, so we can do the following: Set all the sun elevation angles = 1 where sun elevation for a place is greater than 5 deg and set everything else to 0. Multiply this vector element-wise with the all satellites for all locations, so only the elevations with good sunlight will have non-zero values.

In [ ]:
# set non-zero values to 1 for sun elevation
final_sun_ele = np.zeros_like(modif_sun_ele_table)
final_sun_ele[modif_sun_ele_table != 0] = 1

final_sat_ele = np.zeros_like(modif_sat_ele_table_45)

for i in range(num_uniq):
  final_sat_ele[:,:,i] = modif_sat_ele_table_45[:,:,i] * np.tile(final_sun_ele[0,:,i],(15,1)) 
In [ ]:
# visualize the elevation for three different locations for the entire time history for all satellites
num_sats = 15

for j in range(15):
    plt.figure(j)
    for i in range(num_sats): plt.plot(time_vector,final_sat_ele[i,:,j],':^',alpha=0.3)
    plt.plot(time_vector,90*final_sun_ele[0,:,j],'-k',alpha=0.3,label='sun elevation interval')
    plt.xlabel("timestamp_minute")
    plt.ylabel("Elevation angle (deg)")
    plt.legend()
    plt.show()

# can actually verify with plotting only sat index = 3, for id=441, plt.plot(time_vector,final_sat_ele[3,:,j],':^',alpha=0.3) matches with example provided
In [ ]:
count_ev = np.zeros(num_uniq)
for i in range(num_uniq):
  count_ev[i] = np.count_nonzero(final_sat_ele[:,:,i])
In [ ]:
# print(np.min(count_ev))
# print(np.max(count_ev))
counts, bins, bars = plt.hist(count_ev,bins=50)
In [ ]:
print(counts)
print(np.mean(count_ev))
print(np.max(bins))
[ 99.   0.   0.   0.   0.   0.   0.   0.   0.   1.   0.  50.   0.   0.
 205.   0. 250.   0.   0. 333.   0. 352.   0. 330.   0.   0. 404.   0.
 294.   0. 366.   0.   0. 377.   0. 340.   0.   0. 194.   0. 155.   0.
  81.   0.   0.  27.   0.   8.   0.   2.]
11.21664943123061
21.0

From above, we know that there are 123 locations which cannot be imaged whatsoever. Also at an average there are around 11 possible satellites candidates per location.

In [ ]:
# analyzing the imaging choices for each satellite at various timesteps
time_choice = np.zeros([15,1441])
for i in range(15): 
  for j in range(1441): 
    time_choice[i, j] = np.count_nonzero(final_sat_ele[i,j,:])
In [ ]:
# number of options to image for all satellite during epoch
plt.figure()
ax = plt.axes(projection='3d')
zline = time_choice
xline = np.arange(15)
yline = time_vector
X, Y = np.meshgrid(xline, yline)
ax.scatter3D(X, Y, zline)
Out[ ]:
<mpl_toolkits.mplot3d.art3d.Path3DCollection at 0x7ff94a0d4a58>
In [ ]:
# number of eligible cities to image for all satellites
num_sats = 15
plt.figure(1)
for i in range(num_sats): plt.plot(time_vector, time_choice[i,:],'-',alpha=0.25)
plt.xlabel("time")
plt.ylabel("number of choices")
plt.show()
In [ ]:
a = np.nonzero(final_sat_ele[:,:,0])
print(a[0])
print(a[1])
print('number of valid candidates:',len(a[0]))
for i in range(len(a[0])):
  print('sat_ind:',a[0][i],'time_ind:',a[1][i],'elevation',final_sat_ele[a[0][i],a[1][i],0])

a = np.nonzero(final_sat_ele[:,:,1])
print(a[0])
print(a[1])
print('number of valid candidates:',len(a[0]))
for i in range(len(a[0])):
  print('sat_ind:',a[0][i],'time_ind:',a[1][i],'elevation',final_sat_ele[a[0][i],a[1][i],1])
[ 3  4  4  9  9 11 11 13 13]
[364 558 559 542 543 388 389 410 411]
number of valid candidates: 9
sat_ind: 3 time_ind: 364 elevation 47.00700544303632
sat_ind: 4 time_ind: 558 elevation 68.28918828689471
sat_ind: 4 time_ind: 559 elevation 55.68386527882402
sat_ind: 9 time_ind: 542 elevation 60.56199449187699
sat_ind: 9 time_ind: 543 elevation 46.87600042671483
sat_ind: 11 time_ind: 388 elevation 70.30893795314482
sat_ind: 11 time_ind: 389 elevation 59.74730164052576
sat_ind: 13 time_ind: 410 elevation 51.17343705110385
sat_ind: 13 time_ind: 411 elevation 81.5538375233982
[1 2 2 3 7 7 8 8 9]
[405 422 423 440 586 587 599 600 618]
number of valid candidates: 9
sat_ind: 1 time_ind: 405 elevation 45.046955005481756
sat_ind: 2 time_ind: 422 elevation 65.34758420723195
sat_ind: 2 time_ind: 423 elevation 63.06324257951607
sat_ind: 3 time_ind: 440 elevation 57.98350328436275
sat_ind: 7 time_ind: 586 elevation 60.86754592991225
sat_ind: 7 time_ind: 587 elevation 53.06774487449228
sat_ind: 8 time_ind: 599 elevation 57.49632429849102
sat_ind: 8 time_ind: 600 elevation 71.84384646322437
sat_ind: 9 time_ind: 618 elevation 49.770071700371716

Based on this, we will now create a lookup table which has top three elevations for each location.

Section 4 - Optimization

In [ ]:
# for every location - chose top num_options(3) elevations and arrange them in a matrix = [15 sats, 1441 timesteps, 3868 loc, (1st, 2nd, 3rd) choices]
def create_rankings(num_options):
    multiplier_array = np.zeros([15,1441,num_uniq,num_options])

    # create a vector which returns TRUE if locations has candidate sata and FALSE otherwise
    options_available = np.zeros(num_uniq)

    for i in range(num_uniq):
        ind = np.unravel_index(np.argsort(-1*final_sat_ele[:,:,i], axis=None), [15,1441]) # sorting by max elevation
        x_index_vec = ind[0][0:num_options]
        y_index_vec = ind[1][0:num_options]
        counter_options = np.count_nonzero(final_sat_ele[x_index_vec,y_index_vec,i])
        if counter_options != 0:
          options_available[i] = 1
          for j in range(num_options):
            # multiplier_array[x_index_vec[j], y_index_vec[j], i, j] = 1 * targets_array[1,i]
            multiplier_array[x_index_vec[j], y_index_vec[j], i, j] = 1

    return multiplier_array, options_available
In [ ]:
def evaluator(design_vec):
    schedule_table = np.zeros([15,1441]) # -> table of location id's
    population_table = np.zeros([15,1441]) # -> table of populations

    for i in range(num_uniq):
      if ((design_vec[i] != 0) & (options_available[i] == 1)):
        dummy = multiplier_array[:,:,i,design_vec[i]-1]
        index = np.where(dummy!=0) # find index to check if a value is previously chosen
        x_ind, y_ind = index[0][0], index[1][0]
        if schedule_table[x_ind, y_ind] == 0:
          schedule_table[x_ind, y_ind] = unique_targets[0,i]
          population_table[x_ind, y_ind] = unique_targets[1,i]

    return schedule_table, population_table
    
def objective(design):
    design = design.astype(int)
    sch_table, pop_table = evaluator(design)
    # return -1*np.count_nonzero(sch_table) # returns number of cities
    return -100*np.sum(pop_table)/934184156.0 # returns percentage of total population covered     
In [ ]:
test_des = np.array([1]*3868)
# test_des = np.array([1,2]*1934)
# test_des = np.array([1,2,0,3]*967)

import time
num_options = 3
multiplier_array, options_available = create_rankings(num_options)

start = time.time()
time_table, pop_table = evaluator(test_des)

print('precentage of cities pictured:', np.count_nonzero(time_table)*100/3868,'%')
print('percentage population covered: ', np.sum(pop_table)*100/np.sum(unique_targets[1,:]),'%')
print('time taken to evaluate designs:', time.time() - start,'seconds')
precentage of cities pictured: 35.108583247156155 %
percentage population covered:  40.49407652338732 %
time taken to evaluate designs: 1.8541946411132812 seconds
In [ ]:
!pip install geneticalgorithm
import numpy as np
from geneticalgorithm import geneticalgorithm as ga

Section 5 - Tests

In [ ]:
# HYPER PARAMETERS FOR THE DESIGN SEARCH SPACE
num_options = 2 # has to be atleast 1
multiplier_array, options_available = create_rankings(num_options)
print('Rankings created!')

varbound = np.array([[0,num_options]]*3868)

algorithm_param = {'max_num_iteration': 30, 'population_size': 10,\
                   'mutation_probability':0.1,'elit_ratio': 0.01,\
                   'crossover_probability': 0.5, 'parents_portion': 0.3,\
                   'crossover_type':'uniform', 'max_iteration_without_improv': 5}

model = ga(function=objective, dimension=3868, variable_type='int', variable_boundaries=varbound, algorithm_parameters = algorithm_param)

# run the GA algorithm
start = time.time()
model.run()
end = time.time()

print('Optimum Found!')
schedule, population = evaluator((model.output_dict['variable']).astype(int))
print('Total time taken to evaluate designs:', end - start)
print('Percentage of cities pictured for the optimal design:', np.count_nonzero(schedule)*100/3868,'%')
print('Percentage population covered for the optimal design: ', np.sum(population)*100/np.sum(unique_targets[1,:]),'%')
Rankings created!
 The best solution found:
 [2. 1. 2. ... 0. 0. 2.]

 Objective function:
 -48.6196276272534
Optimum Found!
time taken to evaluate designs: 361.1563115119934
precentage of cities pictured for optimum: 30.972078593588417 %
percentage population covered for optimum:  48.6196276272534 %
In [ ]:
# HYPER PARAMETERS FOR THE DESIGN SEARCH SPACE
num_options = 2 # has to be atleast 1
multiplier_array, options_available = create_rankings(num_options)
print('Rankings created!')

varbound = np.array([[0,num_options]]*3868)

algorithm_param = {'max_num_iteration': 25, 'population_size': 40,\
                   'mutation_probability':0.1,'elit_ratio': 0.01,\
                   'crossover_probability': 0.5, 'parents_portion': 0.3,\
                   'crossover_type':'uniform', 'max_iteration_without_improv': 5}

model = ga(function=objective, dimension=3868, variable_type='int', variable_boundaries=varbound, algorithm_parameters = algorithm_param)

# run the GA algorithm
start = time.time()
model.run()
end = time.time()

print('Optimum Found!')
schedule, population = evaluator((model.output_dict['variable']).astype(int))
print('Total time taken to evaluate designs:', end - start)
print('Percentage of cities pictured for the optimal design:', np.count_nonzero(schedule)*100/3868,'%')
print('Percentage population covered for the optimal design: ', np.sum(population)*100/np.sum(unique_targets[1,:]),'%')
Rankings created!
 The best solution found:
 [0. 2. 2. ... 1. 1. 2.]

 Objective function:
 -47.900555594522416
Optimum Found!
Total time taken to evaluate designs: 832.7866191864014
Percentage of cities pictured for the optimal design: 30.403309203722856 %
Percentage population covered for the optimal design:  47.900555594522416 %
In [ ]:
# HYPER PARAMETERS FOR THE DESIGN SEARCH SPACE
num_options = 3 # has to be atleast 1
multiplier_array, options_available = create_rankings(num_options)
print('Rankings created!')
lower_bound = 1

varbound = np.array([[lower_bound,num_options]]*3868)

algorithm_param = {'max_num_iteration': 25, 'population_size': 40,\
                   'mutation_probability':0.1,'elit_ratio': 0.01,\
                   'crossover_probability': 0.5, 'parents_portion': 0.3,\
                   'crossover_type':'uniform', 'max_iteration_without_improv': 5}

model = ga(function=objective, dimension=3868, variable_type='int', variable_boundaries=varbound, algorithm_parameters = algorithm_param)

# run the GA algorithm
start = time.time()
model.run()
end = time.time()

print('Optimum Found!')
schedule, population = evaluator((model.output_dict['variable']).astype(int))
print('Total time taken to evaluate designs:', end - start)
print('Percentage of cities pictured for the optimal design:', np.count_nonzero(schedule)*100/3868,'%')
print('Percentage population covered for the optimal design: ', np.sum(population)*100/np.sum(unique_targets[1,:]),'%')
final_design_run3 = (model.output_dict['variable']).astype(int)
Rankings created!
 The best solution found:
 [2. 1. 1. ... 1. 2. 2.]

 Objective function:
 -55.038675051131996
Warning: GA is terminated due to the maximum number of iterations without improvement was met!Optimum Found!
Total time taken to evaluate designs: 1257.5443177223206
Percentage of cities pictured for the optimal design: 38.10754912099276 %
Percentage population covered for the optimal design:  55.038675051131996 %
In [ ]:
final_design_run3
Out[ ]:
array([2, 1, 1, 1, 1, 2, 3, 3, 2, 3, 2, 1, 2, 1, 2, 1, 2, 3, 2, 2, 1, 2,
       2, 3, 3, 1, 3, 3, 2, 1, 3, 3, 3, 2, 3, 3, 1, 3, 1, 2, 1, 2, 3, 1,
       3, 2, 1, 1, 3, 2, 1, 1, 2, 2, 1, 2, 2, 3, 2, 2, 3, 3, 1, 1, 3, 3,
       3, 2, 1, 2, 2, 1, 3, 2, 3, 2, 3, 2, 3, 3, 1, 2, 2, 2, 1, 3, 1, 1,
       2, 2, 2, 2, 3, 3, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 3, 3, 1, 1,
       3, 2, 2, 1, 1, 1, 1, 1, 1, 2, 3, 3, 2, 1, 3, 1, 1, 2, 3, 2, 3, 3,
       2, 1, 1, 1, 2, 1, 3, 3, 2, 3, 2, 3, 1, 3, 3, 3, 3, 1, 3, 3, 2, 2,
       3, 3, 2, 1, 3, 3, 2, 3, 2, 1, 2, 2, 2, 2, 1, 3, 1, 2, 3, 2, 1, 1,
       3, 1, 1, 2, 1, 1, 1, 2, 1, 3, 1, 3, 3, 1, 2, 2, 1, 3, 1, 3, 3, 2,
       3, 3, 3, 1, 1, 1, 3, 2, 3, 1, 1, 2, 1, 3, 2, 1, 2, 1, 2, 1, 1, 3,
       1, 1, 2, 2, 1, 2, 3, 1, 1, 3, 2, 2, 1, 1, 3, 3, 2, 2, 2, 3, 2, 3,
       3, 3, 3, 2, 3, 2, 3, 2, 3, 1, 1, 3, 2, 1, 3, 1, 3, 2, 2, 3, 2, 2,
       3, 2, 1, 2, 1, 3, 1, 1, 3, 1, 3, 1, 3, 2, 2, 2, 2, 1, 3, 1, 1, 1,
       3, 1, 2, 2, 2, 3, 3, 1, 2, 1, 1, 1, 2, 1, 1, 3, 2, 2, 1, 3, 2, 2,
       3, 3, 2, 2, 3, 2, 2, 1, 1, 3, 3, 3, 2, 2, 2, 3, 3, 3, 3, 3, 1, 2,
       1, 2, 2, 3, 2, 1, 1, 1, 1, 3, 2, 2, 3, 2, 2, 2, 2, 3, 2, 2, 2, 1,
       1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, 2, 3, 1, 3, 2, 1, 3, 3, 1, 3, 2,
       3, 2, 3, 2, 2, 3, 3, 2, 1, 3, 3, 2, 2, 3, 1, 2, 3, 2, 2, 3, 3, 2,
       1, 2, 1, 2, 2, 3, 2, 2, 2, 2, 2, 1, 2, 3, 3, 3, 3, 2, 2, 1, 1, 2,
       2, 2, 3, 1, 3, 3, 2, 2, 3, 1, 1, 1, 2, 2, 3, 1, 1, 2, 1, 3, 3, 3,
       1, 3, 1, 3, 2, 3, 2, 3, 2, 1, 1, 2, 1, 2, 2, 1, 2, 3, 1, 3, 2, 3,
       1, 1, 3, 3, 1, 1, 2, 2, 3, 2, 2, 2, 1, 2, 3, 1, 3, 3, 1, 2, 1, 3,
       3, 1, 1, 3, 2, 2, 3, 2, 2, 2, 3, 3, 1, 2, 2, 3, 3, 1, 3, 3, 1, 1,
       3, 3, 3, 1, 1, 2, 3, 1, 3, 1, 1, 1, 2, 3, 2, 2, 3, 2, 3, 2, 1, 1,
       1, 3, 1, 3, 1, 2, 1, 3, 2, 3, 3, 1, 2, 2, 1, 1, 2, 2, 1, 3, 2, 1,
       1, 3, 1, 3, 1, 2, 3, 3, 3, 1, 1, 2, 1, 1, 1, 1, 3, 2, 2, 1, 1, 3,
       3, 3, 3, 1, 1, 2, 1, 2, 3, 1, 3, 1, 2, 1, 3, 2, 2, 3, 1, 3, 3, 3,
       3, 2, 2, 1, 1, 3, 2, 2, 1, 2, 2, 1, 1, 2, 2, 2, 2, 1, 1, 2, 1, 2,
       1, 1, 3, 1, 2, 2, 2, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 2, 3, 1, 3, 2,
       3, 2, 1, 1, 2, 1, 3, 1, 3, 2, 1, 3, 2, 2, 1, 2, 1, 2, 2, 1, 1, 2,
       3, 1, 1, 2, 1, 2, 1, 1, 1, 2, 3, 2, 3, 2, 3, 2, 1, 2, 1, 3, 3, 2,
       1, 1, 3, 3, 1, 3, 1, 2, 3, 2, 1, 3, 1, 1, 3, 1, 3, 1, 1, 2, 3, 2,
       3, 3, 3, 2, 2, 1, 1, 1, 3, 2, 1, 3, 2, 1, 1, 3, 2, 3, 2, 1, 3, 1,
       3, 1, 3, 1, 3, 3, 3, 1, 2, 2, 1, 1, 3, 1, 1, 3, 2, 2, 3, 1, 3, 1,
       1, 3, 1, 3, 3, 2, 2, 1, 2, 3, 2, 1, 2, 2, 1, 2, 3, 1, 2, 3, 2, 3,
       2, 3, 3, 3, 1, 3, 2, 3, 3, 1, 2, 1, 2, 1, 2, 1, 3, 2, 1, 1, 1, 1,
       2, 1, 2, 2, 3, 2, 2, 3, 1, 3, 1, 2, 2, 3, 3, 1, 2, 1, 1, 3, 2, 3,
       3, 1, 2, 2, 3, 2, 2, 2, 2, 1, 2, 3, 2, 3, 1, 1, 2, 3, 1, 2, 1, 3,
       2, 2, 1, 1, 1, 3, 1, 3, 3, 3, 2, 1, 2, 2, 2, 1, 1, 1, 3, 3, 2, 3,
       2, 3, 3, 3, 1, 1, 3, 2, 2, 2, 2, 3, 1, 2, 3, 1, 3, 2, 3, 2, 1, 3,
       2, 1, 3, 1, 3, 1, 1, 3, 2, 3, 1, 3, 3, 2, 1, 3, 1, 3, 3, 2, 2, 3,
       2, 2, 3, 3, 3, 1, 2, 3, 1, 2, 3, 1, 3, 3, 2, 3, 3, 2, 2, 3, 2, 1,
       3, 1, 2, 3, 2, 1, 3, 2, 2, 1, 3, 3, 1, 1, 1, 2, 3, 3, 2, 1, 2, 2,
       1, 2, 1, 3, 2, 2, 3, 1, 3, 1, 1, 3, 3, 2, 2, 3, 2, 2, 3, 3, 3, 1,
       2, 3, 1, 2, 1, 3, 3, 3, 3, 3, 3, 2, 1, 3, 2, 1, 3, 1, 1, 2, 1, 3,
       3, 2, 1, 3, 3, 3, 2, 2, 3, 2, 2, 3, 1, 2, 1, 2, 3, 2, 2, 3, 3, 1,
       2, 3, 3, 1, 2, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 3, 1, 2,
       1, 2, 2, 3, 2, 3, 3, 2, 1, 3, 2, 2, 1, 3, 1, 1, 1, 2, 1, 3, 3, 2,
       3, 2, 3, 2, 3, 2, 3, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 3, 2, 3, 3, 1,
       1, 2, 1, 3, 3, 3, 3, 2, 3, 3, 1, 1, 2, 2, 1, 2, 2, 1, 1, 1, 2, 2,
       2, 3, 2, 1, 3, 1, 3, 3, 3, 2, 2, 3, 3, 2, 1, 1, 1, 2, 3, 2, 2, 1,
       2, 2, 3, 3, 1, 3, 3, 2, 1, 1, 1, 3, 2, 3, 1, 3, 3, 3, 2, 3, 2, 1,
       1, 2, 3, 3, 3, 3, 2, 2, 3, 2, 2, 3, 1, 3, 1, 3, 1, 3, 2, 3, 1, 1,
       1, 3, 2, 3, 2, 2, 2, 2, 1, 1, 3, 3, 1, 2, 2, 1, 1, 1, 3, 3, 1, 1,
       2, 2, 1, 2, 3, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 1, 2, 1, 3, 3, 2, 3,
       1, 3, 3, 1, 3, 2, 1, 2, 1, 1, 2, 2, 3, 3, 1, 3, 1, 1, 1, 2, 1, 3,
       3, 3, 3, 2, 1, 1, 3, 1, 2, 3, 2, 1, 3, 2, 2, 2, 1, 3, 1, 2, 1, 1,
       1, 1, 1, 1, 1, 1, 2, 3, 2, 3, 1, 1, 1, 1, 2, 1, 2, 2, 1, 3, 1, 2,
       3, 1, 3, 2, 1, 1, 3, 2, 3, 1, 1, 2, 2, 2, 1, 2, 2, 2, 3, 1, 1, 3,
       3, 1, 2, 2, 3, 2, 3, 3, 1, 3, 1, 2, 2, 2, 2, 3, 1, 2, 2, 3, 2, 1,
       2, 2, 3, 1, 2, 1, 3, 1, 2, 1, 1, 2, 3, 2, 3, 3, 2, 2, 1, 1, 3, 2,
       2, 3, 3, 1, 3, 3, 3, 1, 3, 2, 1, 3, 3, 1, 3, 1, 3, 1, 2, 1, 2, 3,
       1, 2, 2, 1, 2, 1, 2, 1, 1, 1, 3, 3, 1, 2, 1, 2, 2, 3, 3, 2, 3, 2,
       2, 2, 3, 3, 1, 1, 1, 2, 3, 2, 1, 2, 3, 2, 3, 1, 2, 1, 2, 3, 3, 3,
       1, 2, 3, 1, 3, 2, 3, 1, 2, 2, 1, 2, 3, 3, 3, 3, 3, 3, 1, 2, 3, 3,
       3, 2, 3, 1, 2, 1, 1, 2, 2, 2, 3, 2, 3, 3, 1, 3, 1, 1, 1, 1, 1, 1,
       3, 3, 1, 2, 3, 2, 1, 1, 3, 2, 3, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1,
       1, 1, 1, 3, 2, 1, 2, 3, 3, 3, 1, 3, 3, 3, 2, 1, 1, 3, 2, 3, 1, 2,
       1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 3, 3, 2, 3, 1, 1, 1, 1, 2,
       2, 1, 2, 3, 3, 3, 1, 3, 1, 2, 1, 3, 3, 1, 1, 1, 2, 3, 2, 2, 2, 1,
       2, 2, 2, 2, 3, 2, 3, 1, 1, 1, 3, 2, 1, 3, 2, 2, 3, 1, 1, 3, 3, 3,
       3, 1, 2, 2, 1, 2, 1, 2, 2, 1, 3, 1, 1, 1, 2, 1, 3, 1, 1, 3, 1, 3,
       2, 3, 2, 2, 2, 2, 1, 3, 3, 1, 1, 3, 3, 1, 2, 1, 1, 1, 3, 3, 3, 3,
       2, 2, 3, 3, 1, 3, 2, 3, 3, 1, 1, 3, 2, 1, 2, 1, 2, 3, 3, 3, 1, 3,
       3, 3, 2, 3, 2, 1, 1, 2, 3, 3, 2, 1, 3, 2, 3, 1, 1, 3, 2, 1, 2, 1,
       3, 3, 1, 2, 1, 1, 2, 3, 1, 3, 3, 1, 3, 3, 3, 2, 1, 2, 3, 2, 1, 3,
       2, 1, 1, 3, 3, 1, 2, 3, 3, 3, 2, 3, 3, 2, 2, 2, 2, 2, 3, 2, 2, 2,
       2, 2, 2, 2, 3, 1, 1, 2, 2, 2, 2, 1, 3, 2, 1, 1, 2, 1, 2, 2, 1, 1,
       1, 1, 1, 3, 1, 2, 3, 3, 2, 3, 1, 3, 2, 1, 1, 1, 1, 2, 3, 1, 3, 3,
       1, 1, 1, 3, 3, 1, 2, 1, 3, 3, 3, 2, 3, 2, 1, 2, 2, 3, 1, 2, 3, 1,
       3, 1, 2, 2, 1, 2, 3, 3, 3, 2, 2, 1, 1, 1, 3, 1, 1, 3, 3, 3, 2, 1,
       2, 3, 2, 1, 1, 1, 2, 1, 3, 1, 1, 1, 2, 2, 1, 3, 1, 2, 1, 1, 1, 2,
       2, 3, 3, 3, 2, 3, 3, 1, 3, 2, 1, 3, 3, 2, 2, 3, 2, 2, 1, 3, 1, 2,
       2, 1, 3, 3, 1, 3, 2, 2, 3, 2, 3, 3, 3, 1, 3, 2, 2, 2, 2, 3, 3, 1,
       2, 3, 1, 1, 1, 1, 1, 3, 2, 1, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 2, 2,
       3, 2, 2, 1, 3, 1, 2, 2, 1, 2, 1, 1, 1, 1, 3, 1, 1, 2, 1, 2, 2, 1,
       2, 2, 2, 2, 2, 3, 3, 1, 2, 2, 1, 1, 2, 2, 1, 3, 2, 2, 3, 2, 1, 2,
       3, 2, 1, 2, 3, 3, 2, 2, 1, 2, 3, 3, 2, 1, 2, 2, 3, 3, 3, 1, 3, 3,
       1, 2, 3, 2, 3, 3, 3, 2, 3, 1, 1, 2, 3, 2, 2, 2, 3, 1, 1, 1, 2, 2,
       3, 1, 3, 3, 1, 3, 3, 3, 2, 1, 1, 1, 2, 3, 3, 1, 3, 2, 2, 1, 1, 2,
       2, 1, 3, 2, 2, 3, 3, 1, 1, 1, 2, 3, 3, 1, 3, 2, 1, 2, 2, 2, 1, 2,
       3, 3, 2, 2, 3, 2, 3, 3, 3, 1, 3, 3, 1, 1, 1, 3, 1, 3, 2, 3, 3, 2,
       2, 2, 2, 2, 2, 1, 3, 2, 3, 3, 2, 3, 3, 1, 3, 2, 1, 2, 3, 1, 1, 3,
       2, 2, 3, 2, 2, 3, 2, 2, 3, 3, 1, 1, 2, 2, 2, 2, 3, 2, 1, 2, 2, 3,
       1, 2, 1, 2, 2, 3, 2, 1, 2, 2, 1, 1, 1, 2, 3, 3, 3, 2, 2, 3, 1, 2,
       3, 1, 1, 2, 1, 2, 2, 2, 3, 3, 1, 1, 3, 1, 2, 3, 1, 1, 1, 2, 1, 3,
       2, 1, 1, 1, 3, 2, 3, 2, 2, 1, 2, 3, 1, 1, 3, 2, 2, 1, 1, 3, 2, 3,
       1, 2, 3, 2, 2, 3, 3, 2, 2, 2, 1, 2, 2, 2, 1, 3, 3, 2, 2, 3, 3, 3,
       3, 1, 3, 1, 1, 3, 2, 1, 3, 3, 1, 2, 1, 2, 2, 1, 3, 1, 3, 2, 3, 3,
       1, 1, 3, 1, 3, 1, 2, 2, 1, 2, 3, 3, 3, 2, 2, 3, 3, 1, 1, 3, 2, 1,
       1, 3, 2, 1, 1, 1, 3, 3, 1, 2, 3, 1, 2, 2, 3, 1, 3, 2, 1, 1, 3, 2,
       1, 1, 2, 1, 1, 1, 3, 1, 2, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 2, 3, 2,
       2, 3, 3, 2, 3, 1, 3, 1, 2, 3, 3, 3, 1, 3, 1, 3, 1, 2, 3, 3, 2, 3,
       2, 1, 2, 2, 1, 2, 1, 1, 1, 1, 3, 3, 2, 3, 2, 2, 2, 1, 1, 3, 1, 2,
       2, 2, 1, 2, 2, 3, 2, 3, 3, 1, 3, 2, 3, 3, 1, 3, 3, 1, 2, 3, 1, 1,
       3, 2, 3, 3, 1, 1, 3, 1, 1, 1, 2, 3, 1, 3, 1, 2, 2, 2, 2, 3, 1, 2,
       1, 2, 3, 2, 2, 2, 1, 2, 3, 2, 1, 1, 2, 2, 1, 3, 1, 3, 2, 1, 3, 1,
       3, 2, 2, 3, 2, 3, 3, 3, 2, 2, 1, 1, 2, 2, 3, 3, 1, 1, 3, 1, 2, 2,
       3, 1, 3, 3, 3, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 3, 3, 1, 1, 1, 1,
       2, 2, 1, 2, 2, 3, 3, 3, 2, 3, 3, 1, 1, 3, 1, 1, 3, 3, 2, 2, 1, 1,
       2, 3, 1, 2, 2, 3, 1, 1, 1, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 3, 2, 2,
       1, 2, 1, 3, 2, 2, 3, 2, 2, 2, 1, 3, 1, 1, 1, 2, 3, 2, 1, 1, 2, 2,
       2, 3, 3, 1, 2, 3, 2, 3, 1, 1, 2, 1, 3, 2, 1, 2, 3, 1, 3, 1, 1, 1,
       1, 2, 3, 3, 1, 2, 1, 3, 3, 3, 1, 1, 2, 2, 2, 1, 1, 1, 1, 3, 1, 2,
       2, 2, 2, 3, 3, 3, 1, 3, 2, 3, 2, 2, 3, 2, 2, 2, 3, 1, 1, 2, 2, 1,
       1, 3, 3, 3, 1, 1, 3, 1, 1, 2, 2, 1, 3, 1, 3, 2, 2, 2, 2, 1, 1, 3,
       3, 3, 3, 3, 3, 3, 3, 2, 1, 3, 1, 1, 3, 1, 1, 3, 3, 3, 1, 2, 2, 3,
       2, 1, 1, 2, 1, 3, 3, 1, 2, 2, 2, 3, 2, 1, 3, 3, 1, 1, 1, 3, 2, 2,
       2, 2, 3, 1, 1, 3, 1, 2, 1, 2, 1, 2, 3, 1, 2, 2, 3, 2, 3, 3, 2, 2,
       1, 2, 3, 2, 3, 2, 2, 1, 2, 2, 3, 3, 2, 2, 2, 1, 3, 3, 2, 2, 2, 2,
       2, 3, 3, 2, 2, 3, 3, 2, 1, 2, 1, 1, 3, 3, 2, 1, 2, 1, 2, 1, 2, 2,
       3, 3, 1, 2, 2, 3, 2, 2, 3, 2, 1, 3, 1, 2, 1, 1, 1, 1, 3, 1, 3, 3,
       3, 1, 3, 3, 3, 3, 2, 3, 3, 1, 1, 3, 3, 2, 3, 1, 2, 3, 1, 2, 1, 2,
       3, 1, 2, 3, 3, 2, 3, 1, 3, 2, 1, 1, 3, 1, 1, 3, 2, 3, 2, 3, 1, 2,
       3, 3, 1, 2, 3, 3, 2, 3, 3, 1, 2, 3, 3, 3, 1, 2, 2, 2, 3, 3, 1, 2,
       1, 3, 1, 2, 2, 3, 3, 3, 3, 2, 2, 2, 1, 2, 3, 2, 3, 3, 1, 2, 2, 2,
       2, 2, 3, 1, 2, 2, 1, 3, 1, 3, 1, 1, 1, 2, 1, 3, 1, 2, 1, 3, 3, 2,
       2, 2, 1, 3, 2, 2, 1, 1, 1, 3, 3, 1, 3, 3, 1, 2, 3, 3, 3, 2, 3, 3,
       2, 2, 2, 3, 3, 1, 3, 3, 1, 3, 3, 3, 2, 1, 1, 2, 3, 3, 1, 2, 3, 2,
       2, 2, 2, 2, 1, 2, 2, 1, 3, 2, 2, 3, 3, 2, 2, 1, 3, 3, 1, 2, 3, 2,
       3, 2, 3, 3, 2, 3, 3, 2, 3, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 3, 1, 1,
       2, 1, 2, 3, 1, 3, 2, 2, 3, 3, 3, 3, 2, 1, 3, 3, 3, 1, 2, 2, 1, 1,
       3, 2, 1, 1, 2, 3, 1, 1, 2, 2, 3, 3, 3, 3, 1, 1, 2, 2, 2, 1, 3, 3,
       2, 1, 3, 1, 2, 1, 3, 3, 2, 3, 1, 2, 2, 2, 1, 2, 2, 1, 1, 3, 1, 1,
       3, 1, 2, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 2, 1, 1, 3, 1,
       1, 2, 1, 3, 1, 3, 2, 3, 1, 1, 3, 3, 1, 1, 1, 2, 2, 2, 1, 3, 3, 3,
       2, 2, 1, 2, 1, 3, 1, 2, 1, 2, 2, 1, 2, 3, 2, 1, 3, 3, 1, 1, 3, 1,
       1, 2, 2, 3, 1, 1, 3, 2, 2, 2, 3, 1, 2, 3, 2, 2, 3, 3, 1, 3, 1, 1,
       3, 1, 1, 3, 2, 1, 1, 1, 3, 2, 1, 1, 2, 2, 1, 1, 2, 1, 3, 3, 3, 3,
       3, 3, 3, 1, 3, 1, 1, 3, 1, 1, 1, 2, 1, 2, 1, 1, 3, 2, 1, 2, 3, 1,
       2, 3, 3, 3, 1, 1, 1, 2, 1, 3, 3, 3, 3, 1, 2, 1, 2, 3, 1, 3, 1, 3,
       3, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 3, 1, 3, 2, 1, 2, 2, 2, 2, 2,
       1, 3, 2, 3, 1, 1, 1, 2, 1, 3, 2, 2, 3, 1, 2, 3, 1, 2, 1, 3, 3, 1,
       2, 1, 1, 3, 1, 3, 3, 1, 2, 1, 2, 3, 2, 3, 3, 1, 3, 3, 1, 2, 1, 1,
       2, 3, 3, 1, 2, 1, 1, 3, 2, 1, 3, 2, 1, 1, 3, 3, 1, 1, 2, 3, 2, 3,
       1, 3, 3, 1, 3, 2, 1, 3, 1, 3, 2, 1, 3, 2, 3, 2, 2, 1, 3, 2, 1, 1,
       3, 1, 1, 2, 3, 1, 3, 2, 1, 3, 2, 3, 1, 1, 2, 2, 2, 3, 3, 1, 3, 3,
       2, 2, 2, 3, 3, 3, 3, 2, 3, 1, 2, 3, 3, 1, 2, 2, 3, 2, 2, 2, 3, 3,
       2, 3, 2, 3, 2, 3, 3, 1, 3, 2, 3, 1, 3, 3, 1, 1, 2, 1, 3, 2, 1, 1,
       1, 2, 3, 3, 1, 3, 1, 3, 3, 1, 1, 1, 3, 1, 2, 3, 3, 1, 3, 1, 1, 1,
       3, 1, 1, 2, 2, 3, 3, 3, 1, 1, 3, 2, 1, 1, 2, 3, 2, 3, 2, 2, 2, 1,
       1, 2, 3, 1, 1, 2, 2, 3, 1, 2, 3, 1, 3, 2, 3, 2, 1, 2, 1, 2, 1, 1,
       3, 1, 2, 1, 2, 3, 3, 2, 2, 3, 1, 3, 2, 2, 2, 1, 2, 2, 2, 2, 3, 3,
       1, 2, 1, 3, 3, 3, 1, 1, 3, 2, 1, 1, 2, 2, 2, 3, 3, 3, 1, 1, 1, 1,
       3, 3, 2, 3, 1, 3, 1, 1, 2, 1, 3, 2, 3, 2, 2, 2, 1, 2, 2, 3, 2, 1,
       2, 2, 3, 1, 3, 2, 2, 3, 2, 3, 2, 3, 1, 3, 1, 1, 1, 3, 3, 1, 1, 3,
       2, 1, 1, 2, 1, 2, 1, 3, 2, 3, 2, 3, 3, 2, 2, 2, 3, 2, 2, 2, 3, 2,
       3, 2, 2, 1, 3, 3, 2, 3, 2, 2, 2, 1, 1, 3, 2, 2, 3, 2, 3, 1, 3, 3,
       1, 2, 3, 3, 3, 1, 2, 3, 3, 2, 2, 3, 2, 2, 1, 2, 3, 2, 3, 2, 3, 1,
       3, 1, 2, 1, 2, 3, 1, 3, 1, 3, 1, 3, 3, 3, 3, 3, 1, 1, 1, 1, 3, 3,
       2, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 3, 2, 1, 1, 1, 1, 1, 2, 3, 1,
       1, 3, 2, 3, 1, 3, 2, 2, 3, 3, 1, 3, 3, 3, 3, 1, 1, 3, 1, 2, 1, 3,
       3, 2, 2, 1, 3, 2, 3, 1, 1, 3, 3, 3, 3, 2, 2, 1, 1, 2, 3, 3, 3, 3,
       1, 2, 2, 1, 3, 1, 1, 1, 2, 1, 3, 3, 2, 2, 2, 2, 3, 3, 1, 1, 3, 2,
       1, 1, 2, 2, 1, 2, 2, 3, 2, 1, 1, 3, 3, 1, 3, 1, 2, 3, 3, 2, 3, 1,
       2, 3, 3, 2, 2, 3, 1, 2, 2, 3, 2, 2, 1, 2, 3, 2, 3, 3, 1, 2, 2, 1,
       2, 1, 3, 3, 2, 2, 1, 2, 3, 2, 1, 2, 1, 3, 1, 3, 1, 2, 2, 1, 1, 3,
       2, 1, 2, 1, 3, 2, 1, 3, 1, 3, 3, 3, 2, 1, 2, 3, 1, 1, 3, 2, 3, 2,
       1, 3, 3, 2, 2, 1, 3, 1, 1, 3, 3, 3, 1, 1, 3, 2, 1, 2, 3, 3, 2, 2,
       2, 2, 3, 2, 3, 1, 1, 2, 3, 1, 2, 3, 1, 3, 3, 3, 2, 1, 1, 2, 3, 1,
       2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 2, 2, 1, 2, 3, 2, 2, 2, 2, 1, 1, 3,
       2, 3, 2, 3, 3, 1, 2, 1, 2, 2, 1, 2, 2, 3, 3, 1, 2, 2, 3, 1, 2, 2,
       2, 1, 1, 2, 2, 3, 2, 1, 2, 2, 2, 2, 3, 3, 1, 1, 2, 2, 3, 3, 1, 3,
       2, 2, 3, 3, 1, 3, 2, 3, 1, 3, 3, 2, 3, 3, 3, 3, 2, 1, 3, 1, 1, 3,
       1, 1, 1, 2, 3, 3, 3, 2, 3, 2, 2, 1, 3, 3, 1, 1, 3, 1, 1, 1, 1, 3,
       1, 3, 3, 2, 2, 3, 2, 3, 3, 1, 1, 1, 3, 3, 3, 1, 2, 2])
In [ ]:
# HYPER PARAMETERS FOR THE DESIGN SEARCH SPACE
num_options = 2 # has to be atleast 1
multiplier_array, options_available = create_rankings(num_options)
print('Rankings created!')
lower_bound = 1

varbound = np.array([[lower_bound,num_options]]*3868)

algorithm_param = {'max_num_iteration': 25, 'population_size': 100,\
                   'mutation_probability':0.1,'elit_ratio': 0.01,\
                   'crossover_probability': 0.5, 'parents_portion': 0.3,\
                   'crossover_type':'uniform', 'max_iteration_without_improv': 5}

model = ga(function=objective, dimension=3868, variable_type='int', variable_boundaries=varbound, algorithm_parameters = algorithm_param)

# run the GA algorithm
start = time.time()
model.run()
end = time.time()

print('Optimum Found!')
schedule, population = evaluator((model.output_dict['variable']).astype(int))
print('Total time taken to evaluate designs:', end - start)
print('Percentage of cities pictured for the optimal design:', np.count_nonzero(schedule)*100/3868,'%')
print('Percentage population covered for the optimal design: ', np.sum(population)*100/np.sum(unique_targets[1,:]),'%')
final_design_run4 = (model.output_dict['variable']).astype(int)
Rankings created!
 The best solution found:
 [2. 1. 1. ... 1. 2. 2.]

 Objective function:
 -54.579392695244984
Optimum Found!
Total time taken to evaluate designs: 3119.928900241852
Percentage of cities pictured for the optimal design: 37.20268872802482 %
Percentage population covered for the optimal design:  54.579392695244984 %
In [ ]:
import sys
import numpy
np.set_printoptions(threshold=sys.maxsize)
print(final_design_run4)
[2 1 1 2 1 1 2 2 1 1 2 2 1 1 1 2 1 2 1 1 2 2 1 2 1 1 1 2 2 2 1 2 1 2 2 1 2
 1 1 2 2 1 2 1 1 2 2 1 1 1 2 2 1 1 1 1 1 1 2 1 2 1 2 1 1 2 2 1 1 2 1 1 1 2
 2 1 1 1 1 2 1 2 1 2 2 1 1 2 2 1 1 1 1 1 2 2 2 1 1 2 1 2 2 1 1 1 2 1 2 2 2
 2 2 1 1 1 2 2 1 2 1 1 2 1 2 1 2 1 2 1 1 2 2 1 1 1 2 1 2 1 1 2 2 1 1 1 2 1
 1 2 2 2 1 2 1 2 1 2 2 1 2 1 1 2 2 1 1 2 1 1 1 1 1 2 2 2 2 2 1 1 2 1 1 2 1
 1 1 2 1 1 2 1 2 2 2 1 1 2 1 1 2 1 2 1 2 2 2 2 1 2 2 1 2 2 2 1 2 1 1 1 1 1
 2 2 2 1 1 1 1 1 1 1 2 1 2 2 2 2 1 1 1 2 2 2 1 1 2 2 2 2 2 2 1 2 1 1 1 1 1
 1 2 2 1 2 1 2 1 1 2 2 2 2 1 2 1 1 1 2 2 2 1 1 2 1 2 2 2 2 1 2 1 1 1 2 1 2
 1 1 2 2 2 1 1 2 2 1 1 2 1 2 1 2 2 2 2 1 2 2 1 1 1 1 1 2 1 2 1 2 1 1 2 2 1
 1 1 2 1 2 2 2 2 1 2 1 1 2 2 2 1 2 1 2 1 1 1 2 1 1 1 1 2 2 2 2 2 1 2 1 1 1
 1 2 1 2 1 2 1 1 1 1 2 1 1 2 2 2 2 2 2 1 2 2 1 2 1 1 1 2 2 2 1 1 2 2 2 2 2
 1 1 1 2 1 1 2 1 1 1 1 1 1 1 2 1 2 1 1 1 1 2 2 1 1 1 2 1 1 1 2 1 1 2 1 2 1
 1 1 2 1 1 1 1 2 1 2 1 1 2 2 2 1 1 1 1 1 1 1 1 1 2 1 1 1 1 2 1 1 1 2 2 1 1
 2 2 1 1 1 1 1 1 2 2 1 2 2 1 1 2 2 1 2 1 2 1 2 1 2 2 2 2 1 1 1 1 1 1 1 2 2
 1 2 2 1 2 2 1 2 2 1 2 1 1 2 2 2 2 1 2 2 2 2 1 2 1 1 1 1 1 1 1 1 1 2 1 2 1
 2 1 1 1 1 1 1 2 1 2 2 1 2 1 1 1 2 2 2 1 1 2 1 1 1 1 2 2 2 1 1 2 2 2 2 1 2
 2 2 1 2 2 2 1 1 1 1 1 1 2 1 2 1 1 2 1 1 1 1 1 1 1 2 1 2 2 2 2 2 2 1 1 2 2
 2 1 1 1 1 1 1 2 1 1 1 1 1 2 2 1 1 1 1 2 2 2 1 2 2 1 1 2 2 1 1 1 1 1 2 1 2
 1 1 2 2 1 1 1 2 1 2 2 2 1 1 1 1 2 1 2 2 2 2 1 1 2 2 2 2 2 1 1 1 1 1 2 1 1
 2 1 1 1 1 1 1 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 1 1 1 1 1 1 1 2 2 2 1 1 2 1 2
 2 1 2 1 2 1 2 2 1 2 1 2 2 1 2 2 2 1 2 1 1 1 1 1 2 2 2 2 1 1 2 2 2 1 2 1 1
 2 1 1 1 2 1 2 1 2 2 2 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 2 1 1 1 1 2 1 2 2 1
 1 1 1 1 2 2 1 2 1 1 1 2 2 1 2 2 1 1 1 1 1 1 2 1 1 2 2 2 1 2 1 1 1 2 2 1 1
 1 1 1 2 2 1 2 1 2 2 1 1 1 1 1 1 1 2 1 1 2 2 1 2 2 1 1 2 2 1 1 1 2 1 2 2 1
 1 1 1 2 2 2 1 1 2 1 1 2 2 1 1 1 2 1 2 1 1 1 1 1 2 2 2 1 2 2 1 1 1 2 2 2 1
 2 1 1 1 2 2 1 2 2 1 1 2 2 1 2 1 2 1 2 1 1 1 1 1 1 1 2 1 1 1 1 2 1 2 1 1 2
 1 2 1 1 1 2 1 1 1 2 2 2 2 2 2 2 2 2 1 2 1 2 1 2 1 2 1 2 1 1 1 1 2 2 1 2 2
 1 1 1 2 1 1 1 1 2 1 2 1 2 1 2 2 2 1 2 1 2 1 1 1 2 2 1 1 2 1 1 1 2 1 1 2 2
 1 2 1 2 1 2 2 2 1 1 1 1 2 2 1 1 1 2 2 1 2 1 2 1 2 1 2 1 1 1 1 1 2 1 1 1 2
 1 2 1 1 1 2 2 1 1 1 1 2 1 1 2 1 1 1 1 1 2 1 2 2 2 1 1 2 1 2 2 1 1 2 2 1 1
 1 1 1 1 2 2 2 1 2 1 2 2 2 1 2 1 2 1 2 2 1 1 2 2 2 2 1 2 2 2 1 2 2 1 1 1 2
 2 2 2 2 1 1 2 2 1 1 2 2 1 1 1 2 2 1 2 1 1 1 1 1 1 1 1 1 2 1 2 1 1 2 1 1 2
 1 1 2 1 1 2 1 2 1 2 1 1 1 2 1 2 2 1 1 1 1 2 1 2 1 2 1 2 1 1 1 1 1 1 1 2 2
 2 2 1 2 2 1 2 1 2 2 2 2 2 1 1 1 1 2 2 1 1 2 2 1 1 2 1 2 1 1 2 1 2 1 2 2 1
 2 2 2 2 2 2 2 1 2 1 1 2 2 2 2 2 1 2 1 2 2 1 2 1 2 1 1 1 1 2 1 2 2 1 2 2 1
 1 2 2 1 1 1 1 1 2 1 1 2 2 2 2 1 1 2 2 2 2 2 1 1 1 1 1 1 2 1 2 2 1 1 1 1 2
 2 2 2 1 2 1 2 1 1 2 2 1 1 1 2 1 1 1 1 2 2 1 1 2 2 2 1 2 1 2 1 2 2 1 1 1 2
 2 1 1 2 2 2 1 2 1 2 1 1 1 1 2 1 1 2 2 2 2 2 1 1 1 2 2 1 1 1 1 1 2 2 1 1 1
 2 1 1 2 2 2 1 1 1 1 1 1 1 1 2 2 1 2 1 2 1 2 2 1 2 2 2 1 1 2 2 1 2 1 1 1 1
 2 1 1 1 1 1 2 1 1 2 2 1 2 1 1 1 1 2 1 1 1 1 1 2 2 1 1 1 2 2 2 2 1 1 1 2 2
 2 2 1 2 1 2 1 1 2 1 2 1 1 1 2 2 2 1 1 2 2 1 1 2 2 2 1 1 1 1 2 2 1 1 1 2 1
 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 2 2 1 1 2 2 2 2 1 1 2 2 2 1 2 1 2 2 2 2 2 2
 2 1 2 1 1 1 2 2 1 1 1 1 1 2 2 1 1 1 1 1 2 1 2 1 2 2 2 1 2 1 1 1 2 1 2 1 2
 1 1 2 1 2 1 1 2 1 1 2 2 1 1 2 1 2 2 2 2 2 2 2 1 1 1 2 2 2 2 1 2 1 1 1 1 1
 2 2 1 2 1 1 1 2 1 2 2 1 1 1 2 1 1 2 1 1 1 2 1 2 2 2 1 2 1 1 2 2 2 1 1 1 1
 2 1 2 1 2 2 2 1 1 1 1 1 2 1 2 2 1 2 2 2 2 1 1 2 1 2 1 1 2 2 1 2 1 1 1 2 1
 1 1 2 2 1 1 1 2 1 1 2 1 2 1 1 2 2 2 1 2 2 2 2 1 1 2 1 2 1 2 1 2 1 2 2 2 2
 2 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 1 2 2 1 2 1 2 1 1 1 2 2 2 1 1 2 1 1 1 2 1
 1 2 2 2 1 1 2 1 1 1 1 2 2 1 1 2 1 1 1 1 1 1 2 1 1 2 2 1 2 2 1 1 1 1 1 2 2
 2 1 1 2 1 1 2 1 1 1 1 1 2 1 2 1 1 2 1 1 1 1 2 1 1 1 1 2 1 2 1 2 1 1 2 1 1
 2 2 1 1 2 2 2 2 2 1 1 2 2 2 2 1 2 2 2 1 2 1 1 2 2 2 1 2 2 1 2 2 2 1 2 2 2
 2 2 1 1 2 2 1 1 1 1 2 1 2 1 1 2 1 2 2 1 2 2 1 2 1 2 1 2 1 2 1 1 1 2 1 1 1
 1 1 1 2 1 1 1 2 1 1 1 2 2 1 1 1 1 1 1 2 1 1 2 1 2 1 1 1 1 1 1 2 1 1 1 1 2
 1 1 1 1 2 1 2 2 2 2 2 1 1 1 1 2 1 1 1 2 2 1 2 2 1 2 2 2 2 2 2 1 1 2 1 2 2
 1 1 1 1 1 1 1 1 2 1 2 1 2 1 1 1 2 1 2 2 1 2 2 1 1 1 1 1 2 1 2 1 1 1 1 1 1
 2 2 1 2 1 1 1 1 1 2 2 1 1 1 1 1 1 1 2 2 1 2 1 1 1 1 1 1 1 2 1 1 2 2 1 2 1
 2 1 1 1 1 1 2 1 1 1 2 1 1 1 2 1 1 2 1 1 2 1 2 1 2 1 1 1 2 2 2 1 2 1 1 1 2
 2 2 2 1 1 1 1 2 1 1 1 2 1 1 1 1 2 2 2 2 2 2 1 2 2 1 2 1 1 1 1 1 1 2 2 2 1
 1 1 1 2 2 1 2 2 2 2 2 2 2 2 1 2 2 2 2 2 1 1 2 2 2 2 1 1 2 1 2 2 1 2 1 1 1
 2 1 1 2 2 1 2 2 1 1 1 2 2 1 1 1 2 2 1 1 2 1 1 2 1 2 1 1 2 1 1 1 1 2 1 1 2
 2 2 2 1 1 1 2 1 2 2 1 2 2 2 1 1 1 1 2 2 1 2 1 2 1 2 2 2 2 1 2 2 2 1 2 2 2
 1 1 1 2 1 1 1 1 1 2 2 2 2 2 1 1 1 1 1 1 2 1 2 1 2 1 2 1 1 2 2 2 1 2 2 2 1
 2 2 1 2 2 1 2 1 1 1 1 1 2 1 1 2 2 2 1 1 2 2 2 1 2 1 1 1 2 1 1 1 1 2 1 1 1
 1 1 2 2 1 1 2 2 2 1 1 2 1 2 2 2 1 1 1 1 2 1 1 2 1 2 2 2 1 2 2 1 1 1 2 1 1
 2 1 2 2 2 2 2 2 1 1 1 1 1 1 1 1 2 1 1 1 2 1 2 1 2 2 2 1 1 2 1 2 2 1 1 1 2
 1 1 1 1 1 1 2 2 2 2 1 2 1 2 1 1 2 1 1 1 2 2 2 1 1 1 1 2 1 1 1 1 2 2 1 1 1
 2 1 2 1 1 2 2 1 1 1 1 2 2 1 1 2 1 2 1 2 1 1 1 2 1 1 2 2 2 1 2 1 2 2 2 1 1
 2 1 2 1 1 1 2 1 2 1 2 1 1 1 2 2 2 2 1 2 1 1 2 1 2 1 1 1 1 1 1 2 1 2 2 2 1
 1 2 2 2 2 1 1 1 2 1 2 1 2 2 1 1 2 2 2 2 2 1 1 1 2 2 1 2 1 2 1 1 1 1 1 1 1
 1 2 1 2 1 1 2 1 1 1 2 2 1 1 1 1 1 2 2 1 2 1 2 2 2 2 2 1 2 1 2 2 2 1 2 1 1
 1 1 1 1 1 2 2 1 1 1 1 1 1 2 2 1 2 1 2 2 2 1 1 2 1 2 2 2 2 1 2 2 1 1 1 2 1
 1 1 2 1 2 2 1 2 1 2 1 1 1 1 1 2 2 1 2 1 2 1 2 2 2 2 2 1 1 2 1 1 2 2 2 1 1
 1 1 1 1 2 2 2 2 2 1 2 1 1 2 1 1 2 2 2 1 2 2 2 2 1 1 1 2 1 2 1 2 1 2 1 2 2
 1 1 1 2 1 1 1 1 1 1 1 2 2 2 2 1 1 2 2 1 2 1 1 1 2 2 2 2 1 2 1 2 1 2 2 1 1
 2 1 1 1 1 1 2 2 2 1 1 1 1 2 1 2 1 1 1 1 1 2 1 1 1 2 1 1 1 1 2 1 1 1 1 2 2
 2 2 1 1 1 1 2 2 1 2 1 1 2 2 2 1 2 2 1 1 2 1 1 1 1 2 1 2 2 2 2 2 1 1 2 2 1
 1 1 2 2 2 2 2 1 2 2 1 2 1 1 1 2 2 1 1 2 2 2 1 1 2 1 1 1 2 2 1 1 2 2 1 2 1
 2 1 2 1 2 1 2 1 1 1 1 1 1 1 2 2 1 2 1 1 1 2 2 1 2 2 1 1 2 1 1 2 2 1 1 2 1
 1 1 1 1 2 1 1 2 2 2 2 2 1 2 2 2 1 2 1 2 1 1 1 1 1 1 2 1 1 2 1 1 2 2 2 1 1
 1 2 2 2 1 2 2 2 2 2 2 2 2 1 2 1 1 2 1 1 2 2 2 2 1 1 2 1 1 1 2 2 1 1 1 2 1
 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2 1 2 1 2 2 2 1 2 1 2 1 1 2 2 1 1 2 1 1 2 1 2
 2 2 1 2 1 1 1 2 1 2 1 2 2 1 1 1 1 2 1 2 1 1 2 2 1 2 1 2 1 1 2 2 1 2 1 1 2
 1 1 2 1 1 2 1 1 1 1 2 2 1 2 2 1 2 2 1 1 2 2 1 1 1 2 1 1 1 2 2 2 1 2 1 1 1
 2 1 2 1 2 1 1 2 1 1 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 2 1 1 2 1 2 1 2 2 2 1
 1 1 2 2 1 2 2 2 2 1 2 2 2 1 2 2 1 2 2 2 1 1 1 2 1 1 1 1 1 2 1 2 1 1 2 1 2
 1 1 1 1 2 2 1 1 2 1 1 1 1 1 2 2 1 1 1 1 1 1 2 1 2 1 2 1 1 2 2 2 2 1 2 1 2
 2 1 2 2 2 1 1 2 1 1 1 2 1 1 2 2 2 2 1 2 1 1 2 2 2 2 2 1 2 2 1 2 1 2 2 1 2
 1 1 2 1 1 1 1 1 2 1 2 1 1 1 1 2 1 2 1 1 1 1 1 1 2 2 2 1 1 1 1 2 2 2 1 2 2
 1 2 2 2 2 1 1 2 1 2 1 1 1 1 1 2 1 1 1 1 1 1 1 2 2 2 1 1 2 1 1 2 2 1 2 1 2
 2 1 2 2 1 2 2 1 2 1 1 1 1 1 2 1 1 1 1 1 2 2 1 1 1 2 2 2 1 1 1 2 1 2 1 1 2
 1 2 1 2 2 1 1 1 2 1 2 1 1 2 2 2 2 1 2 1 1 1 2 1 2 1 2 2 1 1 1 2 2 1 2 1 2
 1 2 1 2 1 2 2 2 1 2 2 1 2 1 2 2 1 1 2 2 2 1 2 1 1 2 2 1 1 2 1 1 1 1 2 1 1
 1 2 1 1 1 1 2 1 1 2 2 2 1 1 1 1 2 1 1 2 2 1 1 2 2 2 2 1 1 1 2 2 1 1 2 1 2
 1 1 1 1 1 1 1 1 1 2 2 1 1 2 1 2 2 2 1 1 1 1 1 1 2 1 1 2 2 2 2 1 2 1 1 1 1
 2 1 2 2 1 1 2 1 2 1 2 2 2 1 1 2 1 2 2 1 1 2 1 1 1 1 1 1 2 1 1 1 1 2 2 2 2
 1 1 1 2 2 1 2 1 1 1 1 1 2 2 2 1 2 2 2 2 2 1 2 2 1 2 1 1 1 1 1 2 1 2 2 2 1
 1 2 1 2 1 2 2 2 2 2 1 2 1 2 2 1 1 1 2 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 2 2 2
 2 1 1 1 2 1 1 1 2 2 1 2 1 1 2 1 2 2 2 2 1 1 1 1 2 1 1 1 1 2 2 2 1 1 1 1 1
 2 1 2 2 2 1 2 1 1 1 2 1 1 2 1 1 1 1 1 1 1 2 1 1 2 1 1 1 2 2 2 2 2 2 1 2 2
 2 2 1 2 2 2 1 1 1 1 2 1 2 1 2 1 1 2 1 2 2 2 2 2 2 1 1 1 1 2 2 1 1 2 1 1 1
 2 1 1 1 2 1 2 1 2 2 1 2 1 2 1 2 1 2 1 2 2 2 2 1 1 1 2 2 1 1 1 2 1 1 1 2 2
 1 2 1 2 1 2 1 2 1 1 2 1 2 2 2 2 1 1 2 1 2 1 1 2 1 2 2 1 1 2 1 2 2 1 1 1 1
 2 2 1 1 1 1 2 1 2 2 2 1 1 1 2 1 2 1 2 2 1 2 2 1 1 2 1 2 2 1 1 1 2 2 1 1 2
 1 1 1 2 2 2 1 2 2 1 1 2 1 1 1 1 1 2 2 2 1 1 2 1 1 1 2 1 1 2 1 2 2 1 2 1 1
 2 2 1 1 2 1 1 1 1 2 1 2 1 2 1 1 2 1 2 2]
In [ ]:
# HYPER PARAMETERS FOR THE DESIGN SEARCH SPACE
num_options = 3 # has to be atleast 1
multiplier_array, options_available = create_rankings(num_options)
print('Rankings created!')
lower_bound = 1

varbound = np.array([[lower_bound,num_options]]*3868)

algorithm_param = {'max_num_iteration': 25, 'population_size': 100,\
                   'mutation_probability':0.1,'elit_ratio': 0.01,\
                   'crossover_probability': 0.5, 'parents_portion': 0.3,\
                   'crossover_type':'uniform', 'max_iteration_without_improv': 5}

model = ga(function=objective, dimension=3868, variable_type='int', variable_boundaries=varbound, algorithm_parameters = algorithm_param)

# run the GA algorithm
start = time.time()
model.run()
end = time.time()

print('Optimum Found!')
schedule, population = evaluator((model.output_dict['variable']).astype(int))
print('Total time taken to evaluate designs:', end - start)
print('Percentage of cities pictured for the optimal design:', np.count_nonzero(schedule)*100/3868,'%')
print('Percentage population covered for the optimal design: ', np.sum(population)*100/np.sum(unique_targets[1,:]),'%')
final_design_run5 = (model.output_dict['variable']).astype(int)
Rankings created!
 The best solution found:
 [2. 3. 2. 3. 1. 1. 1. 3. 3. 2. 1. 1. 1. 2. 2. 1. 1. 1. 1. 3. 2. 3. 3. 1.
 3. 1. 2. 3. 2. 1. 1. 2. 3. 1. 1. 1. 2. 3. 1. 2. 1. 1. 1. 1. 2. 1. 2. 2.
 3. 2. 3. 3. 3. 2. 3. 1. 2. 1. 1. 1. 2. 1. 1. 1. 2. 2. 3. 2. 2. 3. 1. 1.
 3. 2. 1. 1. 1. 2. 3. 1. 2. 1. 2. 2. 3. 3. 1. 1. 3. 3. 3. 1. 1. 1. 1. 2.
 1. 3. 2. 3. 1. 1. 2. 2. 2. 1. 1. 2. 1. 1. 1. 1. 2. 1. 3. 2. 2. 2. 2. 1.
 3. 3. 2. 2. 2. 2. 1. 3. 1. 3. 1. 2. 1. 1. 2. 2. 1. 1. 2. 2. 2. 3. 3. 2.
 1. 2. 1. 2. 2. 3. 3. 1. 3. 3. 3. 2. 2. 2. 3. 2. 2. 3. 2. 1. 2. 2. 2. 3.
 1. 2. 1. 3. 3. 2. 2. 3. 1. 2. 2. 3. 2. 2. 3. 3. 1. 1. 2. 3. 1. 3. 2. 1.
 1. 3. 3. 2. 3. 3. 2. 2. 2. 1. 2. 1. 2. 3. 2. 3. 3. 2. 2. 1. 1. 1. 1. 1.
 1. 1. 2. 3. 2. 3. 2. 1. 3. 3. 1. 3. 1. 2. 2. 1. 3. 3. 1. 3. 3. 3. 1. 2.
 3. 2. 1. 2. 2. 3. 3. 2. 1. 3. 1. 3. 2. 3. 1. 1. 1. 1. 1. 3. 2. 1. 1. 3.
 1. 1. 3. 1. 1. 3. 1. 2. 2. 2. 3. 1. 2. 3. 2. 2. 1. 3. 2. 1. 3. 3. 2. 1.
 3. 3. 3. 2. 2. 1. 2. 2. 3. 1. 2. 1. 2. 3. 3. 3. 1. 2. 1. 1. 1. 2. 3. 3.
 2. 3. 1. 1. 2. 2. 2. 1. 2. 3. 2. 1. 2. 1. 1. 1. 2. 3. 1. 1. 3. 3. 2. 1.
 3. 1. 2. 1. 1. 2. 1. 3. 3. 1. 2. 3. 2. 1. 2. 2. 1. 3. 2. 1. 2. 1. 2. 3.
 1. 1. 3. 3. 2. 1. 2. 1. 1. 1. 1. 2. 3. 3. 3. 1. 2. 3. 2. 3. 1. 1. 1. 1.
 3. 3. 2. 1. 1. 2. 1. 1. 1. 1. 1. 2. 2. 1. 2. 3. 2. 3. 3. 3. 2. 1. 3. 2.
 1. 1. 3. 3. 2. 3. 2. 2. 1. 1. 1. 1. 2. 2. 2. 1. 3. 1. 3. 1. 3. 3. 1. 2.
 1. 2. 2. 3. 2. 2. 2. 3. 2. 2. 1. 1. 2. 2. 2. 2. 3. 3. 3. 1. 1. 3. 2. 1.
 3. 3. 2. 1. 3. 2. 1. 2. 1. 3. 1. 3. 1. 3. 2. 3. 3. 3. 3. 3. 3. 3. 2. 1.
 2. 3. 1. 1. 1. 3. 1. 3. 1. 2. 2. 1. 2. 1. 3. 2. 3. 2. 1. 3. 2. 2. 1. 3.
 1. 1. 1. 3. 3. 2. 2. 3. 2. 3. 1. 2. 2. 3. 3. 2. 1. 1. 2. 2. 2. 3. 1. 1.
 3. 1. 2. 1. 2. 3. 1. 1. 2. 1. 1. 1. 3. 1. 2. 2. 2. 3. 2. 1. 1. 3. 1. 3.
 3. 2. 2. 2. 2. 3. 2. 2. 3. 3. 2. 1. 1. 1. 1. 2. 1. 2. 3. 2. 1. 2. 3. 2.
 3. 2. 2. 2. 1. 3. 3. 3. 2. 3. 3. 1. 3. 2. 3. 3. 1. 2. 1. 1. 1. 2. 2. 2.
 3. 3. 2. 1. 2. 2. 3. 2. 1. 2. 2. 3. 1. 2. 2. 2. 2. 2. 3. 2. 1. 2. 2. 2.
 1. 1. 2. 1. 2. 2. 3. 1. 2. 3. 2. 3. 2. 2. 3. 2. 1. 1. 1. 2. 3. 1. 2. 2.
 3. 1. 2. 1. 2. 2. 1. 1. 3. 3. 2. 2. 1. 2. 1. 2. 3. 2. 2. 1. 3. 3. 3. 3.
 2. 1. 2. 1. 2. 1. 2. 2. 2. 1. 1. 2. 2. 2. 2. 2. 2. 3. 1. 1. 2. 2. 1. 1.
 1. 2. 2. 1. 1. 2. 1. 1. 3. 3. 2. 3. 3. 2. 2. 2. 2. 1. 2. 1. 1. 1. 1. 2.
 2. 3. 1. 2. 1. 3. 2. 1. 1. 1. 2. 2. 3. 1. 3. 1. 1. 2. 3. 1. 1. 2. 2. 3.
 2. 2. 2. 3. 3. 2. 3. 1. 3. 2. 2. 1. 2. 3. 1. 1. 3. 3. 1. 1. 2. 2. 2. 2.
 2. 2. 2. 1. 1. 2. 3. 2. 1. 2. 1. 1. 2. 1. 3. 1. 3. 1. 2. 3. 2. 2. 1. 3.
 1. 3. 2. 1. 1. 3. 1. 2. 2. 2. 1. 1. 2. 2. 1. 1. 1. 3. 3. 3. 1. 1. 2. 1.
 2. 2. 2. 3. 2. 1. 1. 1. 1. 2. 2. 2. 1. 1. 3. 2. 1. 2. 1. 1. 3. 2. 3. 3.
 2. 1. 1. 1. 2. 1. 3. 3. 3. 1. 3. 3. 3. 1. 3. 2. 1. 1. 2. 3. 3. 2. 3. 2.
 1. 2. 1. 2. 1. 2. 2. 2. 3. 2. 1. 1. 1. 1. 3. 2. 3. 2. 1. 3. 2. 2. 1. 1.
 3. 1. 1. 2. 1. 3. 3. 2. 1. 3. 2. 1. 1. 1. 3. 3. 2. 2. 2. 2. 2. 1. 3. 1.
 1. 1. 3. 1. 2. 1. 3. 2. 1. 1. 1. 1. 1. 2. 1. 3. 1. 3. 2. 2. 1. 1. 3. 2.
 3. 2. 3. 2. 2. 3. 1. 3. 2. 2. 3. 2. 1. 3. 2. 3. 2. 1. 1. 3. 1. 2. 1. 1.
 2. 1. 1. 1. 2. 3. 2. 1. 3. 2. 1. 1. 1. 1. 1. 2. 1. 1. 3. 2. 1. 3. 2. 2.
 3. 1. 3. 1. 2. 1. 2. 2. 2. 3. 2. 2. 2. 2. 1. 1. 2. 2. 1. 2. 1. 3. 3. 2.
 1. 2. 1. 3. 2. 1. 2. 3. 1. 1. 2. 1. 1. 2. 1. 2. 2. 1. 1. 1. 1. 3. 1. 1.
 1. 3. 2. 3. 2. 2. 3. 1. 1. 2. 2. 1. 3. 2. 1. 3. 2. 1. 2. 2. 1. 1. 1. 2.
 1. 1. 3. 1. 1. 1. 1. 2. 3. 2. 1. 3. 3. 1. 2. 2. 2. 3. 2. 3. 2. 1. 3. 1.
 3. 2. 1. 2. 2. 2. 1. 3. 3. 2. 2. 1. 2. 2. 3. 3. 2. 1. 2. 1. 1. 3. 1. 2.
 2. 1. 1. 3. 2. 2. 3. 3. 3. 3. 3. 1. 1. 1. 1. 3. 3. 3. 2. 2. 1. 2. 1. 3.
 1. 1. 3. 1. 3. 2. 2. 2. 3. 2. 3. 3. 2. 1. 3. 3. 2. 1. 2. 2. 2. 1. 3. 3.
 1. 3. 1. 3. 2. 2. 3. 2. 3. 3. 1. 1. 1. 2. 3. 2. 2. 2. 1. 1. 2. 3. 3. 2.
 2. 1. 1. 2. 1. 1. 3. 3. 1. 1. 2. 1. 3. 1. 3. 1. 2. 2. 3. 3. 1. 1. 3. 2.
 3. 1. 1. 1. 2. 2. 1. 3. 2. 1. 2. 1. 1. 2. 3. 2. 3. 2. 2. 1. 2. 2. 2. 1.
 1. 2. 2. 2. 3. 2. 2. 2. 2. 1. 3. 2. 1. 2. 1. 2. 2. 1. 1. 3. 2. 1. 3. 3.
 2. 2. 3. 3. 3. 1. 3. 2. 1. 1. 2. 3. 1. 1. 3. 2. 3. 1. 2. 3. 1. 2. 2. 2.
 1. 3. 2. 3. 3. 1. 3. 3. 3. 2. 2. 3. 3. 3. 1. 1. 2. 1. 2. 2. 2. 2. 1. 1.
 3. 2. 3. 2. 3. 2. 2. 2. 2. 3. 1. 3. 1. 2. 3. 2. 2. 2. 3. 3. 3. 2. 2. 1.
 2. 1. 1. 1. 1. 1. 3. 2. 2. 2. 2. 2. 3. 2. 1. 2. 2. 1. 3. 3. 1. 1. 1. 1.
 1. 2. 3. 1. 1. 1. 1. 3. 3. 2. 2. 1. 1. 1. 3. 2. 1. 1. 3. 2. 2. 2. 1. 2.
 3. 3. 2. 2. 1. 1. 2. 2. 2. 1. 1. 3. 1. 1. 3. 3. 1. 3. 1. 1. 1. 1. 3. 2.
 1. 3. 3. 3. 1. 3. 2. 1. 2. 2. 3. 3. 2. 1. 1. 1. 1. 2. 1. 2. 2. 2. 2. 2.
 1. 1. 1. 3. 2. 2. 1. 1. 1. 1. 2. 2. 2. 1. 3. 2. 3. 1. 2. 2. 3. 1. 1. 1.
 2. 1. 2. 2. 1. 1. 1. 3. 2. 1. 2. 2. 2. 1. 1. 2. 1. 2. 1. 1. 1. 3. 1. 1.
 2. 1. 1. 3. 1. 3. 2. 2. 1. 2. 3. 1. 3. 3. 2. 2. 3. 3. 1. 1. 2. 2. 1. 1.
 2. 3. 2. 1. 2. 2. 2. 1. 2. 2. 3. 1. 2. 1. 1. 1. 2. 2. 1. 3. 2. 3. 1. 3.
 3. 2. 3. 2. 3. 2. 1. 1. 2. 1. 2. 1. 3. 3. 2. 1. 2. 1. 2. 3. 1. 3. 2. 2.
 1. 1. 2. 2. 1. 2. 2. 2. 2. 2. 3. 3. 2. 1. 3. 2. 2. 2. 3. 3. 1. 3. 2. 1.
 1. 3. 1. 1. 1. 2. 2. 1. 1. 1. 2. 3. 2. 2. 1. 3. 3. 1. 2. 3. 3. 2. 1. 2.
 2. 3. 2. 2. 1. 3. 1. 1. 3. 1. 2. 1. 3. 3. 1. 2. 2. 2. 2. 1. 1. 2. 3. 2.
 1. 1. 1. 3. 1. 2. 1. 2. 1. 2. 3. 1. 2. 3. 2. 1. 1. 3. 1. 1. 2. 1. 2. 3.
 3. 2. 1. 1. 2. 3. 3. 3. 1. 3. 1. 2. 1. 2. 2. 3. 1. 1. 3. 2. 1. 1. 3. 1.
 2. 3. 2. 3. 3. 1. 3. 1. 2. 3. 3. 3. 1. 3. 3. 3. 2. 2. 2. 2. 2. 3. 2. 1.
 3. 3. 3. 2. 1. 1. 2. 1. 1. 1. 1. 2. 3. 1. 1. 2. 3. 2. 1. 3. 3. 3. 1. 3.
 1. 2. 3. 2. 2. 1. 3. 2. 3. 1. 2. 1. 2. 3. 2. 2. 3. 3. 1. 2. 1. 3. 1. 3.
 3. 2. 2. 1. 2. 1. 3. 3. 2. 1. 2. 1. 1. 3. 1. 1. 2. 3. 1. 1. 3. 2. 3. 3.
 2. 3. 2. 2. 3. 1. 3. 3. 1. 3. 2. 2. 3. 1. 1. 2. 1. 2. 1. 2. 1. 3. 2. 1.
 3. 3. 1. 1. 2. 1. 2. 3. 1. 1. 3. 3. 2. 2. 2. 1. 3. 2. 1. 2. 1. 2. 3. 2.
 1. 2. 2. 1. 2. 3. 2. 1. 3. 1. 2. 1. 3. 2. 3. 1. 2. 2. 1. 3. 1. 1. 1. 2.
 2. 2. 3. 2. 1. 1. 2. 2. 1. 1. 2. 1. 2. 2. 1. 2. 3. 2. 2. 1. 1. 2. 2. 1.
 1. 1. 1. 1. 2. 2. 1. 3. 2. 2. 2. 2. 3. 1. 2. 3. 2. 1. 3. 1. 1. 2. 3. 3.
 2. 3. 2. 2. 3. 1. 3. 2. 3. 1. 1. 1. 2. 2. 3. 3. 2. 1. 3. 2. 1. 1. 2. 2.
 2. 3. 2. 2. 3. 3. 3. 2. 3. 2. 3. 3. 1. 2. 3. 1. 3. 2. 1. 2. 1. 1. 3. 3.
 2. 2. 1. 1. 1. 3. 1. 1. 2. 1. 2. 3. 3. 2. 1. 1. 1. 1. 2. 2. 1. 3. 2. 1.
 1. 2. 3. 3. 2. 2. 3. 2. 3. 1. 1. 3. 1. 3. 2. 3. 2. 2. 3. 2. 3. 1. 1. 1.
 1. 2. 2. 3. 1. 2. 2. 1. 3. 2. 2. 3. 1. 3. 3. 1. 2. 1. 2. 1. 2. 3. 1. 1.
 3. 3. 3. 2. 2. 1. 2. 2. 1. 1. 2. 2. 3. 3. 3. 1. 1. 1. 1. 3. 2. 3. 1. 2.
 1. 2. 1. 3. 2. 3. 2. 2. 2. 1. 1. 1. 3. 2. 2. 2. 3. 3. 2. 1. 2. 2. 2. 1.
 1. 3. 3. 2. 2. 1. 2. 2. 3. 1. 3. 2. 3. 1. 1. 2. 3. 2. 1. 2. 1. 1. 1. 3.
 2. 2. 1. 3. 3. 2. 2. 1. 2. 1. 2. 1. 1. 1. 2. 2. 2. 3. 1. 1. 1. 2. 2. 2.
 3. 3. 2. 2. 2. 3. 3. 3. 1. 1. 1. 3. 3. 2. 2. 3. 1. 2. 3. 1. 2. 3. 3. 1.
 1. 1. 2. 1. 3. 2. 3. 2. 3. 1. 2. 2. 2. 2. 2. 1. 1. 3. 3. 3. 3. 2. 3. 1.
 2. 2. 1. 2. 2. 2. 1. 2. 2. 2. 1. 1. 1. 1. 3. 2. 2. 2. 2. 3. 1. 1. 3. 2.
 3. 1. 3. 2. 2. 2. 1. 2. 2. 1. 2. 3. 2. 2. 1. 2. 1. 3. 2. 3. 1. 3. 1. 2.
 2. 1. 2. 2. 1. 2. 2. 2. 2. 2. 2. 2. 1. 2. 1. 2. 2. 1. 2. 3. 2. 1. 3. 2.
 2. 2. 3. 3. 1. 1. 1. 3. 2. 1. 2. 3. 3. 3. 1. 2. 1. 3. 1. 2. 1. 1. 3. 1.
 2. 2. 1. 2. 3. 1. 1. 1. 1. 3. 3. 3. 1. 2. 3. 2. 2. 3. 2. 3. 2. 3. 2. 3.
 1. 3. 2. 2. 1. 1. 2. 1. 3. 1. 1. 1. 2. 2. 2. 2. 2. 1. 3. 2. 1. 1. 2. 2.
 1. 2. 2. 2. 1. 3. 3. 2. 3. 1. 1. 1. 1. 3. 3. 2. 3. 2. 1. 2. 1. 2. 1. 3.
 1. 1. 3. 3. 3. 2. 1. 1. 3. 3. 1. 2. 3. 1. 3. 1. 3. 3. 3. 1. 2. 1. 1. 2.
 2. 2. 3. 2. 1. 2. 2. 1. 2. 1. 2. 2. 1. 3. 1. 2. 2. 3. 2. 3. 3. 1. 2. 1.
 2. 2. 1. 1. 3. 1. 2. 1. 1. 3. 1. 1. 1. 3. 3. 1. 1. 2. 1. 3. 3. 1. 1. 3.
 2. 2. 2. 1. 3. 3. 3. 1. 1. 3. 3. 1. 3. 2. 1. 3. 2. 3. 1. 3. 1. 1. 3. 1.
 2. 3. 2. 3. 1. 3. 2. 3. 1. 1. 3. 2. 2. 1. 2. 3. 1. 2. 3. 1. 2. 1. 1. 3.
 3. 1. 1. 3. 1. 2. 2. 3. 3. 1. 2. 1. 2. 3. 3. 1. 3. 1. 2. 1. 3. 3. 3. 2.
 2. 1. 3. 2. 1. 1. 1. 2. 1. 1. 2. 3. 3. 3. 3. 2. 1. 3. 2. 2. 1. 3. 2. 1.
 1. 3. 2. 2. 1. 2. 1. 3. 1. 2. 1. 2. 3. 2. 1. 2. 3. 1. 2. 3. 3. 3. 1. 1.
 2. 1. 3. 3. 2. 3. 2. 1. 1. 3. 2. 2. 1. 1. 2. 3. 1. 2. 2. 2. 1. 2. 2. 3.
 2. 2. 2. 3. 3. 3. 2. 1. 1. 3. 1. 3. 1. 3. 2. 1. 2. 1. 3. 2. 1. 2. 1. 1.
 1. 2. 3. 1. 2. 3. 1. 1. 1. 1. 1. 1. 2. 3. 1. 2. 3. 3. 2. 3. 1. 1. 2. 3.
 3. 2. 3. 3. 1. 3. 2. 3. 1. 3. 1. 1. 2. 2. 3. 2. 2. 2. 3. 2. 3. 2. 3. 3.
 3. 3. 3. 1. 2. 2. 1. 3. 2. 1. 1. 1. 1. 2. 1. 3. 1. 2. 3. 2. 2. 2. 1. 1.
 2. 2. 3. 2. 3. 1. 3. 3. 3. 1. 1. 1. 3. 2. 2. 3. 2. 3. 3. 1. 1. 3. 1. 3.
 1. 2. 1. 2. 3. 3. 2. 3. 1. 2. 2. 2. 3. 2. 1. 2. 1. 3. 2. 2. 3. 2. 1. 1.
 3. 2. 1. 3. 1. 1. 1. 1. 1. 1. 1. 1. 1. 2. 2. 2. 3. 3. 1. 2. 2. 1. 1. 3.
 1. 1. 1. 1. 3. 3. 1. 2. 1. 3. 2. 1. 3. 3. 2. 2. 2. 3. 1. 1. 2. 1. 3. 2.
 1. 3. 2. 2. 3. 3. 2. 3. 3. 1. 3. 1. 3. 2. 1. 1. 1. 1. 2. 2. 1. 3. 2. 2.
 1. 2. 1. 1. 3. 1. 2. 3. 1. 1. 2. 1. 2. 3. 3. 2. 1. 2. 1. 3. 3. 2. 3. 2.
 1. 3. 3. 1. 3. 2. 1. 2. 3. 1. 1. 3. 3. 2. 2. 1. 3. 1. 3. 3. 3. 1. 2. 3.
 2. 1. 3. 3. 2. 1. 2. 2. 2. 3. 1. 3. 2. 3. 1. 1. 1. 3. 2. 2. 2. 2. 3. 2.
 1. 2. 2. 3. 2. 1. 3. 1. 1. 2. 3. 3. 3. 2. 2. 2. 1. 3. 2. 1. 1. 2. 3. 2.
 1. 3. 3. 2. 1. 3. 3. 2. 2. 1. 1. 3. 3. 2. 2. 2. 2. 3. 3. 2. 2. 1. 3. 2.
 1. 2. 1. 1. 2. 1. 1. 2. 2. 1. 2. 1. 1. 1. 1. 1. 1. 2. 2. 2. 2. 1. 2. 2.
 3. 1. 2. 1. 2. 1. 3. 1. 1. 1. 3. 2. 2. 1. 2. 2. 3. 3. 2. 1. 3. 1. 2. 2.
 1. 1. 2. 3. 2. 1. 1. 3. 1. 1. 1. 2. 3. 1. 1. 1. 3. 1. 2. 1. 3. 2. 3. 1.
 1. 1. 1. 1. 2. 2. 3. 1. 3. 2. 1. 2. 2. 1. 2. 2. 3. 3. 2. 1. 1. 1. 3. 1.
 2. 1. 3. 1. 1. 1. 3. 3. 2. 3. 1. 3. 2. 1. 3. 2. 3. 1. 1. 2. 1. 2. 2. 3.
 2. 2. 2. 2. 3. 1. 1. 3. 3. 3. 2. 3. 3. 2. 2. 1. 1. 2. 2. 2. 1. 1. 3. 2.
 3. 2. 2. 3. 1. 2. 3. 1. 1. 2. 2. 3. 3. 2. 2. 1. 3. 3. 3. 3. 3. 2. 2. 1.
 3. 3. 2. 3. 1. 3. 1. 1. 1. 2. 2. 2. 2. 1. 3. 2. 3. 2. 3. 2. 3. 3. 2. 1.
 1. 1. 2. 2. 1. 1. 2. 3. 2. 1. 3. 1. 2. 2. 2. 1. 3. 1. 3. 2. 2. 3. 1. 2.
 3. 2. 1. 3. 1. 1. 1. 3. 3. 1. 3. 1. 2. 3. 3. 2. 1. 3. 2. 2. 3. 2. 3. 1.
 3. 2. 1. 2. 3. 3. 3. 1. 2. 1. 2. 1. 3. 3. 1. 3. 3. 1. 3. 2. 1. 3. 1. 2.
 2. 2. 2. 1. 3. 1. 1. 3. 2. 3. 2. 1. 1. 2. 2. 3. 1. 3. 1. 1. 3. 1. 1. 2.
 1. 1. 2. 1. 2. 3. 2. 3. 1. 1. 1. 2. 1. 1. 2. 1. 2. 1. 1. 2. 1. 3. 3. 1.
 1. 1. 3. 2. 1. 3. 2. 2. 3. 1. 1. 2. 3. 1. 1. 1. 2. 1. 2. 1. 1. 3. 2. 1.
 1. 3. 3. 2. 2. 3. 3. 1. 3. 2. 1. 1. 3. 2. 2. 2. 2. 3. 3. 1. 1. 2. 1. 1.
 2. 2. 1. 3. 2. 3. 1. 1. 3. 1. 2. 1. 1. 1. 1. 1. 2. 1. 1. 3. 2. 1. 3. 1.
 2. 2. 1. 2. 3. 3. 2. 1. 2. 3. 1. 3. 1. 2. 3. 2. 1. 2. 1. 2. 2. 3. 3. 2.
 1. 2. 2. 3. 1. 3. 1. 2. 1. 2. 1. 2. 3. 2. 2. 2. 3. 3. 3. 2. 3. 2. 2. 3.
 3. 3. 3. 1. 1. 1. 2. 1. 2. 3. 1. 2. 3. 2. 1. 1. 3. 3. 1. 1. 1. 3. 3. 3.
 1. 3. 3. 1. 2. 3. 2. 1. 2. 1. 1. 1. 1. 2. 1. 3. 3. 2. 1. 3. 3. 3. 2. 1.
 3. 3. 1. 2. 2. 1. 2. 2. 2. 1. 1. 2. 1. 3. 2. 1. 1. 1. 2. 3. 1. 1. 2. 1.
 1. 3. 3. 2. 3. 2. 2. 1. 1. 3. 2. 3. 2. 2. 1. 2. 2. 3. 2. 2. 1. 1. 3. 2.
 1. 1. 3. 1. 2. 2. 1. 2. 3. 2. 2. 3. 3. 1. 1. 3. 3. 2. 3. 2. 2. 1. 2. 2.
 1. 3. 1. 2. 3. 1. 2. 2. 1. 2. 2. 1. 1. 1. 3. 1. 3. 3. 3. 2. 2. 1. 3. 3.
 1. 1. 2. 2. 1. 2. 2. 2. 1. 2. 1. 3. 2. 1. 1. 2. 1. 1. 1. 1. 2. 1. 3. 2.
 2. 3. 1. 2. 2. 3. 2. 2. 1. 3. 3. 1. 3. 1. 1. 1. 3. 2. 2. 2. 3. 2. 3. 2.
 1. 1. 2. 2. 2. 3. 3. 2. 3. 1. 3. 1. 2. 2. 3. 3. 3. 1. 2. 1. 1. 1. 2. 2.
 1. 2. 2. 3. 3. 2. 2. 2. 3. 1. 3. 2. 3. 3. 1. 2. 3. 1. 2. 2. 3. 3. 3. 1.
 2. 2. 2. 1. 2. 1. 1. 1. 2. 2. 3. 3. 3. 1. 2. 3. 2. 1. 2. 3. 2. 1. 1. 3.
 2. 1. 2. 2. 1. 3. 2. 1. 2. 3. 1. 1. 3. 2. 3. 1. 1. 2. 3. 3. 1. 3. 1. 2.
 2. 1. 3. 3. 3. 3. 1. 1. 2. 1. 1. 2. 1. 2. 1. 1. 3. 2. 2. 1. 2. 1. 1. 1.
 3. 3. 2. 2. 2. 3. 1. 1. 2. 1. 3. 3. 1. 3. 2. 1. 3. 1. 3. 3. 2. 3. 2. 2.
 1. 3. 2. 3. 3. 2. 3. 1. 2. 3. 1. 3. 3. 3. 3. 3. 2. 2. 3. 3. 2. 1. 1. 1.
 2. 3. 1. 1. 3. 3. 1. 2. 2. 3. 3. 1. 2. 2. 2. 1. 1. 1. 2. 1. 3. 1. 1. 2.
 1. 1. 3. 2. 3. 1. 1. 1. 1. 2. 2. 1. 2. 2. 2. 2. 2. 1. 1. 2. 2. 3. 3. 1.
 1. 2. 1. 2. 1. 1. 3. 3. 2. 2. 1. 3. 3. 2. 2. 1. 3. 2. 2. 3. 1. 1. 2. 2.
 1. 1. 2. 2. 3. 1. 2. 1. 1. 1. 2. 3. 1. 1. 1. 3. 2. 1. 2. 1. 2. 3. 1. 2.
 2. 3. 1. 3. 1. 1. 1. 1. 1. 2. 1. 1. 2. 2. 2. 2. 1. 2. 1. 2. 1. 3. 2. 3.
 3. 2. 1. 2. 1. 3. 1. 2. 2. 2. 3. 3. 1. 2. 3. 2. 2. 2. 3. 2. 1. 1. 2. 1.
 3. 2. 1. 2. 3. 2. 2. 1. 3. 2. 2. 1. 3. 1. 1. 3. 2. 3. 2. 1. 1. 1. 1. 2.
 1. 3. 2. 1. 1. 2. 2. 2. 1. 1. 3. 2. 3. 3. 1. 1. 3. 2. 1. 2. 2. 2. 2. 1.
 2. 1. 2. 1. 1. 2. 2. 3. 1. 2. 1. 2. 2. 2. 1. 3. 2. 2. 1. 3. 3. 2. 1. 1.
 1. 2. 3. 2.]

 Objective function:
 -54.664226611010946
Optimum Found!
Total time taken to evaluate designs: 3446.8688094615936
Percentage of cities pictured for the optimal design: 38.44364012409514 %
Percentage population covered for the optimal design:  54.664226611010946 %

Section 6 - Export Results

In [ ]:
import numpy as np
import sys

with open('/content/drive/My Drive/Planet/Optim/results.npy', 'wb') as f:
    np.save(f, final_design_run3)


with open('/content/drive/My Drive/Planet/Optim/results.npy', 'rb') as f:
    design3 = np.load(f)

np.set_printoptions(threshold=sys.maxsize)
print(design3)
[2 1 1 1 1 2 3 3 2 3 2 1 2 1 2 1 2 3 2 2 1 2 2 3 3 1 3 3 2 1 3 3 3 2 3 3 1
 3 1 2 1 2 3 1 3 2 1 1 3 2 1 1 2 2 1 2 2 3 2 2 3 3 1 1 3 3 3 2 1 2 2 1 3 2
 3 2 3 2 3 3 1 2 2 2 1 3 1 1 2 2 2 2 3 3 1 2 1 2 2 1 1 2 1 1 2 2 3 3 1 1 3
 2 2 1 1 1 1 1 1 2 3 3 2 1 3 1 1 2 3 2 3 3 2 1 1 1 2 1 3 3 2 3 2 3 1 3 3 3
 3 1 3 3 2 2 3 3 2 1 3 3 2 3 2 1 2 2 2 2 1 3 1 2 3 2 1 1 3 1 1 2 1 1 1 2 1
 3 1 3 3 1 2 2 1 3 1 3 3 2 3 3 3 1 1 1 3 2 3 1 1 2 1 3 2 1 2 1 2 1 1 3 1 1
 2 2 1 2 3 1 1 3 2 2 1 1 3 3 2 2 2 3 2 3 3 3 3 2 3 2 3 2 3 1 1 3 2 1 3 1 3
 2 2 3 2 2 3 2 1 2 1 3 1 1 3 1 3 1 3 2 2 2 2 1 3 1 1 1 3 1 2 2 2 3 3 1 2 1
 1 1 2 1 1 3 2 2 1 3 2 2 3 3 2 2 3 2 2 1 1 3 3 3 2 2 2 3 3 3 3 3 1 2 1 2 2
 3 2 1 1 1 1 3 2 2 3 2 2 2 2 3 2 2 2 1 1 1 1 1 1 3 1 1 3 1 1 2 3 1 3 2 1 3
 3 1 3 2 3 2 3 2 2 3 3 2 1 3 3 2 2 3 1 2 3 2 2 3 3 2 1 2 1 2 2 3 2 2 2 2 2
 1 2 3 3 3 3 2 2 1 1 2 2 2 3 1 3 3 2 2 3 1 1 1 2 2 3 1 1 2 1 3 3 3 1 3 1 3
 2 3 2 3 2 1 1 2 1 2 2 1 2 3 1 3 2 3 1 1 3 3 1 1 2 2 3 2 2 2 1 2 3 1 3 3 1
 2 1 3 3 1 1 3 2 2 3 2 2 2 3 3 1 2 2 3 3 1 3 3 1 1 3 3 3 1 1 2 3 1 3 1 1 1
 2 3 2 2 3 2 3 2 1 1 1 3 1 3 1 2 1 3 2 3 3 1 2 2 1 1 2 2 1 3 2 1 1 3 1 3 1
 2 3 3 3 1 1 2 1 1 1 1 3 2 2 1 1 3 3 3 3 1 1 2 1 2 3 1 3 1 2 1 3 2 2 3 1 3
 3 3 3 2 2 1 1 3 2 2 1 2 2 1 1 2 2 2 2 1 1 2 1 2 1 1 3 1 2 2 2 1 3 1 1 1 1
 1 1 3 1 2 3 1 3 2 3 2 1 1 2 1 3 1 3 2 1 3 2 2 1 2 1 2 2 1 1 2 3 1 1 2 1 2
 1 1 1 2 3 2 3 2 3 2 1 2 1 3 3 2 1 1 3 3 1 3 1 2 3 2 1 3 1 1 3 1 3 1 1 2 3
 2 3 3 3 2 2 1 1 1 3 2 1 3 2 1 1 3 2 3 2 1 3 1 3 1 3 1 3 3 3 1 2 2 1 1 3 1
 1 3 2 2 3 1 3 1 1 3 1 3 3 2 2 1 2 3 2 1 2 2 1 2 3 1 2 3 2 3 2 3 3 3 1 3 2
 3 3 1 2 1 2 1 2 1 3 2 1 1 1 1 2 1 2 2 3 2 2 3 1 3 1 2 2 3 3 1 2 1 1 3 2 3
 3 1 2 2 3 2 2 2 2 1 2 3 2 3 1 1 2 3 1 2 1 3 2 2 1 1 1 3 1 3 3 3 2 1 2 2 2
 1 1 1 3 3 2 3 2 3 3 3 1 1 3 2 2 2 2 3 1 2 3 1 3 2 3 2 1 3 2 1 3 1 3 1 1 3
 2 3 1 3 3 2 1 3 1 3 3 2 2 3 2 2 3 3 3 1 2 3 1 2 3 1 3 3 2 3 3 2 2 3 2 1 3
 1 2 3 2 1 3 2 2 1 3 3 1 1 1 2 3 3 2 1 2 2 1 2 1 3 2 2 3 1 3 1 1 3 3 2 2 3
 2 2 3 3 3 1 2 3 1 2 1 3 3 3 3 3 3 2 1 3 2 1 3 1 1 2 1 3 3 2 1 3 3 3 2 2 3
 2 2 3 1 2 1 2 3 2 2 3 3 1 2 3 3 1 2 3 3 2 2 2 2 2 2 2 2 2 1 2 3 3 1 2 1 2
 2 3 2 3 3 2 1 3 2 2 1 3 1 1 1 2 1 3 3 2 3 2 3 2 3 2 3 3 1 1 2 1 2 3 1 2 3
 3 2 3 3 1 1 2 1 3 3 3 3 2 3 3 1 1 2 2 1 2 2 1 1 1 2 2 2 3 2 1 3 1 3 3 3 2
 2 3 3 2 1 1 1 2 3 2 2 1 2 2 3 3 1 3 3 2 1 1 1 3 2 3 1 3 3 3 2 3 2 1 1 2 3
 3 3 3 2 2 3 2 2 3 1 3 1 3 1 3 2 3 1 1 1 3 2 3 2 2 2 2 1 1 3 3 1 2 2 1 1 1
 3 3 1 1 2 2 1 2 3 1 2 1 1 2 1 2 1 1 1 1 2 1 3 3 2 3 1 3 3 1 3 2 1 2 1 1 2
 2 3 3 1 3 1 1 1 2 1 3 3 3 3 2 1 1 3 1 2 3 2 1 3 2 2 2 1 3 1 2 1 1 1 1 1 1
 1 1 2 3 2 3 1 1 1 1 2 1 2 2 1 3 1 2 3 1 3 2 1 1 3 2 3 1 1 2 2 2 1 2 2 2 3
 1 1 3 3 1 2 2 3 2 3 3 1 3 1 2 2 2 2 3 1 2 2 3 2 1 2 2 3 1 2 1 3 1 2 1 1 2
 3 2 3 3 2 2 1 1 3 2 2 3 3 1 3 3 3 1 3 2 1 3 3 1 3 1 3 1 2 1 2 3 1 2 2 1 2
 1 2 1 1 1 3 3 1 2 1 2 2 3 3 2 3 2 2 2 3 3 1 1 1 2 3 2 1 2 3 2 3 1 2 1 2 3
 3 3 1 2 3 1 3 2 3 1 2 2 1 2 3 3 3 3 3 3 1 2 3 3 3 2 3 1 2 1 1 2 2 2 3 2 3
 3 1 3 1 1 1 1 1 1 3 3 1 2 3 2 1 1 3 2 3 2 1 1 2 1 1 2 1 2 1 1 1 1 1 3 2 1
 2 3 3 3 1 3 3 3 2 1 1 3 2 3 1 2 1 2 1 2 2 2 2 2 2 2 1 1 1 3 3 2 3 1 1 1 1
 2 2 1 2 3 3 3 1 3 1 2 1 3 3 1 1 1 2 3 2 2 2 1 2 2 2 2 3 2 3 1 1 1 3 2 1 3
 2 2 3 1 1 3 3 3 3 1 2 2 1 2 1 2 2 1 3 1 1 1 2 1 3 1 1 3 1 3 2 3 2 2 2 2 1
 3 3 1 1 3 3 1 2 1 1 1 3 3 3 3 2 2 3 3 1 3 2 3 3 1 1 3 2 1 2 1 2 3 3 3 1 3
 3 3 2 3 2 1 1 2 3 3 2 1 3 2 3 1 1 3 2 1 2 1 3 3 1 2 1 1 2 3 1 3 3 1 3 3 3
 2 1 2 3 2 1 3 2 1 1 3 3 1 2 3 3 3 2 3 3 2 2 2 2 2 3 2 2 2 2 2 2 2 3 1 1 2
 2 2 2 1 3 2 1 1 2 1 2 2 1 1 1 1 1 3 1 2 3 3 2 3 1 3 2 1 1 1 1 2 3 1 3 3 1
 1 1 3 3 1 2 1 3 3 3 2 3 2 1 2 2 3 1 2 3 1 3 1 2 2 1 2 3 3 3 2 2 1 1 1 3 1
 1 3 3 3 2 1 2 3 2 1 1 1 2 1 3 1 1 1 2 2 1 3 1 2 1 1 1 2 2 3 3 3 2 3 3 1 3
 2 1 3 3 2 2 3 2 2 1 3 1 2 2 1 3 3 1 3 2 2 3 2 3 3 3 1 3 2 2 2 2 3 3 1 2 3
 1 1 1 1 1 3 2 1 3 2 3 2 3 2 3 3 3 2 2 2 3 2 2 1 3 1 2 2 1 2 1 1 1 1 3 1 1
 2 1 2 2 1 2 2 2 2 2 3 3 1 2 2 1 1 2 2 1 3 2 2 3 2 1 2 3 2 1 2 3 3 2 2 1 2
 3 3 2 1 2 2 3 3 3 1 3 3 1 2 3 2 3 3 3 2 3 1 1 2 3 2 2 2 3 1 1 1 2 2 3 1 3
 3 1 3 3 3 2 1 1 1 2 3 3 1 3 2 2 1 1 2 2 1 3 2 2 3 3 1 1 1 2 3 3 1 3 2 1 2
 2 2 1 2 3 3 2 2 3 2 3 3 3 1 3 3 1 1 1 3 1 3 2 3 3 2 2 2 2 2 2 1 3 2 3 3 2
 3 3 1 3 2 1 2 3 1 1 3 2 2 3 2 2 3 2 2 3 3 1 1 2 2 2 2 3 2 1 2 2 3 1 2 1 2
 2 3 2 1 2 2 1 1 1 2 3 3 3 2 2 3 1 2 3 1 1 2 1 2 2 2 3 3 1 1 3 1 2 3 1 1 1
 2 1 3 2 1 1 1 3 2 3 2 2 1 2 3 1 1 3 2 2 1 1 3 2 3 1 2 3 2 2 3 3 2 2 2 1 2
 2 2 1 3 3 2 2 3 3 3 3 1 3 1 1 3 2 1 3 3 1 2 1 2 2 1 3 1 3 2 3 3 1 1 3 1 3
 1 2 2 1 2 3 3 3 2 2 3 3 1 1 3 2 1 1 3 2 1 1 1 3 3 1 2 3 1 2 2 3 1 3 2 1 1
 3 2 1 1 2 1 1 1 3 1 2 2 1 3 1 2 1 3 1 2 1 2 3 2 2 3 3 2 3 1 3 1 2 3 3 3 1
 3 1 3 1 2 3 3 2 3 2 1 2 2 1 2 1 1 1 1 3 3 2 3 2 2 2 1 1 3 1 2 2 2 1 2 2 3
 2 3 3 1 3 2 3 3 1 3 3 1 2 3 1 1 3 2 3 3 1 1 3 1 1 1 2 3 1 3 1 2 2 2 2 3 1
 2 1 2 3 2 2 2 1 2 3 2 1 1 2 2 1 3 1 3 2 1 3 1 3 2 2 3 2 3 3 3 2 2 1 1 2 2
 3 3 1 1 3 1 2 2 3 1 3 3 3 3 1 3 1 3 1 3 1 3 3 3 3 3 1 1 1 1 2 2 1 2 2 3 3
 3 2 3 3 1 1 3 1 1 3 3 2 2 1 1 2 3 1 2 2 3 1 1 1 2 2 1 3 2 2 1 2 1 1 3 2 2
 1 2 1 3 2 2 3 2 2 2 1 3 1 1 1 2 3 2 1 1 2 2 2 3 3 1 2 3 2 3 1 1 2 1 3 2 1
 2 3 1 3 1 1 1 1 2 3 3 1 2 1 3 3 3 1 1 2 2 2 1 1 1 1 3 1 2 2 2 2 3 3 3 1 3
 2 3 2 2 3 2 2 2 3 1 1 2 2 1 1 3 3 3 1 1 3 1 1 2 2 1 3 1 3 2 2 2 2 1 1 3 3
 3 3 3 3 3 3 2 1 3 1 1 3 1 1 3 3 3 1 2 2 3 2 1 1 2 1 3 3 1 2 2 2 3 2 1 3 3
 1 1 1 3 2 2 2 2 3 1 1 3 1 2 1 2 1 2 3 1 2 2 3 2 3 3 2 2 1 2 3 2 3 2 2 1 2
 2 3 3 2 2 2 1 3 3 2 2 2 2 2 3 3 2 2 3 3 2 1 2 1 1 3 3 2 1 2 1 2 1 2 2 3 3
 1 2 2 3 2 2 3 2 1 3 1 2 1 1 1 1 3 1 3 3 3 1 3 3 3 3 2 3 3 1 1 3 3 2 3 1 2
 3 1 2 1 2 3 1 2 3 3 2 3 1 3 2 1 1 3 1 1 3 2 3 2 3 1 2 3 3 1 2 3 3 2 3 3 1
 2 3 3 3 1 2 2 2 3 3 1 2 1 3 1 2 2 3 3 3 3 2 2 2 1 2 3 2 3 3 1 2 2 2 2 2 3
 1 2 2 1 3 1 3 1 1 1 2 1 3 1 2 1 3 3 2 2 2 1 3 2 2 1 1 1 3 3 1 3 3 1 2 3 3
 3 2 3 3 2 2 2 3 3 1 3 3 1 3 3 3 2 1 1 2 3 3 1 2 3 2 2 2 2 2 1 2 2 1 3 2 2
 3 3 2 2 1 3 3 1 2 3 2 3 2 3 3 2 3 3 2 3 1 2 1 2 1 1 1 1 1 2 3 1 1 2 1 2 3
 1 3 2 2 3 3 3 3 2 1 3 3 3 1 2 2 1 1 3 2 1 1 2 3 1 1 2 2 3 3 3 3 1 1 2 2 2
 1 3 3 2 1 3 1 2 1 3 3 2 3 1 2 2 2 1 2 2 1 1 3 1 1 3 1 2 1 2 1 3 1 1 1 1 1
 1 1 3 1 3 2 1 1 3 1 1 2 1 3 1 3 2 3 1 1 3 3 1 1 1 2 2 2 1 3 3 3 2 2 1 2 1
 3 1 2 1 2 2 1 2 3 2 1 3 3 1 1 3 1 1 2 2 3 1 1 3 2 2 2 3 1 2 3 2 2 3 3 1 3
 1 1 3 1 1 3 2 1 1 1 3 2 1 1 2 2 1 1 2 1 3 3 3 3 3 3 3 1 3 1 1 3 1 1 1 2 1
 2 1 1 3 2 1 2 3 1 2 3 3 3 1 1 1 2 1 3 3 3 3 1 2 1 2 3 1 3 1 3 3 2 2 1 2 1
 2 1 2 1 2 3 3 1 3 2 1 2 2 2 2 2 1 3 2 3 1 1 1 2 1 3 2 2 3 1 2 3 1 2 1 3 3
 1 2 1 1 3 1 3 3 1 2 1 2 3 2 3 3 1 3 3 1 2 1 1 2 3 3 1 2 1 1 3 2 1 3 2 1 1
 3 3 1 1 2 3 2 3 1 3 3 1 3 2 1 3 1 3 2 1 3 2 3 2 2 1 3 2 1 1 3 1 1 2 3 1 3
 2 1 3 2 3 1 1 2 2 2 3 3 1 3 3 2 2 2 3 3 3 3 2 3 1 2 3 3 1 2 2 3 2 2 2 3 3
 2 3 2 3 2 3 3 1 3 2 3 1 3 3 1 1 2 1 3 2 1 1 1 2 3 3 1 3 1 3 3 1 1 1 3 1 2
 3 3 1 3 1 1 1 3 1 1 2 2 3 3 3 1 1 3 2 1 1 2 3 2 3 2 2 2 1 1 2 3 1 1 2 2 3
 1 2 3 1 3 2 3 2 1 2 1 2 1 1 3 1 2 1 2 3 3 2 2 3 1 3 2 2 2 1 2 2 2 2 3 3 1
 2 1 3 3 3 1 1 3 2 1 1 2 2 2 3 3 3 1 1 1 1 3 3 2 3 1 3 1 1 2 1 3 2 3 2 2 2
 1 2 2 3 2 1 2 2 3 1 3 2 2 3 2 3 2 3 1 3 1 1 1 3 3 1 1 3 2 1 1 2 1 2 1 3 2
 3 2 3 3 2 2 2 3 2 2 2 3 2 3 2 2 1 3 3 2 3 2 2 2 1 1 3 2 2 3 2 3 1 3 3 1 2
 3 3 3 1 2 3 3 2 2 3 2 2 1 2 3 2 3 2 3 1 3 1 2 1 2 3 1 3 1 3 1 3 3 3 3 3 1
 1 1 1 3 3 2 1 1 1 2 1 1 1 1 2 1 2 3 2 1 1 1 1 1 2 3 1 1 3 2 3 1 3 2 2 3 3
 1 3 3 3 3 1 1 3 1 2 1 3 3 2 2 1 3 2 3 1 1 3 3 3 3 2 2 1 1 2 3 3 3 3 1 2 2
 1 3 1 1 1 2 1 3 3 2 2 2 2 3 3 1 1 3 2 1 1 2 2 1 2 2 3 2 1 1 3 3 1 3 1 2 3
 3 2 3 1 2 3 3 2 2 3 1 2 2 3 2 2 1 2 3 2 3 3 1 2 2 1 2 1 3 3 2 2 1 2 3 2 1
 2 1 3 1 3 1 2 2 1 1 3 2 1 2 1 3 2 1 3 1 3 3 3 2 1 2 3 1 1 3 2 3 2 1 3 3 2
 2 1 3 1 1 3 3 3 1 1 3 2 1 2 3 3 2 2 2 2 3 2 3 1 1 2 3 1 2 3 1 3 3 3 2 1 1
 2 3 1 2 2 2 2 2 3 2 3 3 3 2 2 1 2 3 2 2 2 2 1 1 3 2 3 2 3 3 1 2 1 2 2 1 2
 2 3 3 1 2 2 3 1 2 2 2 1 1 2 2 3 2 1 2 2 2 2 3 3 1 1 2 2 3 3 1 3 2 2 3 3 1
 3 2 3 1 3 3 2 3 3 3 3 2 1 3 1 1 3 1 1 1 2 3 3 3 2 3 2 2 1 3 3 1 1 3 1 1 1
 1 3 1 3 3 2 2 3 2 3 3 1 1 1 3 3 3 1 2 2]
In [ ]:
# export imaging schedule to a .json file

final_design = design3
schedule, population = evaluator(final_design)

export_dict = []

for i in range(num_uniq):
    index = np.where(unique_list[i]==schedule)
    
    if len(index[0]) != 0:
        sat_num = index[0].astype(int)[0]
        time_st = index[1].astype(int)[0]
        img_act_duration = 10 + (90-elevation_table[sat_num,time_st,i])

        item = {"target_id": unique_targets[0,i], "satellite_name": sat_name_list[sat_num], "target_lat_deg": unique_targets[2,i],\
                "target_lon_deg": unique_targets[3,i], "target_alt_m": unique_targets[4,i],\
                "t_ISO": t_iso_list[time_st], "timestamp_minute": time_vector[time_st],\
                "satellite_azimuth_deg": azimuth_table[sat_num,time_st,i], "satellite_elevation_deg": elevation_table[sat_num,time_st,i],\
                "sun_azimuth_deg": azimuth_table[-1,time_st,i], "sun_elevation_deg": elevation_table[-1,time_st,i],\
                "activity_duration_s": img_act_duration}

        export_dict.append(item)
In [ ]:
with open('/content/drive/My Drive/Planet/Optim/imaging.json', 'w') as fout: 
  json.dump(export_dict, fout, indent=4)