Tải bản đầy đủ (.pdf) (61 trang)

Thu hút vốn đầu tư để phát triển du lịch ở huyện phú vang, tỉnh thừa thiên huế

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.16 MB, 61 trang )

ĐẠI HỌC HUẾ
TRƯỜNG ĐẠI HỌC KINH TẾ HUẾ
KHOA HỆ THỐNG THÔNG TIN KINH TẾ

tế

H

uế

-----o0o-----

nh

KHÓA LUẬN TỐT NGHIỆP ĐẠI HỌC

Ki

ĐỀ TÀI:

c

ÁP DỤNG THUẬT TOÁN DI TRUYỀN ĐỂ GIẢI

Đ

ại

họ

BÀI TOÁN NGƯỜI DU LỊCH



Giáo viên hướng dẫn:

Sinh viên thực hiện:

TS. Nguyễn Đình Hoa Cương

Thái Công Danh
Lớp: K47 Tin Học Kinh Tế
MSV: 13K4081015

Huế, 2017


GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp

Lời Cám Ơn

Đ

ại

họ

c

Ki


nh

tế

H

uế

Để hoàn thành tốt khoá học vừa qua cũng như khoá luận tốt
nghiệp này, em đã nhận được sự hướng dẫn, giúp đỡ và góp ý
nhiệt tình của quý thầy cô trường Đại học Kinh Tế Huế và những
chia sẻ, gắn bó của gia đình, bạn bè người thân.
Trước hết, em xin chân thành cảm ơn đến quý thầy cô trường
Đại học Kinh Tế Huế, đặc biệt là những thầy cô đã tận tình dạy bảo
cho em suốt thời gian học tập tại trường.
Em xin gửi lời biết ơn sâu sắc đến Tiến sĩ Nguyễn Đình Hoa
Cương. Người thầy đã dành rất nhiều thời gian, tâm huyết để
hướng dẫn nghiên cứu và giúp em hoàn thành luận văn tốt nghiệp
này.
Đồng thời, em xin cảm ơn quý anh, chị và ban lãnh đạo Công
ty FPT Software Đà Nẵng đã tạo điều kiện cho em được thực tập
để có được dữ liệu hoàn thành tốt luận văn này.
Cuối cùng em muốn gửi lời cảm ơn đến gia đình em, tất cả
bạn vè và người thân những người đã giúp đỡ, chia sẻ và chỉ dẫn
cho em những điều bổ ích trong suốt quá trình theo học vừa rồi.
Mặc dù đã có nhiều cố gắng hoàn thiện khóa luận bằng tất cả
tâm huyết và khả năng của mình, tuy nhiên không thể tránh khỏi
những thiếu sót, rất mong được những đóng góp quý báu của quý
thầy cô và các bạn.
Huế, tháng 5 năm 2017


SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang i


GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp

MỤC LỤC
LỜI CÁM ƠN .................................................................................................................i
MỤC LỤC ..................................................................................................................... ii
DANH MỤC CÁC CHỮ VIẾT TẮT VÀ KÍ HIỆU ................................................. iv
DANH MỤC CÁC SƠ ĐỒ, ĐỒ THỊ ...........................................................................v
DANH MỤC CÁC BIỂU BẢNG ................................................................................ vi
PHẦN I: ĐẶT VẤN ĐỀ ................................................................................................1
1. Lý do chọn đề tài: .....................................................................................................1

uế

2. Mục tiêu nghiên cứu: ...............................................................................................2
3. Đối tượng và phạm vi nghiên cứu:...........................................................................2

H

4. Phương pháp nghiên cứu: ........................................................................................2

tế


5. Nội dung khóa luận: .................................................................................................3

nh

PHẦN II: NỘI DUNG VÀ KẾT QUẢ NGHIÊN CỨU..............................................4
CHƯƠNG 1: CƠ SỞ LÝ LUẬN ...............................................................................4

Ki

1.1. Bài toán người du lịch (Traveling Salesman Problem – TSP) ..........................4

c

1.1.1. Lịch sử: ........................................................................................................4

họ

1.1.2. Phát biểu bài toán: .......................................................................................5
1.1.3. Lý thuyết độ phức tạp tính toán: .................................................................7

ại

1.2. Thuật toán di truyền (Genetic Algorithm) .......................................................10

Đ

1.2.1. Lịch sử của thuật toán di truyền ................................................................10
1.2.2. Tư tưởng của thuật toán di truyền .............................................................12
1.2.3. Khởi tạo quần thể ......................................................................................15
1.2.4. Phép chọn lọc ............................................................................................15

1.2.5. Phép lai (cross over) ..................................................................................15
1.2.6. Phép đột biến (mutation) ...........................................................................15
1.2.7. Điều kiện dừng ..........................................................................................16
1.3. Áp dụng thuật toán di truyền để giải bài toán người du lịch ...........................16
1.3.1. Khởi tạo quần thể ......................................................................................16
1.3.2. Tính độ thích nghi cho các cá thể ..............................................................17
SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang ii


GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp

1.3.3. Phép chọn lọc ............................................................................................18
1.3.4. Phép lai: .....................................................................................................18
1.3.5. Phép đột biến .............................................................................................19
1.3.6. Điều kiện dừng ..........................................................................................19
1.4. Các công trình có liên quan: ............................................................................20
CHƯƠNG 2: CÀI ĐẶT THUẬT TOÁN DI TRUYỀN ĐỂ GIẢI BÀI TOÁN
NGƯỜI DU LỊCH ....................................................................................................25
2.1. Phân tích thiết kế hướng đối tượng..................................................................25
2.2. Cài đặt thuật toán di truyền để giải bài toán người du lịch..............................28

uế

2.2.1. Lớp thành phố............................................................................................28

H


2.2.2. Lớp Danh Sách Thành Phố: ......................................................................29
2.2.3. Lớp Chu Trình: ..........................................................................................31

tế

2.2.4. Lớp Quần Thể: ..........................................................................................33

nh

