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

用户:JesseM1024:修订间差异

576次编辑2023年6月30日 (星期五)注册
无编辑摘要
无编辑摘要
第4行: 第4行:


=== 调包 ===
=== 调包 ===
<code>import numpy as np</code>
import numpy as np


<code>import matplotlib.pyplot as plt</code>
import matplotlib.pyplot as plt


<code>from collections import deque</code>
from collections import deque


=== 函数定义 ===
=== 函数定义 ===
<code>def bfs_depth(grid, ini_pos):</code>
def bfs_depth(grid, ini_pos):


<code>   <nowiki>'''</nowiki></code>
   <nowiki>'''</nowiki>


<code>   grid: 2d np array, only 0, 1</code>
   grid: 2d np array, only 0, 1


<code>   ini_pos: 2-len python int list, position vec [a,b]</code>
   ini_pos: 2-len python int list, position vec [a,b]


<code>   returns the depth 2d array</code>
   returns the depth 2d array


<code>   <nowiki>'''</nowiki></code>
   <nowiki>'''</nowiki>


<code>   if not grid.size:</code>
   if not grid.size:


<code>       return np.array([], dtype=int).reshape(0, 0)</code>
       return np.array([], dtype=int).reshape(0, 0)


<code>   </code>
   


<code>   # 初始化访问数组并全部填充为-1</code>
   # 初始化访问数组并全部填充为-1


<code>   visited = np.full_like(grid, -1, dtype=int)</code>
   visited = np.full_like(grid, -1, dtype=int)


<code>   temp = ini_pos.copy()</code>
   temp = ini_pos.copy()


<code>   temp.append(0)</code>
   temp.append(0)


<code>   # 起始点</code>
   # 起始点


<code>   queue = deque([tuple(temp)])  # (row, col, depth)</code>
   queue = deque([tuple(temp)])  # (row, col, depth)


<code>   </code>
   


<code>   # 定义四个方向的移动</code>
   # 定义四个方向的移动


<code>   directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]</code>
   directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]


<code>   </code>
   


<code>   while queue:</code>
   while queue:


<code>       row, col, depth = queue.popleft()</code>
       row, col, depth = queue.popleft()


<code>       </code>
       


<code>       # 如果当前点不是障碍物(假设0表示障碍物),则更新访问数组</code>
       # 如果当前点不是障碍物(假设0表示障碍物),则更新访问数组


<code>       if grid[row, col] != 0:</code>
       if grid[row, col] != 0:


<code>           visited[row, col] = depth</code>
           visited[row, col] = depth


<code>           </code>
           


<code>           # 检查相邻的点</code>
           # 检查相邻的点


<code>           for dx, dy in directions:</code>
           for dx, dy in directions:


<code>               new_row, new_col = row + dx, col + dy</code>
               new_row, new_col = row + dx, col + dy


<code>               </code>
               


<code>               # 如果相邻点在网格内且未被访问</code>
               # 如果相邻点在网格内且未被访问


<code>               if 0 <= new_row < grid.shape[0] and 0 <= new_col < grid.shape[1] and visited[new_row, new_col] == -1:</code>
               if 0 <= new_row < grid.shape[0] and 0 <= new_col < grid.shape[1] and visited[new_row, new_col] == -1:


<code>                   queue.append((new_row, new_col, depth + 1))</code>
                   queue.append((new_row, new_col, depth + 1))


<code>   </code>
   


<code>   return visited</code>
   return visited






<code>def edge_detector(grid):</code>
def edge_detector(grid):


<code>   row, col = grid.shape[0], grid.shape[1]</code>
   row, col = grid.shape[0], grid.shape[1]


<code>   ava_out_pos_list = []</code>
   ava_out_pos_list = []


<code>   directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]</code>
   directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]


<code>   </code>
   


<code>   for i in range(row):</code>
   for i in range(row):


<code>       for j in range(col):</code>
       for j in range(col):


<code>           if grid[i,j]==1:</code>
           if grid[i,j]==1:


<code>               if i==0 or i==row-1 or j==0 or j==col-1:</code>
               if i==0 or i==row-1 or j==0 or j==col-1:


<code>                   ava_out_pos_list.append([i,j])</code>
                   ava_out_pos_list.append([i,j])


<code>               else:</code>
               else:


<code>                   exist_0 = False</code>
                   exist_0 = False


<code>                   for dx, dy in directions:</code>
                   for dx, dy in directions:


<code>                       new_row, new_col = i + dx, j + dy</code>
                       new_row, new_col = i + dx, j + dy


<code>                       if grid[new_row, new_col] == 0:</code>
                       if grid[new_row, new_col] == 0:


<code>                           exist_0 = True</code>
                           exist_0 = True


<code>                           break</code>
                           break


<code>                   if exist_0 :</code>
                   if exist_0 :


<code>                       ava_out_pos_list.append([i,j])</code>
                       ava_out_pos_list.append([i,j])


<code>   return ava_out_pos_list</code>
   return ava_out_pos_list


=== 参数定义 ===
=== 参数定义 ===

2024年7月31日 (三) 10:23的版本

代码备份如下

机械动力动力合成器矩阵周期最小化.ipynb

调包

import numpy as np

import matplotlib.pyplot as plt

from collections import deque

函数定义

def bfs_depth(grid, ini_pos):

   '''

   grid: 2d np array, only 0, 1

   ini_pos: 2-len python int list, position vec [a,b]

   returns the depth 2d array

   '''

   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

参数定义

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]
                        ])

运行1:最优结果绘制

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()

运行2:边缘结果绘制

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()