LLC536 commited on
Commit
b3f457f
·
verified ·
1 Parent(s): 432c687

Update algorithm_3d_1.py

Browse files
Files changed (1) hide show
  1. algorithm_3d_1.py +23 -23
algorithm_3d_1.py CHANGED
@@ -20,9 +20,9 @@ from utils import (
20
 
21
  def is_slide_3d(c, e, blocks_set):
22
  """
23
- [span_0](start_span)Slide trong 3D: Khối di chuyển theo đường thẳng c-e (khoảng cách Manhattan bằng 1)[span_0](end_span).
24
  Ràng buộc 4-cycle: Phải tồn tại một chu trình 4 ô trong lưới Z^3, trong đó c, e
25
- [span_1](start_span)và ô kề bên của c đều thuộc blocks_set, tạo điểm tựa song song với hướng trượt[span_1](end_span).
26
  """
27
  dx = e[0] - c[0]
28
  dy = e[1] - c[1]
@@ -51,9 +51,9 @@ def is_slide_3d(c, e, blocks_set):
51
 
52
  def is_convex_3d(c, e, blocks_set):
53
  """
54
- [span_2](start_span)[span_3](start_span)Convex transition trong 3D: c và e nằm chéo nhau trên một mặt phẳng lưới 2x2[span_2](end_span)[span_3](end_span).
55
  Khoảng cách Manhattan bằng 2, thay đổi đúng 2 tọa độ.
56
- [span_4](start_span)Đúng một trong hai ô trung gian nối giữa c và e phải chứa khối làm điểm tựa xoay góc[span_4](end_span).
57
  """
58
  dx = e[0] - c[0]
59
  dy = e[1] - c[1]
@@ -131,7 +131,7 @@ def generate_valid_moves_3d(blocks_set):
131
  # ============================================================
132
 
133
  def finished_holes_3d(blocks_set):
134
- [span_5](start_span)"""Tính các vị trí ô trống còn thiếu trong Cuboid để cấu hình đạt trạng thái Finished[span_5](end_span)."""
135
  holes = set()
136
  for x, y, z in blocks_set:
137
  for i in range(x + 1):
@@ -143,7 +143,7 @@ def finished_holes_3d(blocks_set):
143
 
144
 
145
  def compact_target_3d(n):
146
- [span_6](start_span)[span_7](start_span)"""Xây dựng tập bia đích dồn n khối về phía gốc tọa độ tối ưu theo thế năng[span_6](end_span)[span_7](end_span)."""
147
  if n <= 0:
148
  return set()
149
 
@@ -245,17 +245,17 @@ def choose_best_candidate_3d(candidates):
245
  0 if is_finished_3d(item[4]) else 1,
246
  compaction_score_3d(item[4]),
247
  potential(item[4], 3),
248
- [span_8](start_span)item[1][2], # Ưu tiên tọa độ z đích thấp hơn[span_8](end_span)
249
- [span_9](start_span)item[1][1], # Tiếp đến y đích thấp hơn[span_9](end_span)
250
- [span_10](start_span)item[1][0] # Cuối cùng là x đích thấp hơn[span_10](end_span)
251
  )
252
  )
253
 
254
 
255
  def local_z_reduction(blocks_set):
256
- [span_11](start_span)"""Operation [a-d]: Kéo hạ độ cao khối xuống tầng dưới[span_11](end_span)."""
257
  def filt(c, e, move_type):
258
- [span_12](start_span)return e[2] < c[2] # Giảm cao độ z mang tính quyết định[span_12](end_span)
259
 
260
  candidates = one_step_candidates_3d(blocks_set, "local_z_reduction", filt)
261
  res = choose_best_candidate_3d(candidates)
@@ -267,13 +267,13 @@ def get_pillar_heights(blocks_set, x, y):
267
 
268
 
269
  def pillar_shove_heuristic(blocks_set):
270
- [span_13](start_span)[span_14](start_span)"""Operation [e]: Tịnh tiến cấu trúc cột hoặc xử lý kéo nghiêng[span_13](end_span)[span_14](end_span)."""
271
  def filt(c, e, move_type):
272
- # [span_15](start_span)Ưu tiên các khối thuộc một trụ thẳng đứng có chiều cao >= 2[span_15](end_span)
273
  heights = get_pillar_heights(blocks_set, c[0], c[1])
274
  if len(heights) < 2:
275
  return False
276
- # [span_16](start_span)Di chuyển đẩy sang bên cạnh hoặc đi xuống dưới[span_16](end_span)
277
  return e[2] <= c[2] or e[0] < c[0] or e[1] < c[1]
278
 
279
  candidates = one_step_candidates_3d(blocks_set, "pillar_shove", filt)
@@ -282,7 +282,7 @@ def pillar_shove_heuristic(blocks_set):
282
 
283
 
284
  def local_potential_reduction_3d(blocks_set):
285
- [span_17](start_span)"""Operation [f]: Tìm mọi bước đi đơn lẻ tối ưu thế năng cục bộ[span_17](end_span)."""
286
  candidates = one_step_candidates_3d(blocks_set, "local_potential_reduction")
287
  res = choose_best_candidate_3d(candidates)
288
  return (res[0], res[1], res[2], res[3]) if res else None
@@ -319,18 +319,18 @@ def connected_components_3d(cells):
319
 
320
 
321
  def get_low_high_components_3d(blocks_set):
322
- [span_18](start_span)[span_19](start_span)low_cells = {b for b in blocks_set if b[2] == 0} # Mặt phẳng đáy z = 0[span_18](end_span)[span_19](end_span)
323
- [span_20](start_span)[span_21](start_span)high_cells = {b for b in blocks_set if b[2] > 0} # Thành phần trên cao z > 0[span_20](end_span)[span_21](end_span)
324
  return connected_components_3d(low_cells), connected_components_3d(high_cells)
325
 
326
 
327
  def handling_low_components_3d(blocks_set):
328
- [span_22](start_span)[span_23](start_span)"""Operation [g-j]: Xử lý dồn ép các cấu trúc khối nằm ở lớp đáy z=0[span_22](end_span)[span_23](end_span)."""
329
  low_comps, _ = get_low_high_components_3d(blocks_set)
330
  if not low_comps:
331
  return None
332
 
333
- # [span_24](start_span)Tìm thành phần root chứa gốc (0,0,0)[span_24](end_span)
334
  root_comp = None
335
  for comp in low_comps:
336
  if (0, 0, 0) in comp:
@@ -347,7 +347,7 @@ def handling_low_components_3d(blocks_set):
347
  if not non_root_cells:
348
  return None
349
 
350
- # [span_25](start_span)Lọc dịch chuyển thuộc thành phần không phải root hướng về phía gốc tọa độ[span_25](end_span)
351
  def filt(c, e, move_type):
352
  if c not in non_root_cells:
353
  return False
@@ -375,8 +375,8 @@ def move_sort_key_3d(blocks_set, move):
375
 
376
  def beam_escape_sequence_3d(blocks_set, max_depth=4, beam_width=40, branch_limit=20):
377
  """
378
- [span_26](start_span)Chuỗi dịch chuyển vĩ mô nhiều bước. Giải phóng các trường hợp bị nghẽn (Unlock trụ)[span_26](end_span).
379
- [span_27](start_span)Chấp nhận thế năng tăng tạm thời ở các bước trung gian[span_27](end_span).
380
  """
381
  start_score = compaction_score_3d(blocks_set)
382
  start_pot = potential(blocks_set, 3)
@@ -448,7 +448,7 @@ def choose_next_sequence_3d(blocks_set):
448
  if move is not None:
449
  return [move]
450
 
451
- # 2. [span_28](start_span)Nếu kẹt, sử dụng Beam Search tìm chuỗi thoát hiểm phục vụ "Unlock"[span_28](end_span)
452
  macro_seq = beam_escape_sequence_3d(blocks_set, max_depth=4, beam_width=40, branch_limit=20)
453
  if macro_seq:
454
  return macro_seq
 
20
 
21
  def is_slide_3d(c, e, blocks_set):
22
  """
23
+ Slide trong 3D: Khối di chuyển theo đường thẳng c-e (khoảng cách Manhattan bằng 1).
24
  Ràng buộc 4-cycle: Phải tồn tại một chu trình 4 ô trong lưới Z^3, trong đó c, e
25
+ và ô kề bên của c đều thuộc blocks_set, tạo điểm tựa song song với hướng trượt.
26
  """
27
  dx = e[0] - c[0]
28
  dy = e[1] - c[1]
 
51
 
52
  def is_convex_3d(c, e, blocks_set):
53
  """
54
+ Convex transition trong 3D: c và e nằm chéo nhau trên một mặt phẳng lưới 2x2.
55
  Khoảng cách Manhattan bằng 2, thay đổi đúng 2 tọa độ.
56
+ Đúng một trong hai ô trung gian nối giữa c và e phải chứa khối làm điểm tựa xoay góc.
57
  """
58
  dx = e[0] - c[0]
59
  dy = e[1] - c[1]
 
131
  # ============================================================
132
 
133
  def finished_holes_3d(blocks_set):
134
+ """Tính các vị trí ô trống còn thiếu trong Cuboid để cấu hình đạt trạng thái Finished."""
135
  holes = set()
136
  for x, y, z in blocks_set:
137
  for i in range(x + 1):
 
143
 
144
 
145
  def compact_target_3d(n):
146
+ """Xây dựng tập bia đích dồn n khối về phía gốc tọa độ tối ưu theo thế năng."""
147
  if n <= 0:
148
  return set()
149
 
 
245
  0 if is_finished_3d(item[4]) else 1,
246
  compaction_score_3d(item[4]),
247
  potential(item[4], 3),
248
+ item[1][2], # Ưu tiên tọa độ z đích thấp hơn
249
+ item[1][1], # Tiếp đến y đích thấp hơn
250
+ item[1][0] # Cuối cùng là x đích thấp hơn
251
  )
252
  )
253
 
254
 
255
  def local_z_reduction(blocks_set):
256
+ """Operation [a-d]: Kéo hạ độ cao khối xuống tầng dưới."""
257
  def filt(c, e, move_type):
258
+ return e[2] < c[2] # Giảm cao độ z mang tính quyết định
259
 
260
  candidates = one_step_candidates_3d(blocks_set, "local_z_reduction", filt)
261
  res = choose_best_candidate_3d(candidates)
 
267
 
268
 
269
  def pillar_shove_heuristic(blocks_set):
270
+ """Operation [e]: Tịnh tiến cấu trúc cột hoặc xử lý kéo nghiêng."""
271
  def filt(c, e, move_type):
272
+ # Ưu tiên các khối thuộc một trụ thẳng đứng có chiều cao >= 2
273
  heights = get_pillar_heights(blocks_set, c[0], c[1])
274
  if len(heights) < 2:
275
  return False
276
+ # Di chuyển đẩy sang bên cạnh hoặc đi xuống dưới
277
  return e[2] <= c[2] or e[0] < c[0] or e[1] < c[1]
278
 
279
  candidates = one_step_candidates_3d(blocks_set, "pillar_shove", filt)
 
282
 
283
 
284
  def local_potential_reduction_3d(blocks_set):
285
+ """Operation [f]: Tìm mọi bước đi đơn lẻ tối ưu thế năng cục bộ."""
286
  candidates = one_step_candidates_3d(blocks_set, "local_potential_reduction")
287
  res = choose_best_candidate_3d(candidates)
288
  return (res[0], res[1], res[2], res[3]) if res else None
 
319
 
320
 
321
  def get_low_high_components_3d(blocks_set):
322
+ low_cells = {b for b in blocks_set if b[2] == 0} # Mặt phẳng đáy z = 0
323
+ high_cells = {b for b in blocks_set if b[2] > 0} # Thành phần trên cao z > 0
324
  return connected_components_3d(low_cells), connected_components_3d(high_cells)
325
 
326
 
327
  def handling_low_components_3d(blocks_set):
328
+ """Operation [g-j]: Xử lý dồn ép các cấu trúc khối nằm ở lớp đáy z=0."""
329
  low_comps, _ = get_low_high_components_3d(blocks_set)
330
  if not low_comps:
331
  return None
332
 
333
+ # Tìm thành phần root chứa gốc (0,0,0)
334
  root_comp = None
335
  for comp in low_comps:
336
  if (0, 0, 0) in comp:
 
347
  if not non_root_cells:
348
  return None
349
 
350
+ # Lọc dịch chuyển thuộc thành phần không phải root hướng về phía gốc tọa độ
351
  def filt(c, e, move_type):
352
  if c not in non_root_cells:
353
  return False
 
375
 
376
  def beam_escape_sequence_3d(blocks_set, max_depth=4, beam_width=40, branch_limit=20):
377
  """
378
+ Chuỗi dịch chuyển vĩ mô nhiều bước. Giải phóng các trường hợp bị nghẽn (Unlock trụ).
379
+ Chấp nhận thế năng tăng tạm thời ở các bước trung gian.
380
  """
381
  start_score = compaction_score_3d(blocks_set)
382
  start_pot = potential(blocks_set, 3)
 
448
  if move is not None:
449
  return [move]
450
 
451
+ # 2. Nếu kẹt, sử dụng Beam Search tìm chuỗi thoát hiểm phục vụ "Unlock"
452
  macro_seq = beam_escape_sequence_3d(blocks_set, max_depth=4, beam_width=40, branch_limit=20)
453
  if macro_seq:
454
  return macro_seq