2.2.5. Cài đặt thuật toán di truyền .......................................................................35
2.2.6. Hàm Main:.................................................................................................40

Ki

2.2.7. Thêm các thành phố đầu vào cho chương trình ........................................41

c

2.3. Kết quả chương trình .......................................................................................44

họ

CHƯƠNG 3: THÍ NGHIỆM CHƯƠNG TRÌNH .................................................45
3.1. Thí nghiệm chương trình với số thành phố tăng dần .......................................45

ại

3.2. Thí nghiệm kết quả chương trình với số thế hệ tăng dần ................................46


Đ

3.3. So sánh thời gian chạy của thuật toán di truyền với thuật toán duyệt sâu (DFS
– Depth first search )...............................................................................................47
3.4. Kết Luận ..........................................................................................................50
TÀI LIỆU THAM KHẢO...........................................................................................53

SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang iii


GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp

DANH MỤC CÁC CHỮ VIẾT TẮT VÀ KÍ HIỆU

Genetic Algorithm – Thuật toán di truyền

DFS

Depth first search – Thuật toán duyệt sâu

TSP

Travelling Salesmen Problem - Bài toán
người du lịch

P


Polynomial – đa thức

uế

GA

H

Non-Polynomial – không phải đa thức

Đ

ại

họ

c

Ki

nh

tế

NP

SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang iv



GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp

DANH MỤC CÁC SƠ ĐỒ, ĐỒ THỊ
Hình 1.1: Ví dụ về bài toán người du lịch .......................................................................6
Hình 1.2: Chu trình với độ dài ngắn nhất ........................................................................6
Hình 1.3: Mô tả các lớp độ phức tạp thuật toán .............................................................9
Hình 1.4: Lưu đồ thuật toán của thuật toán di truyền....................................................14
Hình 1.5: Ví dụ về cách biểu diễn giải pháp theo lộ trình.............................................17
Hình 1.6: Ví dụ khởi tạo quần thể gồm n chu trình .......................................................17
Hình 1.7: Áp dụng phép lai với bài toán người du lịch .................................................19

uế

Hình 1.8: Áp dụng phép đột biến với bài toán người du lịch ........................................19

H

Hình 2.1: Biểu đồ lớp (Class diagram) cho thuật toán di truyền...................................27

tế

Hình 2.2: File input.txt ..................................................................................................42
Hình 2.3: Kết quả chạy thuật toán .................................................................................44

nh


Hình 3.1: Biểu đồ thời gian chạy của chương trình khi số thành phố tăng dần ............46

Ki

Hình 3.2: Biểu đồ so sánh thời gian chạy của thuật toán di truyền so với thuật toán

Đ

ại

họ

c

DFS ................................................................................................................................50

SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang v


GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp

DANH MỤC CÁC BIỂU BẢNG
Bảng 1.1: Các cột mốc lịch sử của bài toán người du lịch ..............................................5
Bảng 1.2: Các lớp độ phức tạp thuật toán .......................................................................8
Bảng 1.3: Số lượng các chu trình khi số đỉnh của đồ thị tăng lên: ................................10
Bảng 3.1: Thời gian chạy của chương trình khi số thành phố tăng dần ........................45

Bảng 3.2: Kết quả chạy chương trình khi số thế hệ tăng dần ........................................47

Đ

ại

họ

c

Ki

nh

tế

H

uế

Bảng 3.3: So sánh thuật toán di truyền và thuật toán duyệt sâu (DFS) .........................49

SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang vi


GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp


PHẦN I: ĐẶT VẤN ĐỀ
1. Lý do chọn đề tài:
Bài toán người du lịch (hay còn gọi là bài toán người bán hàng) là một trong
những bài toán nổi tiếng nhất thuộc lớp các bài toán tối ưu tổ hợp. Tuy phát biểu của
bài toán khá đơn giản, nhưng việc giải quyết nó sao cho tìm được kết quả tốt trong thời
gian chấp nhận được là một vấn đề nan giải. Hiện nay, việc tìm lời giải hiệu quả cho
bài toán này vẫn đang được các nhà khoa học, các nhà nghiên cứu tiếp tục tìm tòi, thử
nghiệm. Những hướng giải quyết mới không ngừng được phát triển, có thể từ các thuật
toán nền tảng cơ bản hay đưa ra những hướng giải quyết mới, sáng tạo hơn. Nhưng

uế

mục đích cuối cùng, sâu xa hơn chính là việc giải được một bài toán thuộc lớp bài toán

H

NP-Đầy đủ (NP-Complete) như bài toán người du lịch sẽ là tiền đề để giải quyết tất cả
các bài toán còn lại thuộc lớp các bài toán này, và chứng minh được lớp độ phức tạp

tế

thuật toán P = NP, một vấn đề lâu nay vẫn gây rất nhiều tranh cãi trong lý thuyết độ

nh

phức tạp tính toán.

Thuật toán di truyền (Genetic Algorithm) là một hướng đi mới, rất sáng tạo


Ki

trong việc giải quyết bài toán người du lịch. Nó vận dụng tư tưởng tiến hóa trong tự

c

nhiên, gần gũi với con người để giải quyết bài toán. Ý tưởng thuật toán xuất phát từ

họ

quan sát thấy rằng, quá trình tiến hóa trong tự nhiên thường mang tính tối ưu, tức là
thế hệ sau thường sẽ kế thừa và phát triển hơn các thế hệ trước đó. Thuật toán này cho

ại

ra kết quả rất khả quan nếu so sánh với các thuật toán khác trong thời gian chạy chấp

Đ

nhận được. Bên cạnh đó, điểm thú vị của thuật toán này chính là áp dụng các khái
niệm sinh học gần gũi trong tự nhiên như tiến hóa, lai ghép, chọn lọc tự nhiên để áp
dụng vào cài đặt. Khiến nó vừa dễ hiểu, dễ hình dung, lại cho ta thấy rõ ràng hơn cách
thức thực hiện thuật toán. Chính vì thế, thuật toán di truyền đang rất thu hút rất đông
các nhà nghiên cứu đi sâu vào tìm tòi và phát triển.
Xuất phát từ sự tìm hiểu, nghiên cứu về bài toán người du lịch cũng như thuật
toán di truyền, cũng như xem xét tính ứng dụng của chúng trong giải quyết các vấn đề
thực tế như tìm lộ trình ngắn nhất giữa các thành phố trong thực tế, áp dụng thuật toán
vào các công cụ bản đồ,... Em đã quyết định chọn đề tài: “Áp dụng thuật toán di

SV: Thái Công Danh-K47 Tin Học Kinh Tế


Trang 1


GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp

truyền để giải bài toán người du lịch” làm đề tài khóa luận tốt nghiệp để nghiên cứu
sâu hơn về vấn đề này.
2. Mục tiêu nghiên cứu:
- Mục tiêu tổng quát:
Dựa trên các nghiên cứu cụ thể về bài toán người du lịch cũng như thuật toán di
truyền để xây dựng chương trình giải quyết bài toán người du lịch, kiểm thử tính hiệu
quả của thuật toán.
- Mục tiêu cụ thể:
 Nghiên cứu cơ sở lý luận về bài toán người du lịch cũng như thuật toán di

uế

truyền, lịch sử, tư tưởng, các bước thực hiện thuật toán.

H

 Nghiên cứu cách cài đặt thuật toán bằng ngôn ngữ lập trình Java và cài đặt
thuật toán di truyền.

tế

 Tiến hành kiểm thử thuật toán, đánh giá tính hiệu quả cũng như thời gian


nh

chạy của thuật toán.

3. Đối tượng và phạm vi nghiên cứu:

Ki

- Đối tượng nghiên cứu: Thuật toán di truyền áp dụng để giải quyết bài toán

c

người du lịch.

họ

- Phạm vi nghiên cứu: Phạm vi của đề tài bao gồm thuật toán di truyền, bài toán
người du lịch, cách áp dụng thuật toán di truyền để giải bài toán người du lịch và các

ại

vấn đề liên quan.

Đ

4. Phương pháp nghiên cứu:
- Phương pháp nghiên cứu tài liệu: sử dụng các kiến thức tìm hiểu được từ
trong các tài liệu như sách vở, báo chí, internet. Chủ động tìm hiểu những vấn đề liên
quan đến đề tài, tham khảo các nội dung liên quan đến thuật toán di truyền, bài toán

người du lịch để có những hiểu biết chính xác về những vấn đề này.
-Phương pháp hỏi ý kiến chuyên gia: Tham khảo, hỏi ý kiến các chuyên gia, các
nhà nghiên cứu am hiểu về vấn đề này để củng cố thêm kiến thức về đề tài.
- Phương pháp phân tích thiết kế: phân tích, xây dựng chương trình một cách
hợp lý, khoa học, phù hợp với tư tưởng của thuật toán.

SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang 2


GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp
5. Nội dung khóa luận:

Nội dung của khóa luận này gồm có 3 chương:
 Chương 1: Cơ sở lý luận
Chương này sẽ trình bày toàn bộ các nội dung lý thuyết về đề tài nghiên cứu.
Bao gồm lịch sử, cách phát biểu bài toán người du lịch, lý thuyết độ phức tạp tính
toán, độ phức tạp của bài toán người du lịch,… Trình bày về tư tưởng, lịch sử, các
bước để thực hiện thuật toán di truyền và cách áp dụng thuật toán di truyền trong
trường hợp giải quyết bài toán người du lịch.
 Chương 2: Cài đặt thuật toán di truyền để giải bài toán người du lịch

uế

Chương này sẽ mô tả cách thức cài đặt thuật toán một cách chi tiết, bao gồm
phân tích thiết kế chương trình, cách xây dựng các lớp theo phương pháp lập trình


tế

 Chương 3: Thí nghiệm chương trình

H

hướng đối tượng và cách cài đặt chương trình cụ thể bằng ngôn ngữ lập trình Java.

nh

Chương này sẽ trình bày các kết quả kiểm thử chương trình, xác minh tính
chính xác, thời gian chạy cũng như so sánh hiệu quả của chương trình với các thuật

Đ

ại

họ

c

Ki

toán liên quan.

SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang 3



GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp

PHẦN II: NỘI DUNG VÀ KẾT QUẢ NGHIÊN CỨU
CHƯƠNG 1: CƠ SỞ LÝ LUẬN
1.1. Bài toán người du lịch (Traveling Salesman Problem – TSP)
1.1.1. Lịch sử:
Vấn đề toán học liên quan đến bài toán người du lịch đã được nghiên cứu từ
những năm 1800 bởi nhà toán học Ai-Len William Rowan Hamilton và nhà toán học
người Anh Thomas Penyngton Kirkman. Hamilton đã tạo ra một trò chơi gọi là
Icosian vào năm 1857, trò chơi này yêu cầu người chơi phải hoàn thành một chu trình
mà chỉ sử dụng những đường kết nối cho trước qua 20 đỉnh [12].

uế

Bài toán người du lịch được nghiên cứu đầu tiên vào năm 1930 bởi nhà toán

H

học và kinh tế học Karl Menger tại đại học Vienna và Harvard. Sau đó nó được nghiên
cứu bởi Hassler Whitney và Merrill Flood tại đại học Princeton. Vào những năm 1940

tế

bài toán người du lịch được nghiên cứu bởi những nhà thống kê học là Mahalanobis,

nh

Jessen, Gosh, và Marks liên quan đến các ứng dụng nông nghiệp, và nhà toán học


Ki

Merill Flood phổ biến nó với các đồng nghiệp tại công ty RAND.
Phương pháp giải của bài toán bắt đầu xuất hiện trong các tài liệu vào giữa

c

những năm 1950, các tài liệu sử dụng một số thay đổi nhỏ về thuật ngữ "Bài toán

họ

người du lịch". Trong những thế kỷ sau đó, bài toán được nghiên cứu bởi rất nhiều nhà

ại

toán học, khoa học máy tính, hóa học, vật lý và những ngành khoa học khác.

Đ

Mặc dù bài toán người du lịch khá dễ hiểu, tuy nhiên nó rất khó giải quyết.
Richard M. Karp đã chứng minh vào năm 1972 rằng bài toán tìm chu trình Hamilton là
bài toán NP-đầy đủ (NP-Complete). NP-khó (NP-hard), là một lớp các bài toán khó
nhất trong NP, nói cách khác nó không có thuật toán nào có thể giải bài toán người du
lịch trong thời gian đa thức. Điều này cung cấp một sự giải thích khoa học cho sự khó
khăn trong việc tìm ra chu trình tối ưu.
Những phương pháp giải quyết bài toán người du lịch đã trở nên phức tạp và
các phương pháp khả thi xuất hiện ngày càng nhiều. Dưới đây là một bảng tổng hợp
mốc lịch sử của bài toán người du lịch :


SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang 4


GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp

Bảng 1.1: Các cột mốc lịch sử của bài toán người du lịch
Năm

Người nghiên cứu
G. Dantzig, R. Fulkerson, và
S. Johnson
M. Held và R.M. Karp
P.M. Camerini, L. Fratta, và
F. Maffioli
M. Grötschel
H. Crowder và M.W.
Padberg
M. Padberg và G. Rinaldi
M. Grötschel và O. Holland
M. Padberg và G. Rinaldi
D. Applegate, R. Bixby, V.
Chvátal, và W. Cook
D. Applegate, R. Bixby, V.
Chvátal, và W. Cook
D. Applegate, R. Bixby, V.
Chvátal, và W. Cook

D. Applegate, R. Bixby, V.
Chvátal, W. Cook, và K.
Helsgaun

1954
1971
1975
1977
1980

49 thành phố
64 thành phố
67 thành phố
120 thành phố
318 thành phố
532 thành phố
666 thành phố
2.392 thành phố

uế

1987
1987
1987

Số thành phố giải được

H

1994


tế

1998

nh

2001

13.509 thành phố
15.112 thành phố
24.978 thành phố

Ki

2004

7.397 thành phố

1.1.2. Phát biểu bài toán:

họ

c

Có rất nhiều cách để phát biểu bài toán người du lịch, tuy nhiên tư tưởng của
bài toán là giống nhau:

ại


• Bài toán người du lịch liên quan đến một người du lịch muốn thực hiện một

Đ

chuyến đi qua một số thành phố sử dụng đường đi ngắn nhất có thể và thăm mỗi thành
phố chỉ một lần sau đó trở về thành phố bắt đầu [18].
• Nếu một người du lịch muốn thăm đúng một lần mỗi thành phố của một danh
sách m thành phố (chi phí đi từ thành phố i tới thành phố j là cij) và sau đó trở về thành
phố bắt đầu. Lộ trình ít tốn kém nhất mà người du lịch có thể đi là bao nhiêu [10] ?
• Cho một danh sách các thành phố và đường đi giữa chúng, hãy tìm chu trình
ngắn nhất có thể (chu trình Hamilton) đi qua mỗi thành phố đúng một lần [12].
Ta có thể phát biểu lại bài toán như sau:
Có n thành phố mà một người du lịch muốn đi tham quan. Giữa các thành phố
đó có khoảng cách dài ngắn khác nhau. Xuất phát từ một thành phố bất kì, người đó
SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang 5


GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp

muốn đi qua tất cả các thành phố còn lại, mỗi thành phố đi qua đúng một lần rồi quay
trở về thành phố ban đầu.
 Yêu cầu: Hãy tìm hành trình với quãng đường đi là ngắn nhất.
- Ví dụ:

tế


H

uế

Cho 4 thành phố với khoảng cách giữa các thành phố như hình sau:

nh

Hình 1.1: Ví dụ về bài toán người du lịch

Ki

Xuất phát từ thành phố 1, chu trình ngắn nhất mà ta có thể tìm được chính là

họ

c

qua thành phố 2 , thành phố 4, thành phố 3 rồi trở về thành phố 1 với tổng độ dài là 80.

20

ại
Đ

1

10

15


4
30

25

2

3

35

T

ổng
: 80 độ dài

Hình 1.2: Chu trình với độ dài ngắn nhất

SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang 6


GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp

Nếu phát biểu theo lý thuyết đồ thị, ta có thể dễ dàng liên tưởng các thành phố
như các đỉnh của đồ thị, các đường đi chính là các cạnh và khoảng cách chính là trọng

số của cạnh đó. Có thể phát biểu ngắn gọn bài toán theo lý thuyết đồ thị như sau:
“Cho đồ thị đầy đủ (giữa 2 cạnh bất kì đều có đường đi). Hãy tìm chu trình
Hamilton với tổng các trọng số các cạnh trong chu trình là nhỏ nhất.”
Chú thích: Chu trình Hamilton là chu trình xuất phát từ một đỉnh của đồ thị, đi
qua tất cả các đỉnh khác, mỗi đỉnh đúng một lần rồi quay lại đỉnh ban đầu.
Trong phạm vi khóa luận này, chúng ta sẽ giải quyết bài toán người du lịch
trong hệ trục tọa độ với mỗi đỉnh xác định bằng tung độ x và hoành độ y, và khoảng

uế

cách giữa chúng được tính bằng công thức:

𝒅(𝒊, 𝒋) = �(𝒙𝒊 − 𝒙𝒋 )𝟐 + (𝒚𝒊 − 𝒚𝒋 )𝟐

H

(1)

tế

Mặc dù bài toán người du lịch rất dễ hiểu, nhưng giải quyết nó thì không hề đơn
giản. Phần tiếp theo sẽ trình bày về lý thuyết độ phức tạp tính toán và phân tích độ

nh

phức tạp của bài toán người du lịch.

Ki

1.1.3.Lý thuyết độ phức tạp tính toán:

 Khái niệm

họ

c

Để phân loại các vấn đề đó theo độ khó của chúng, người ta đưa ra khái niệm lý
thuyết độ phức tạp tính toán.

ại

Khái niệm: “Độ phức tạp tính toán là sự biểu thị toán học về độ khó của một

Đ

vấn đề, chỉ sự hao tốn những tài nguyên được đòi hỏi bởi máy tính để giải vấn đề đó.
Quá trình nghiên cứu về những sự biểu thị đó được gọi là lý thuyết độ phức tạp tính
toán và nó rất quan trọng trong nhiều nhánh của khoa học máy tính, đặc biệt là ngành
mã hóa” [4].
 Các lớp độ phức tạp
Một lớp độ phức tạp là một tập hợp các vấn đề có độ phức tạp tương tự nhau.
Trong Lý thuyết độ phức tạp thuật toán, có các lớp độ phức tạp đáng chú ý như sau:

SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang 7


GVHD: TS. Nguyễn Đình Hoa Cương


Khóa luận tốt nghiệp

Bảng 1.2: Các lớp độ phức tạp thuật toán
Lớp độ phức tạp

Định nghĩa
P là viết tắt của “polynomial”, tức là
đa thức, là một trong những lớp cơ bản nhất
trong các lớp độ phức tạp tính toán. Một
vấn đề được xếp vào lớp P, nếu như có
thuật toán có thể giải quyết bài toán trong

P

thời gian đa thức .
Ví dụ: với mỗi “đầu vào” N cho ra

uế

kết quả sau P(N) phép toán (cộng, trừ, nhân
chia,…), trong đó P là một đa thức nào đó.

H

NP là viết tắt của "nondeterministic

tế

polynomial time" (thuật toán bất định trong
thời gian đa thức). Một vấn đề thuộc lớp


nh

NP khi có một thuật toán kiểm tra lời giải

sao cho mỗi khi có 1 lời giải cho 1 input có

NP

Đ

ại

họ

c

Ki

độ dài N thì thuật toán kiểm tra lời giải sẽ

NP-Complete

cho biết là lời giải có đúng hay không sau

không quá P(N) phép toán đơn giản, trong
đó P là một đa thức (không phụ thuộc vào
input).
Đây là lớp các bài toán khó nhất
trong NP. mọi bài toán khác thuộc lớp NP

đều có thể đưa được về một bài toán NPcomplete cho trước bằng một phép biến đổi
sử dụng một lượng thời gian là đa thức.
Là lớp các bài toán ít nhất là khó

NP-Hard

bằng NP-Complete. Chú ý rằng NP-Hard
không cần phải ở trong NP.

SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang 8


GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp

Vấn đề liệu P có bằng NP hay không vẫn là một vấn đề gây ra tranh cãi trong lý
thuyết độ phức tạp tính toán. Trong khuôn khổ của khóa luận này, chúng ta sẽ không
bàn đến vấn đề này. Để dễ hình dung, ta có thể thấy phạm vi của các lớp độ phức tạp

c

Ki

nh

tế


H

uế

tính toán qua hình vẽ sau:

họ

Hình 1.3: Mô tả các lớp độ phức tạp thuật toán [5]

ại

 Độ phức tạp của bài toán người du lịch
Để giải bài toán người du lịch, ta cần phải tìm ra chu trình Hamilton với tổng trọng

Đ

số các cạnh là nhỏ nhất. Trong trường hợp đồ thị có ít đỉnh, ta có thể sử dụng phương
án vét cạn tất cả các chu trình rồi tìm ra chu trình nhỏ nhất. Tuy nhiên, với số đỉnh của
đồ thị tăng lên, thì phương án vét cạn là bất khả thi vì không có máy tính nào đủ nhanh
để có thể duyệt qua các phương án đó trong thời gian ngắn. Bảng dưới đây thống kê số
lượng các chu trình khi số đỉnh của đồ thị tăng lên:

SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang 9


GVHD: TS. Nguyễn Đình Hoa Cương


Khóa luận tốt nghiệp

Bảng 1.3: Số lượng các chu trình khi số đỉnh của đồ thị tăng lên:
Số cạnh

Số lượng chu trình

6

15

120

7

21

720

8

28

5,040

9

36

40,320


10

45

362,880

11

55

3,628,800

12

66

3.991680x107

13

78

4.790016x108

14

91

6.227021x109


15

105

16

120

17

136

18

153

uế

Số đỉnh

nh

tế

H

8.717829x1010

19


171

1.307674x1012
2.092279x1013
3.556874x1014
6.402374x1015

Đ

ại

họ

c

Ki

20
190
1.216451x1017
Với số đỉnh là n thì số chu trình sẽ là (n-1)! chu trình. Với số đỉnh càng lớn thì
số chu trình càng lớn. Ví dụ như với 20 đỉnh, số chu trình cần phải duyệt qua đến hơn
121 triệu tỷ chu trình. Với khả năng của các máy tính hiện tại thì việc giải chính xác
bài toán này với những trường hợp như vậy dường như là bất khả thi.
Các nghiên cứu đã chứng minh rằng bài toán người du lịch thuộc lớp các bài
toán có độ phức tạp NP-Complete [15], điều này chứng tỏ vẫn chưa có lời giải cho bài
toán này trong thời gian đa thức. Đây hiện vẫn là một trong những bài toán thu hút rất
đông các nhà nghiên cứu tìm tòi cách giải. Vì các bài toán thuộc lớp NP-Complete ít
nhiều có sự tương đồng, chỉ cần tìm ra cách giải một bài toán có thể tìm ra cách giải tất

cả các bài toán còn lại.
Hiện nay có khá nhiều cách giải cho bài toán này nhưng hầu hết chỉ là các cách
giải gần đúng. Mục đích chính là tìm ra phương án tốt nhất trong thời gian chấp nhận
được. Thuật toán di truyền (Genetic Algorithm) là một trong những phương pháp tốt
nhất đã được sử dụng rộng rãi để giải các biến thể của bài toán người du lịch.
1.2. Thuật toán di truyền (Genetic Algorithm)
1.2.1. Lịch sử của thuật toán di truyền
SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang 10


GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp

Trong những năm 1950 và 1960, một vài nhà khoa học máy tính đã nghiên cứu
những hệ thống tiến hóa (evolutionary systems) với ý tưởng sự tiến hóa có thể được sử
dụng như một công cụ tối ưu hóa cho những vấn đề kỹ thuật. Ý tưởng trong tất cả
những hệ thống đó là: tiến hành tiến hóa một quần thể của những phương án cho một
vấn đề cho trước, sử dụng những toán tử được liên tưởng từ sự di truyền và chọn lọc tự
nhiên [13].
Trong những năm 1960, Rechenberg (1965-1973) giới thiệu “những chiến lược
tiến hóa” (tiếng Đức là Evolutionsstrategie). Đây là phương pháp mà ông sử dụng để
tối ưu những tham số giá trị thực cho những thiết bị như cánh máy bay. Ý tưởng này

uế

được phát triển thêm bởi Schwefel (1975-1977). Lĩnh vực chiến lược tiến hóa đã duy
trì một phạm vi nghiên cứu, hầu hết phát triển độc lập với lĩnh vực của thuật toán di


H

truyền (mặc dù gần đây 2 cộng đồng đã bắt đầu tương tác với nhau).

tế

Fogel, Owens, and Walsh (1966) đã phát triển “lập trình tiến hóa”, một kĩ thuật

nh

mà những giải pháp cho nhiệm vụ được giao dược biểu diễn như là trạng thái hạn chế
của các máy móc, thiết bị. Chúng được tiến hóa sự đột biến ngẫu nhiên những biểu đồ

Ki

trạng thái biến đổi của chúng và chọn ra cái phù hợp nhất. Như vậy, chiến lược tiến

họ

lực tính toán tiến hóa.

c

hóa, lập trình tiến hóa và thuật toán di truyền đã hình thành nền xương sống của lĩnh
Thuật toán di truyền (Genetic Algorithm – GAs) được phát minh bởi John

ại

Holland vào những năm 1960 [11] và được phát triển bởi Holland và những sinh viên


Đ

của ông tại đại học Michigan vào những năm 1960 và 1970. Ngược lại với chiến lược
tiến hóa và lập trình tiến hóa, mục đích ban đầu của Holland không phải thiết kế những
thuật toán để giải những vấn đề cụ thể, mà nghiên cứu về hiện tượng thích nghi như nó
diễn ra trong tự nhiên và phát triển những cách mà cơ chế thích nghi tự nhiên có thể
được áp dụng vào hệ thống máy tính. Sách “Adaptation in Natural and Artificial
Systems” của Holland xuất bản năm 1975 đã giới thiệu thuật toán di truyền như một sự
trừu tượng hóa của quá trình tiến hóa tự nhiên.
Thuật toán di truyền của Holland là một phương pháp để di chuyển từ một quần
thể của các “nhiễm sắc thể” (chromosomes), hay còn gọi là các cá thể (ví dụ: chuỗi của
0 và 1, còn gọi là các “bit”) tới một quần thể mới bằng cách sử dụng một phương pháp
SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang 11


GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp

“chọn lọc tự nhiên” cùng với các phương pháp lấy ý tưởng từ những toán tử lai ghép
(crossover), toán tử đột biến (mutation) và sự đảo thứ tự (inversion). Mỗi cá thể chứa
các “gen” (ví dụ: các bit), mỗi gen là 0 hoặc 1. Toán tử chọn lọc lựa chọn những cá
thể trong quần thể mà sẽ được cho lai ghép, những nhiễm sắc thể tốt hơn sẽ sản sinh
nhiều con cháu hơn những cá thể kém. Lai ghép trao đổi những phần nhỏ của 2 nhiễm
sắc thể, giống như sự kết hợp giữa 2 nhiếm sắc thể trong tự nhiên; phép lai sẽ ngẫu
nhiên thay đổi những bit của một vài vị trí trong nhiễm sắc thể; và phép đảo thứ tự của
một phần cạnh nhau của một nhiểm sắc thể.

Thuật toán của Holland là một phát kiến rất quan trọng. Ông là người đầu tiên

uế

đặt nền móng cho việc đặt tính toán tiến hóa trên một nền lý thuyết vững chắc. Cho tới
gần đây phát kiến này là cơ bản của hầu như mọi lý thuyết về thuật toán di truyền.

H

Trong những năm gần đây có sự tương tác mở rộng giữa những nhà nghiên cứu về

tế

những phương pháp tính toán tiến hóa, và ranh giới giữa các phạm trù liên quan đến

nh

tính toán tiến hóa đã được thu hẹp.

Ngày nay, những nhà nghiên cứu thường sử dụng thuật ngữ “thuật toán di

Ki

truyền” để mô tả chung cho lớp các vấn đề này, mặc dù chúng có hơi khác so với mô

c

tả ban đầu của Holland.

họ


1.2.2. Tư tưởng của thuật toán di truyền
Thuật toán di truyền, cũng như các thuật toán tiến hóa nói chung, hình thành

ại

dựa trên quan niệm cho rằng: quá trình tiến hóa tự nhiên là hoàn hảo nhất, hợp lý nhất

Đ

và tự nó đã mang tính tối ưu. Quan niệm này có thể được xem như là một tiên đề đúng
và không chứng minh được, nhưng phù hợp với thực tế khách quan [1]. Cụ thể rằng,
trong quá trình tiến hóa tự nhiên, tự nó đã chứng minh được tính tối ưu khi thế hệ sau
khi nào cũng phát triển hơn thế hệ trước. Điều này là kết quả của quá trình chọn lọc tự
nhiên, lai ghép cũng như có những sự đột biến trong cấu trúc của quần thể. Nói cách
khác, chỉ cần tìm cách biểu diễn bài toán thành mô hình quần thể, cá thể, tìm cách thực
hiện các phép chọn lọc, lai ghép, đột biến sao cho hợp lí, thì chúng ta sẽ thu được đáp
án sau một số lần lặp là một kết quả khá khả quan.
Như vậy, ta có thể thấy rằng nếu chúng ta thực hiện liên tục các quá trình trên
càng lâu thì sẽ thu được kết quả càng tích cực (vì các quần thể sau đều tối ưu hơn quần
SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang 12


GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp

thể trước). Tóm lại, tư tưởng chính của giải thuật di truyền chính là dựa trên các khái

niệm cơ bản của sinh học: quần thể, cá thể, chọn lọc tự nhiên, lai ghép và đột biến.
Thuật toán di truyền là một phát kiến quan trọng trong việc giải gần đúng các
bài toán tối ưu hóa. Việc sử dụng nguyên lí tiến hóa tự nhiên như là một định hướng
đã giúp cho thuật toán giải quyết hiệu quả các bài toán với các lời giải chấp nhận được.
Điểm mấu chốt của thuật toán di truyền là xem các giải pháp (solutions) như một quần
thể, các giải pháp này trong tư tưởng thuật toán gọi là các “cá thể”. Mỗi cá thể sẽ có
một độ thích nghi (được xác định bằng hàm mục tiêu) nhất định đối với quần thể. Sau
đó áp dụng các tư tưởng tiến hóa tương tự như ở tự nhiên như phép chọn lọc, đột biến,

uế

lai ghép,…để tạo ra các quần thể mới có các cá thể tối ưu hơn quần thể hiện tại.
Thuật toán di truyền gồm các bước cơ bản như sau:

H

 Bước 1: Khởi tạo N cá thể (giải pháp) ban đầu của quần thể (tập các giải pháp)

tế

 Bước 2: Tính các độ thích nghi cho mỗi cá thể trong quần thể.

nh

 Bước 3: Áp dụng phép chọn lọc để chọn ra các cá thể tốt nhất chuẩn bị lai ghép
 Bước 4: Tiến hành lai ghép các cá thể đó

Ki

 Bước 5: Tiến hành phép đột biến đối với các cá thể với tỉ lệ đột biến nhất định


họ

mới.

c

 Bước 6: Tạo ra quần thể mới từ các cá thể tốt nhất của quần thể cũ và quần thể
 Bước 7: Kiểm tra điều kiện dừng. Nếu chưa thỏa mãn thì lặp lại bước 2.

Đ

ại

Lưu đồ thuật toán như sau:

SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang 13


GVHD: TS. Nguyễn Đình Hoa Cương

Đ

ại

họ

c


Ki

nh

tế

H

uế

Khóa luận tốt nghiệp

Hình 1.4: Lưu đồ thuật toán của thuật toán di truyền

SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang 14


GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp
1.2.3. Khởi tạo quần thể

Có nhiều cách để có thể biểu diễn các giải pháp, có thể áp dụng phương pháp
biểu diễn nhị phân (biểu diễn các giải pháp bằng các chuỗi nhị phân chứa các chữ số 0
hoặc 1). Hoặc chúng ta cũng có thể biểu diễn một giải pháp bằng các số thực, với mỗi
số thực là một thành phần của giải pháp đó. Chúng ta có thể liên tưởng chúng như các
nhiễm sắc thể trong sinh học, mà mỗi phần tử của cá thể đó là 1 gen (mỗi bit hay mỗi

số thực sẽ là 1 gen) và tập hợp của chúng sẽ tạo nên quần thể các giải pháp
(population).
1.2.4. Phép chọn lọc

uế

Phép chọn lọc tự nhiên: Trong tư tưởng của sinh học, chọn lọc tự nhiên chính là
quá trình loại bỏ các cá thể không phù hợp, chỉ lựa chọn các cá thể tốt nhất để lai ghép

H

cho ra các thế hệ tiếp theo. Trong thuật toán di truyền, quá trình này được mô tả như là

tế

một toán tử. Nó sẽ lựa chọn các cá thể tốt nhất trong quần thể hiện tại bằng một số

nh

phương pháp dựa vào độ thích nghi (fitness) của mỗi cá thể. Một số phương pháp
thường dùng là :

Phương pháp vòng quay Roulette: dựa trên xác suất (tỷ lệ thuận với độ
Phương pháp Giao đấu: đây là một cơ chế chọn những cá thể từ một

họ



c


thích nghi) để lựa chọn cá thể.

Ki



quần thể. 1 nhóm (thường giữa 2 đến 7 cá thể) được lựa chọn ngẫu nhiên từ quần thể

ại

và nhiễm sắc thể tốt nhất (thường là chỉ một, nhưng có thể nhiều hơn) được lựa chọn.

Đ

1.2.5. Phép lai (cross over)
Phép lai (cross over) : Là quá trình từ các cá thể đã chọn lọc ta tiến hành ghép
nối chúng lại với nhau để tạo ra các cá thể mới, thừa hưởng các đặc tính tốt của cha
mẹ. Phép lai có thể được tiến hành theo nhiều cách, một trong số đó là cắt và nối các
đoạn con trong các cá thể cha mẹ để ghép lại thành cá thể mới.
1.2.6. Phép đột biến (mutation)
Phép đột biến (mutation): đột biến là quá trình sinh ra các cá thể dị biệt khác
với các cá thể cha mẹ. Thường chúng ta sẽ thực hiện đột biến trên các cá thể con đã
được sinh ra từ phép lai theo một tỉ lệ nhất định nào đó. Có nhiều phương pháp đột

SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang 15



GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp

biến như đảo bít (trong trường hợp biểu diễn nhị phân các cá thể), đổi chỗ các nhiễm
sắc thể,…
1.2.7. Điều kiện dừng
Vấn đề tìm ra điều kiện dừng thích hợp cho thuật toán di truyền sao cho tìm
được kết quả khả quan nhất cũng đòi hỏi sự nghiên cứu và hiểu rõ về vấn đề cần giải
quyết. Thông thường, sẽ có ba phương án kiểm tra điều kiện dừng của thuật toán di
truyền như sau [17]:
- Số lần lặp đạt tới một giới hạn cho trước.
- Hàm tính độ thích nghi đạt tới giới hạn nhất định.

