我正在尋找一種演算法,它可以幫助我在一個二維陣列上不為零的點周圍創建一個邊界。讓我舉個例子。
我有以下陣列:]
我想要一種演算法,它能給我提供最有效的方法,讓我在每個小 "島嶼 "周圍創建一個 "路障"。就背景關系而言,每組1代表這個資源管理游戲中的一個資源來源,我想在它周圍建墻,以保護它不受我的對手攻擊。
本質上,這個演算法應該給出下圖中2s的值:
這其中有幾點:
- 陣列總是正方形的,但每個維度的大小可以從12到40不等; 。
- 單元不能在對角線上移動; 。
- 可以有各種島嶼(一組1),可以有各種不規則的形狀; 。
- 有時,如果兩個相鄰的 "島嶼 "離得很近,使用同一個路障來阻擋它們可能會更有效。
在這方面有什么想法嗎?我甚至不知道如何谷歌這個問題,所以我最終沒有找到任何東西。謝謝你!
編輯1。創建初始陣列的代碼 EDIT2:修正了答案
import numpy as np
size = 15
test_mat = np.zeros((size, size))
test_mat[(4, 5, 5, 6) 。(5, 4, 6, 5)] = 1
test_mat[(9, 9, 9, 10, 10, 11, 11)。) (8, 9, 10, 8, 10, 8, 10) ] = 1
uj5u.com熱心網友回復:
這樣如何:
import numpy as np
from scipy.ndimage import binary_dilation, binary_erosion
size=15
test_mat = np.zeros((size, size))
test_mat[(4, 5, 5, 6) 。(5, 4, 6, 5)] = 1
test_mat[(9, 9, 9, 10, 10, 11, 11)。) (8, 9, 10, 8, 10, 8, 10)] = 1.
dilated = binary_dilation(test_mat).astype(int)
eroded = binary_erosion(dilated)
邊界 = 擴張的-侵蝕的
這就得到:
[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 1 0 0 0 0 0 0 0 0 0]
[0 0 0 0 1 0 1 0 0 0 0 0 0 0 0]
[0 0 0 1 0 0 0 1 0 0 0 0 0 0 0]
[0 0 0 0 1 0 1 0 0 0 0 0 0 0 0]
[0 0 0 0 0 1 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 1 1 1 0 0 0 0]
[0 0 0 0 0 0 0 1 0 0 0 1 0 0 0]
[0 0 0 0 0 0 0 1 0 0 0 1 0 0 0]
[0 0 0 0 0 0 0 1 0 1 0 1 0 0 0]
[0 0 0 0 0 0 0 0 1 0 1 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
uj5u.com熱心網友回復:
這并沒有解決我的問題,只是想把我的一個想法公布出來。下面是代碼:
import numpy
# generate the map
size = 15
test_mat = np.zeros((size, size))
test_mat[(4, 5, 5, 6) 。(5, 4, 6, 5)] = 1
test_mat[(9, 9, 9, 10, 10, 11, 11)。) (8, 9, 10, 8, 10, 8, 10)] = 1.
# 通過應用抽搐來找到解決方案。
conv_mat = np.array([
[0, 1, 0] 。
[1, 1, 1] 。
[0, 1, 0]])
conv = convolve(test_mat, conv_mat)
conv[test_mat > 0] =0
conv[conv > 0] = 2。
conv[test_mat > 0] = 1 # 標記資源為1。
使用這段代碼你會得到:
然而,正如你所看到的,當有一個缺口時,這并不能找到正確的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/332333.html
標籤:
上一篇:在字串中進行無效的字面操作



