打开/关闭菜单
打开/关闭个人菜单
未登录
如果您进行任何编辑,您的IP地址会公开展示。

用户:JesseM1024:修订间差异

576次编辑2023年6月30日 (星期五)注册
无编辑摘要
(清空全部内容)
标签清空
 
(未显示同一用户的6个中间版本)
第1行: 第1行:
代码备份如下


== 机械动力动力合成器矩阵周期最小化.ipynb ==
=== 调包 ===
<pre>import numpy as np
import matplotlib.pyplot as plt
from collections import deque</pre>
=== 函数定义 ===
<pre>def bfs_depth(grid, ini_pos):
   <nowiki>'''</nowiki>
   grid: 2d np array, only 0, 1
   ini_pos: 2-len python int list, position vec [a,b]
   returns the depth 2d array
   <nowiki>'''</nowiki>
   if not grid.size:
       return np.array([], dtype=int).reshape(0, 0)
   
   # 初始化访问数组并全部填充为-1
   visited = np.full_like(grid, -1, dtype=int)
   temp = ini_pos.copy()
   temp.append(0)
   # 起始点
   queue = deque([tuple(temp)])  # (row, col, depth)
   
   # 定义四个方向的移动
   directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
   
   while queue:
       row, col, depth = queue.popleft()
       
       # 如果当前点不是障碍物(假设0表示障碍物),则更新访问数组
       if grid[row, col] != 0:
           visited[row, col] = depth
           
           # 检查相邻的点
           for dx, dy in directions:
               new_row, new_col = row + dx, col + dy
               
               # 如果相邻点在网格内且未被访问
               if 0 <= new_row < grid.shape[0] and 0 <= new_col < grid.shape[1] and visited[new_row, new_col] == -1:
                   queue.append((new_row, new_col, depth + 1))
   
   return visited
def edge_detector(grid):
   row, col = grid.shape[0], grid.shape[1]
   ava_out_pos_list = []
   directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
   
   for i in range(row):
       for j in range(col):
           if grid[i,j]==1:
               if i==0 or i==row-1 or j==0 or j==col-1:
                   ava_out_pos_list.append([i,j])
               else:
                   exist_0 = False
                   for dx, dy in directions:
                       new_row, new_col = i + dx, j + dy
                       if grid[new_row, new_col] == 0:
                           exist_0 = True
                           break
                   if exist_0 :
                       ava_out_pos_list.append([i,j])
   return ava_out_pos_list</pre>
=== 参数定义 ===
<pre>crafter_array = np.array([[0,0,0,0,1,0,0,0,0],
                          [0,0,0,1,1,1,0,0,0],
                          [1,1,1,1,1,1,1,1,1],
                          [1,1,1,1,1,1,1,1,1],
                          [0,1,1,1,1,1,1,1,0],
                          [0,0,1,1,1,1,1,0,0],
                          [0,1,1,1,1,1,1,1,0],
                          [1,1,1,1,0,1,1,1,1],
                          [1,1,1,0,0,0,1,1,1]
                        ])</pre>
=== 运行1:最优结果绘制 ===
<pre>ava_start = edge_detector(crafter_array)
cur_minimum_steps = np.inf
result = None
start = None
edge_result = np.ones((crafter_array.shape[0],crafter_array.shape[1]))
edge_result = edge_result*-1
for start_pos in ava_start:
   arr = bfs_depth(crafter_array,start_pos)
   temp_step = np.max(arr)
   edge_result[start_pos[0],start_pos[1]] = temp_step
   if temp_step < cur_minimum_steps:
       cur_minimum_steps = temp_step
       result = arr
       start = start_pos
print('minimum steps =',cur_minimum_steps,'and start at ',start)
print(result)
plt.figure()
plt.imshow(result, cmap='viridis', aspect='auto')
plt.colorbar()
plt.title('crafter depth matrix')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()</pre>
=== 运行2:边缘结果绘制 ===
<pre>print(edge_result)
plt.figure()
plt.imshow(edge_result, cmap='viridis', aspect='auto')
plt.colorbar()
plt.title('all output step matrix')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()</pre>

2024年8月4日 (日) 17:28的最新版本