Advertisement
Guest User

Untitled

a guest
Apr 21st, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.64 KB | None | 0 0
  1. from collections import deque
  2. import numpy as np
  3.  
  4. def revise_rows(possible_positions, image):
  5.     revised = False
  6.     for r in range(row_num):
  7.         pos_mat = possible_positions[r]
  8.  
  9.         image_row = image[r, :]
  10.  
  11.         result = pos_mat + image_row
  12.         result = np.all(result != 1, axis=1)
  13.  
  14.         revised |= np.any(result == False)
  15.  
  16.         possible_positions[r] = possible_positions[r][result,:]
  17.     return revised
  18.  
  19. def revise_cols(possible_positions, image):
  20.     revised = False
  21.     for c in range(col_num):
  22.         pos_mat = possible_positions[c]
  23.         image_col = image[:, c]
  24.  
  25.         result = pos_mat + image_col
  26.         result = np.all(result != 1, axis=1)
  27.  
  28.         revised |= np.any(result == False)
  29.  
  30.         possible_positions[c] = possible_positions[c][result, :]
  31.     return revised
  32.  
  33. def fix_by_rows(possible_positions, image):
  34.     for r in range(row_num):
  35.         pos_mat = possible_positions[r]
  36.         result = pos_mat.sum(axis=0)
  37.         image[r, result==len(possible_positions[r])] = 1
  38.         image[r, result==0] = 0
  39.  
  40. def fix_by_cols(possible_positions, image):
  41.     for c in range(col_num):
  42.         pos_mat = possible_positions[c]
  43.         result = pos_mat.sum(axis=0)
  44.         image[result==len(possible_positions[c]), c] = 1
  45.         image[result==0, c] = 0
  46.  
  47. def revise(row_possible_positions, col_possible_positions, image):
  48.     revised = True
  49.     while revised:
  50.         revised = False
  51.         image_sum = image.sum()
  52.  
  53.         revised |= revise_rows(row_possible_positions, image)
  54.         fix_by_rows(row_possible_positions, image)
  55.  
  56.         revised |= revise_cols(col_possible_positions, image)
  57.         fix_by_cols(col_possible_positions, image)
  58.  
  59.         revised |= image_sum < image.sum()
  60.  
  61. def solve(row_descriptions_list, col_descriptions_list):
  62.     t0 = time.time()
  63.     row_possible_positions = [binary_descripts(block_domains(col_num, row_description), row_description, col_num) \
  64.         for row_description in row_descriptions_list]
  65.     col_possible_positions = [binary_descripts(block_domains(row_num, col_description), col_description, row_num) \
  66.         for col_description in col_descriptions_list]
  67.  
  68.  
  69.     print('block domains time:',time.time() - t0)
  70.     # -1 = unassigned, 0 - not filled, 1 - filled
  71.     image = np.ones((row_num, col_num)) * (-1)
  72.  
  73.     t0 = time.time()
  74.     revise(row_possible_positions, col_possible_positions, image)
  75.     print('first revise time:',time.time() - t0)
  76.     assigned_rows = np.array([False] * len(row_possible_positions))
  77.     assigned_cols = np.array([False] * len(col_possible_positions))
  78.     update_assigned(row_possible_positions, assigned_rows, col_possible_positions, assigned_cols)
  79.  
  80.     _, image = backtrack(row_possible_positions, assigned_rows, col_possible_positions, assigned_cols, image)
  81.  
  82.     draw_image(image)
  83.  
  84. import time
  85. sorting_time = 0
  86. revising_time = 0
  87. backtrack_num = 0
  88. def backtrack(row_variables, assigned_rows, col_variables, assigned_cols, image):
  89.     global sorting_time
  90.     global revising_time
  91.     global backtrack_num
  92.     backtrack_num += 1
  93.     if np.all(assigned_rows) and np.all(assigned_cols):
  94.         return True, image
  95.    
  96.     var_type, var_idx = choose_variable(row_variables, assigned_rows, col_variables, assigned_cols)
  97.     if var_type == 'r':
  98.         var = row_variables[var_idx]
  99.         assigned_rows[var_idx] = True
  100.     else:
  101.         var = col_variables[var_idx]
  102.         assigned_cols[var_idx] = True
  103.  
  104.     t0 = time.time()
  105.     sorted_values = sort_values(row_variables, col_variables, var, var_idx, var_type, image)#reversed(range(len(var)))
  106.     sorting_time += time.time() - t0
  107.  
  108.     for value_idx in sorted_values:
  109.         image_copy = image.copy()
  110.         row_variables_copy = [v.copy() for v in row_variables]
  111.         col_variables_copy = [v.copy() for v in col_variables]
  112.  
  113.        
  114.         assign_value(var[value_idx, :], var_idx, var_type, image_copy)
  115.         t0 = time.time()
  116.         revise(row_variables_copy, col_variables_copy, image_copy)
  117.         revising_time += time.time() - t0
  118.  
  119.         result, result_img = backtrack(row_variables_copy, assigned_rows, \
  120.             col_variables_copy, assigned_cols, image_copy)
  121.  
  122.         if result == True:
  123.             return True, result_img
  124.  
  125.     if var_type == 'r':
  126.         assigned_rows[var_idx] = False
  127.     else:
  128.         assigned_cols[var_idx] = False
  129.  
  130.     return False, None
  131.  
  132. def assign_value(vector, vector_idx, vector_type, image):
  133.     if vector_type == 'r':
  134.         image[vector_idx, :] = vector
  135.     else:
  136.         image[:, vector_idx] = vector
  137.  
  138. def choose_variable(row_variables, assigned_rows, col_variables, assigned_cols):
  139.    
  140.     best_var = '', 999999, -1
  141.  
  142.     for i in range(len(col_variables)):
  143.         if assigned_cols[i] == False and best_var[1] > col_variables[i].shape[0]:
  144.             best_var = 'c', col_variables[i].shape[0], i
  145.  
  146.     for i in range(len(row_variables)):
  147.         if assigned_rows[i] == False and best_var[1] > row_variables[i].shape[0]:
  148.             best_var = 'r', row_variables[i].shape[0], i
  149.  
  150.     return best_var[0], best_var[2]
  151.  
  152.  
  153. def update_assigned(row_variables, assigned_rows, col_variables, assigned_cols):
  154.     for i, row in enumerate(row_variables):
  155.         if row.shape[0] == 1:
  156.             assigned_rows[i] = True
  157.     for i, col in enumerate(col_variables):
  158.         if row.shape[0] == 1:
  159.             assigned_cols[i] = True
  160.  
  161. def sort_values(row_poss, col_poss, values, vector_idx, vector_type, image):
  162.     indicies = []
  163.     img_cpy = image.copy()
  164.     for val_idx, val in enumerate(values):
  165.        
  166.         assign_value(val, vector_idx, vector_type, img_cpy)
  167.         if vector_type == 'r':
  168.             col_poss_copy = [v.copy() for v in col_poss]
  169.             revise_cols(col_poss_copy, img_cpy)
  170.             indicies.append((sum([c.shape[0] for c in col_poss_copy]), val_idx))
  171.  
  172.         else:
  173.             row_poss_copy = [v.copy() for v in row_poss]
  174.             revise_rows(row_poss_copy, img_cpy)
  175.             indicies.append((sum([r.shape[0] for r in row_poss_copy]), val_idx))
  176.  
  177.     indicies.sort(reverse=True)
  178.     return [idx for val, idx in indicies]
  179.  
  180. def block_domains(sequence_len, block_lens):
  181.     block_num = len(block_lens)
  182.     q = deque() # queue holdings states. Each state is list of positions of blocks.
  183.    
  184.     positions = []
  185.  
  186.     pos = 0
  187.     while pos + sum(block_lens) + len(block_lens) - 1 <= sequence_len:
  188.         q.append([pos])
  189.         pos += 1
  190.      
  191.     while not (len(q) == 0):
  192.         state = q.pop()
  193.         state_len = len(state)
  194.         if state_len != block_num:
  195.            
  196.             pos = state[-1] + block_lens[state_len-1] + 1
  197.             while pos + sum(block_lens[state_len:]) + len(block_lens[state_len:]) - 1 <= sequence_len:
  198.                 new_state = list(state)
  199.                 new_state.append(pos)
  200.                 q.append(new_state)
  201.                 pos += 1
  202.         else:
  203.             positions.append(state)
  204.     return positions
  205.  
  206. binary_time = 0
  207. def binary_descripts(domain, lengths, sequence_len):
  208.     global binary_time
  209.     t0 = time.time()
  210.     binary_domain = np.array([[0] * sequence_len] * len(domain))
  211.     for i, positions in enumerate(domain):
  212.         for pos, length in zip(positions, lengths):
  213.             binary_domain[i,pos:pos+length] = 1
  214.     binary_time += time.time() - t0
  215.     return binary_domain
  216.  
  217. def draw_image(image):
  218.     for row in image:
  219.         signs = []
  220.         for i in row:
  221.             signs.append('#' if i == 1 else '.')
  222.         f_out.write(''.join(signs) + '\n')
  223.  
  224. def print_image(image):
  225.     for row in image:
  226.         signs = []
  227.         for i in row:
  228.             signs.append('#' if i == 1 else '.')
  229.         print(''.join(signs) + '\n')
  230.     print('\n*******\n')
  231.  
  232.  
  233. f = open("zad_input.txt", 'r')
  234. f_out = open("zad_output.txt", 'w')
  235.  
  236. row_descriptions = []
  237. col_descriptions = []
  238. for i,l in enumerate(f):
  239.     l = l.split()
  240.  
  241.     if i == 0:
  242.         row_num = int(l[0])
  243.         col_num = int(l[1])
  244.     elif len(row_descriptions) < row_num:
  245.         row_descriptions.append([int(x) for x in l])
  246.     else:
  247.         col_descriptions.append([int(x) for x in l])
  248.  
  249.  
  250. solve(row_descriptions,col_descriptions)
  251. print('sorting time=',sorting_time)
  252. print('revising_time=',revising_time)
  253. print('binary_time=',binary_time)
  254. print('backtrack_num=', backtrack_num)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement