[Đọc thêm] Cài đặt thuật toán D8

Một phần của tài liệu Thực hành Toán rời rạc (Tài liệu phục vụ sinh viên ngành Khoa học dữ liệu) (Trang 125 - 128)

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.

Một phần của tài liệu Thực hành Toán rời rạc (Tài liệu phục vụ sinh viên ngành Khoa học dữ liệu) (Trang 125 - 128)

Tải bản đầy đủ (PDF)

(128 trang)