uế

- Cơ hội đạt được những kết quả khả quan trong thế hệ tiếp theo rất thấp.
Vấn đề ở đây là làm thế nào thiết lập những giới hạn đó cho hợp lý, phù hợp

H

với bài toán. Trong khuôn khổ của khóa luận này, chúng ta sẽ sử dụng phương án thứ

tế

nhất để giải bài toán người du lịch.
1.3.1. Khởi tạo quần thể

nh


1.3. Áp dụng thuật toán di truyền để giải bài toán người du lịch

Ki

 Cách biểu diễn các giải pháp

c

Có rất nhiều cách để mã hóa các chu trình trong bài toán người du lịch thành

họ

những cá thể theo tư tưởng của thuật toán di truyền, trong đó có thể kể đến cách biểu
diễn các chu trình theo thứ tự (ordinal representation), cách biểu diễn theo lộ trình

ại

(path representation) và cách biểu diễn chu trình liền kề (adjacency representation)

Đ

[16]. Trong đó, cách biểu diễn theo lộ trình là cách biểu diễn khá dễ hiểu vì nó thể hiện
thành phố phải thăm theo đúng thứ tự khá rõ ràng. Chính vì thế, trong khuôn khổ khóa
luận này, chúng ta sẽ sử dụng phương pháp này để biểu diễn các chu trình của bài
toán.
Ví dụ về cách biểu diễn theo lộ trình như sau: giả sử có một phương án cho bài
toán là xuất phát từ thành phố 1, đi qua lần lượt các thành phố 2,3,4,5 rồi trở về thành
phố 1 , thì cách biểu diễn của nó sẽ theo đúng thứ tự như thế. Tuy nhiên đễ dễ dàng
hơn trong việc thực hiện các toán tử di truyền thì ta chỉ liệt kê thành phố bắt đầu chỉ
một lần. Như vậy ta sẽ biểu diễn các thành phố như sau:


SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang 16


GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp
1

2

3

4

5

Hình 1.5: Ví dụ về cách biểu diễn giải pháp theo lộ trình
Tiếp theo, chúng ta sẽ khởi tạo một quần thể các các chu trình như thế, theo
đúng như yêu cầu của thuật toán.
 Khởi tạo quần thể:
Để khởi tạo một quần thể, chúng ta cần sinh ngẫu nhiên một số chu trình theo
một số lượng cho trước. Số lượng này có thể khác nhau tùy cách xử lý của mỗi người
nhưng nó cũng sẽ ảnh hưởng đến kết quả của thuật toán (chúng ta sẽ không bàn đến

uế

vấn đề này). Các chu trình được sinh bằng cách hoán vị các thành phố với nhau để tạo


H

ra các giải pháp khác nhau:

c

4

họ

1

3

5

5

4

3

5

3

2

2


5

…..
4

Đ

1

4

tế

2

nh

1

3

Ki

2

ại

n chu trình
được sinh

ngẫu nhiên

1

Hình 1.6: Ví dụ khởi tạo quần thể gồm n chu trình
Như vậy, quần thể ban đầu đã được khởi tạo. Tiếp theo, chúng ta sẽ tiến hành
tính các độ thích nghi cho các cá thể trong quần thể.
1.3.2. Tính độ thích nghi cho các cá thể
Độ thích nghi của một cá thể (giải pháp) chính là cách để thể hiện mức độ phù
hợp của nó trong việc giải quyết bài toán. Độ thích nghi càng lớn thì giải pháp tìm
được càng tốt. Các bài toán khác nhau sẽ có cách tính độ thích nghi khác nhau phụ
thuộc vào yêu cầu của nó.

SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang 17


GVHD: TS. Nguyễn Đình Hoa Cương

Khóa luận tốt nghiệp

Đối với bài toán người du lịch, chúng ta thấy ngay yêu cầu của bài toán đã thể hiện
rằng một giải pháp càng tốt khi độ dài của chu trình tìm được càng ngắn. Chính vì thế, ta
có thể xây dựng hàm tính độ thích nghi phụ thuộc vào độ dài của chu trình như sau:
𝑓(𝑥 ) =

1
(2)
𝑙𝑒𝑛𝑔𝑡ℎ(𝑥 )


Với: - 𝑓 (𝑥 ) là hàm tính độ thích nghi của chu trình x
- 𝑙𝑒𝑛𝑔𝑡ℎ(𝑥 ) là độ dài của chu trình x.

1.3.3. Phép chọn lọc

uế

Ta sẽ lựa chọn ra các cá thể bố mẹ tốt nhất theo phương pháp giao đấu, cụ thể
như sau:

H

• Bước 1: Chọn ra trong quần thể hiện tại từ một số lượng cá thể ngẫu nhiên

tế

(thường là từ 5 đến 7 cá thể).

nh

• Bước 2: Chọn ra trong các cá thể đó cá thể tốt nhất và trả về kết quả
Theo phương pháp này, ta sẽ đảm bảo rằng các cá thể bố mẹ là tối ưu để cho ra

Ki

thế hệ sau tốt hơn.

c


1.3.4. Phép lai:

họ

Đối với bài toán người du lịch, phép lai cần đảm bảo rằng chu trình con là hợp
lệ, tức là không có sự lặp lại các thành phố. Để đảm bảo điều kiện này, ta có thể thực

ại

hiện theo các bước sau:

Đ

• Bước 1: Lấy ra 2 cá thể bố mẹ theo bằng phép chọn lọc như đã trình bày ở
phần trước

• Bước 2: Lấy ra 1 phần của cá thể bố, thêm vào cá thể con.
• Bước 3: Duyệt qua cá thể mẹ, nếu thành phố nào chưa có trong cá thể con ta
thêm thành phố đó vào chu trình con theo đúng thứ tự duyệt.

SV: Thái Công Danh-K47 Tin Học Kinh Tế

Trang 18


×