Advertisement
riskvip

do_min

Mar 19th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.70 KB | None | 0 0
  1. import numpy as np
  2.  
  3. m = 6
  4. n = 9
  5. a = np.arange((m+2)*(n+2)).reshape(m+2, n+2)
  6. default = np.ones_like(a)
  7. for i in range(m+2):
  8.     for j in range(n+2):
  9.         if i == 0 or j == 0:
  10.             default[i,j] = 0
  11.         if i == m+1 or j == n+1:
  12.             default[i,j] = 0
  13.  
  14. def make_nd(data):
  15.     a = np.array(default).astype(float)
  16.     for i in range(1, m+1):
  17.         for j in range(1, n+1):
  18.             a[i,j] = data[i-1][j-1]
  19.     return a
  20.  
  21. def sum_nd(data):
  22.     a = np.array(default).astype(float)
  23.     for i in range(1, m+1):
  24.         for j in range(1, n+1):
  25.             a[i,j] = np.sum(data[i-1:i+2,j-1:j+2]) - data[i,j]
  26.     return a
  27.  
  28. def avg_nd(data):
  29.     a = np.array(default).astype(float)
  30.     count = sum_nd(default)
  31.     for i in range(1, m+1):
  32.         for j in range(1, n+1):
  33.             a[i,j] = (np.sum(data[i-1:i+2,j-1:j+2]) - data[i,j]) / count[i,j]
  34.     return a
  35.  
  36. def max_nd(data):
  37.     a = np.array(default).astype(float)
  38.     b = np.array(data).astype(float)
  39.     for i in range(1, m+1):
  40.         for j in range(1, n+1):
  41.             temp = data[i,j]
  42.             data[i,j] = 0
  43.             a[i,j] = np.amax(data[i-1:i+2,j-1:j+2])
  44.             data[i,j] = temp
  45.     return a
  46.  
  47. def list_nd(data):
  48.     a = dict()
  49.     b = np.array(data).astype(float)
  50.     for i in range(1, m+1):
  51.         a[i] = dict()
  52.         for j in range(1, n+1):
  53.             temp = data[i,j]
  54.             data[i,j] = 0
  55.             a[i][j] = data[i-1:i+2,j-1:j+2].flatten()
  56.             data[i,j] = temp
  57.     return a
  58.  
  59. def divide_nd(data):
  60.     a = np.array(default).astype(float)
  61.     count = sum_nd(default)
  62.     for i in range(1, m+1):
  63.         for j in range(1, n+1):
  64.             a[i,j] = data[i,j] / count[i,j]
  65.     return a
  66.  
  67. def make_data_test(m, n):
  68.     a = []
  69.     for i in range(m):
  70.         b = []
  71.         for j in range(n):
  72.             b.append(np.random.binomial(1,0.5))
  73.         a.append(b)
  74.     b = np.arange((m+2)*(n+2)).reshape(m+2, n+2)
  75.     default = np.ones_like(b)
  76.     for i in range(m+2):
  77.         for j in range(n+2):
  78.             if i == 0 or j == 0:
  79.                 default[i,j] = 0
  80.             if i == m+1 or j == n+1:
  81.                 default[i,j] = 0
  82.     c = sum_nd(make_nd(a))[1:m+1, 1:n+1].astype(int)
  83.     d = []
  84.     for i in range(m):
  85.         b = []
  86.         for j in range(n):
  87.             b.append(c[i,j])
  88.         d.append(b)
  89.     return d, a
  90.  
  91. # input_data = [
  92. #     [1,3,3,1],
  93. #     [2,3,4,4],
  94. #     [3,6,5,3],
  95. #     [1,3,3,3]
  96. # ]
  97.  
  98. input_data, output_data = make_data_test(m=m, n=n)
  99. process_data = make_nd(input_data)
  100. broadcast_probability = divide_nd(process_data)
  101.  
  102. max_bcp = max_nd(broadcast_probability)
  103. avg_bcp = avg_nd(broadcast_probability)
  104. lst_bcp = list_nd(broadcast_probability)
  105.  
  106. # Start EA
  107.  
  108. # initiate the population
  109. def init_one():
  110.     a = np.array(default).astype(float)
  111.     for i in range(1, m+1):
  112.         for j in range(1, n+1):
  113.             method = np.random.randint(0,3)
  114.             if method == 0:
  115.                 possibilities = lst_bcp[i][j]
  116.                 k = np.random.randint(0, len(possibilities))
  117.                 a[i,j] = np.random.binomial(1, possibilities[k])
  118.             elif method == 1:
  119.                 a[i,j] = np.random.binomial(1, avg_bcp[i,j])
  120.             else:
  121.                 a[i,j] = np.random.binomial(1, max_bcp[i,j])
  122.     return a
  123.  
  124. def init_ppl(n):
  125.     return [init_one() for i in range(n)]    
  126.  
  127. def evaluate_one(a):
  128.     return np.sum(np.absolute(sum_nd(a) - process_data))
  129.  
  130. def evaluate_ppl(ppl):
  131.     return [evaluate_one(i) for i in ppl]
  132.  
  133. def crossover(x,y):
  134.     a = np.array(default).astype(float)
  135.     for i in range(1, m+1):
  136.         for j in range(1, n+1):
  137.             k = np.random.randint(0, 2)
  138.             if k == 0:
  139.                 a[i,j] = x[i,j]
  140.             else:
  141.                 a[i,j] = y[i,j]
  142.     return a
  143.  
  144. def mutate(x, p=0.1):
  145.     a = np.array(default).astype(float)
  146.     for i in range(1, m+1):
  147.         for j in range(1, n+1):
  148.             k = np.random.binomial(1, p)
  149.             if k == 1:
  150.                 a[i,j] = 0 if x[i,j] > 0 else 1
  151.             else:
  152.                 a[i,j] = x[i,j]
  153.     return a
  154.  
  155. def new_ppl(ppl, num_crossover, num_mutate):
  156.     a = []
  157.     len_ppl = len(ppl)
  158.     for i in range(num_crossover):
  159.         a.append(crossover(ppl[np.random.randint(0, len_ppl)], ppl[np.random.randint(0, len_ppl)]))
  160.     for i in range(num_mutate):
  161.         a.append(mutate(ppl[np.random.randint(0, len_ppl)], p=0.1))
  162.     return ppl + a
  163.  
  164. def select_ppl(P, n):
  165.     P_points = evaluate_ppl(P)
  166.     avg_point = np.average(P_points)
  167.     temp_pp = [[id_v,v] for id_v, v in enumerate(P_points)]
  168.     def getKey(a):
  169.         return a[1]
  170.     ordered_pp = sorted(temp_pp, key=getKey)
  171.     new_P = []
  172.     i = 0
  173.     n_bias = 50
  174.     while len(new_P) < n-n_bias and i < n:
  175.         new_P.append(P[ordered_pp[i][0]])
  176.         i += 1
  177.     for i in range(n_bias):
  178.         new_P.append(P[ordered_pp[len(ordered_pp)-1-i][0]])
  179.     return new_P
  180.  
  181. def is_finished_ppl(ppl):
  182.     is_finished = -1
  183.     for id_p, point in enumerate(evaluate_ppl(ppl)):
  184.         if point == 0:
  185.             is_finished = id_p
  186.     return is_finished
  187.  
  188. def run():
  189.     P = init_ppl(1000)
  190.     number_generations = 1000
  191.     for i in range(number_generations):
  192.         P = new_ppl(P, 900, 100)
  193.         P = select_ppl(P, 1000)
  194.         is_fn = is_finished_ppl(P)
  195.         if is_fn > -1:
  196.             print("Terminate at generation: ", i+1)
  197.             break
  198.     return P[is_fn] if is_fn > -1 else P[0]
  199.  
  200. import time
  201.  
  202. print("The input data is: ")
  203. for i in input_data:
  204.     print(i)
  205. start = time.time()
  206. res = run()
  207. print(res[1:m+1,1:n+1].astype(int))
  208. print("It takes: ", time.time() - start, "secs")
  209.  
  210. print("The answer is: ")
  211. for i in output_data:
  212.     print(i)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement