3. Bài toán ứng dụng 2: Bài toán tích lũy dòng chảy – Câu chuyện ngập khi mưa tại đô thị
3.3. [Đọc thêm] Cài đặt thuật toán D8
Dưới đây là một hiện thực cho thuật toán D8 mà hàm tính tích lũy không phải dạng cây đồ thị. Sinh viên có thể đọc hiểu và điều chỉnh theo hướng xây dựng đồ thị với mục đích chính là tính toán tích lũy dòng tại mỗi vị trí.
import math
import numpy as np
def tinh_huong(dem, m_dong, n_cot, vitri):
huong = np.zeros((m_dong, n_cot)) for dong in range(m_dong):
for cot in range(n_cot):
xx, yy, mymax = 0, 0, 0
for i in range(-1,2):
for j in range(-1,2):
if (i*i+j*j>0) and \
(dong+i>=0) and (dong+i<m_dong) and \ (cot+j>=0) and (cot+j<n_cot) and \
(mymax*math.sqrt(i*i+j*j) < dem[dong][cot] - dem[dong+i][cot+j]):
mymax = dem[dong][cot] - dem[dong+i][cot+j] xx = i
Thực hành Toán rời rạc Trang 12 yy = j
huong[dong][cot] = vitri[xx+1][yy+1] return huong
def tinh_tichluy(p, q, m_dong, n_cot): for i in range(-1, 2):
for j in range(-1,2):
if (i*i+j*j>0) and \
(p+i>=0) and (p+i<m_dong) and \ (q+j>=0) and (q+j<n_cot) and \
(huong[p+i][q+j] == vitri[-(i-1)][-(j-1)]):
t1.append(1)
tinh_tichluy(p+i, q+j, m_dong, n_cot)
return len(t1)
vitri = np.array([ [32,64,128],[16,0,1],[8,4,2]])
#dem = [ [0 for j in range(n_cot)] for i in range(m_dong)]
# Giả định dữ liệu địa hình dem là một bảng 6x6 dưới đây:
dem = np.array([ [78,72,69,71,58,49], [74,67,56,49,46,50], [69,53,44,37,38,48], [64,58,55,22,31,24], [68,61,47,21,16,19], [74,53,34,12,11,12] ])
Thực hành Toán rời rạc Trang 13 m_dong = dem.shape[0] #6
n_cot = dem.shape[1] #6
tichluy = np.zeros((m_dong, n_cot)) #[ [0 for j in range(n_cot)] for i in range(m_dong)]
huong = tinh_huong(dem, 6,6, vitri)
for i in range(m_dong): for j in range(n_cot):
t1 = []
tichluy[i][j] = tinh_tichluy(i, j, m_dong, n_cot) print (dem) print (huong) print (tichluy) Kết quả tính toán: ================ RESTART: C:/Anaconda3/Scripts/singleflow.py ================ >>> dem array([[78, 72, 69, 71, 58, 49], [74, 67, 56, 49, 46, 50], [69, 53, 44, 37, 38, 48], [64, 58, 55, 22, 31, 24], [68, 61, 47, 21, 16, 19], [74, 53, 34, 12, 11, 12]])
Thực hành Toán rời rạc Trang 14 >>> huong array([[ 2., 2., 2., 4., 4., 8.], [ 2., 2., 2., 4., 8., 8.], [ 1., 1., 2., 4., 8., 4.], [128., 128., 1., 2., 4., 8.], [ 2., 2., 1., 4., 4., 8.], [ 1., 1., 1., 1., 0., 16.]]) >>> tichluy array([[ 0., 0., 0., 0., 0., 0.], [ 0., 1., 1., 2., 2., 0.], [ 0., 3., 7., 8., 1., 0.], [ 0., 0., 0., 20., 0., 1.], [ 0., 0., 0., 1., 24., 0.], [ 0., 2., 4., 7., 35., 0.]])
Gợi ý: nếu ma trận dem có m dòng và n cột thì chúng ta phải xây dựng cây đồ thị có hướng có
mxn đỉnh. Những đỉnh liên kết với nhau sẽ theo giá trị hướng dòng chảy.