serikov

mini_ceo_2

Aug 6th, 2025
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.44 KB | None | 0 0
  1. import pandas as pd
  2. import random
  3.  
  4. def is_balanced(board):
  5.     n = len(board)
  6.     for i in range(n-1):
  7.         for j in range(n-1):
  8.             square = {board[i][j], board[i][j+1], board[i+1][j], board[i+1][j+1]}
  9.             if len(square) < 3:
  10.                 return False
  11.     return True
  12.  
  13. def dominant_lines_pandas(board, k):
  14.     df = pd.DataFrame(board)
  15.     row_reds = (df == 'R').sum(axis=1)
  16.     col_reds = (df == 'R').sum(axis=0)
  17.     dominant_rows = (row_reds >= k).sum()
  18.     dominant_cols = (col_reds >= k).sum()
  19.     return dominant_rows + dominant_cols
  20.  
  21. def generate_shifted_board(n, reds_per_row, shift):
  22.     board = [['G' for _ in range(n)] for _ in range(n)]
  23.     for i in range(n):
  24.         for j in range(reds_per_row):
  25.             board[i][(j + shift * i) % n] = 'R'
  26.     # Оставшиеся закрашиваем в синий
  27.     for i in range(n):
  28.         for j in range(n):
  29.             if board[i][j] == 'G':
  30.                 board[i][j] = 'B'
  31.     return board
  32.  
  33. def random_fill_board(n, reds_per_row):
  34.     board = []
  35.     for i in range(n):
  36.         row = ['B'] * n
  37.         red_indices = random.sample(range(n), reds_per_row)
  38.         for idx in red_indices:
  39.             row[idx] = 'R'
  40.         for j in range(n):
  41.             if row[j] != 'R':
  42.                 row[j] = random.choice(['G', 'B'])
  43.         board.append(row)
  44.     return board
  45.  
  46. def run_experiments(n, k, num_attempts=1000):
  47.     max_dom_lines = 0
  48.     best_board = None
  49.  
  50.     # Циклические сдвиги (жадно)
  51.     for shift in range(n):
  52.         board = generate_shifted_board(n, k, shift)
  53.         if is_balanced(board):
  54.             dom_lines = dominant_lines_pandas(board, k)
  55.             if dom_lines > max_dom_lines:
  56.                 max_dom_lines = dom_lines
  57.                 best_board = [row[:] for row in board]
  58.  
  59.     # Рандомные генерации
  60.     for _ in range(num_attempts):
  61.         board = random_fill_board(n, k)
  62.         if is_balanced(board):
  63.             dom_lines = dominant_lines_pandas(board, k)
  64.             if dom_lines > max_dom_lines:
  65.                 max_dom_lines = dom_lines
  66.                 best_board = [row[:] for row in board]
  67.  
  68.     return max_dom_lines, best_board
  69.  
  70. # Параметры
  71. n = 6
  72. k = 4
  73.  
  74. max_dom_lines, best_board = run_experiments(n, k, num_attempts=2000)
  75. print("Максимум доминирующих по красному линий:", max_dom_lines)
  76. print(pd.DataFrame(best_board))
  77.  
Advertisement
Add Comment
Please, Sign In to add comment