Tải bản đầy đủ (.docx) (31 trang)

Tiểu luận môn Thuật Toán và Phương Pháp Giải Quyết Vấn Đề THUẬT TOÁN VÀ ỨNG DỤNG THUẬT GIẢI DI TRUYỀN CHO BÀI TOÁN NGƯỜI DU LỊCH

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 (543.95 KB, 31 trang )

Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
ĐẠI HỌC QUỐC GIA TP.HCM
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
BÀI TIỂU LUẬN
MÔN THUẬT TOÁN VÀ PHƯƠNG PHÁP
GIẢI QUYẾT VẤN ĐỀ
ĐỀ TÀI:
THUẬT TOÁN VÀ ỨNG DỤNG
THUẬT GIẢI DI TRUYỀN CHO BÀI TOÁN
NGƯỜI DU LỊCH
GVHD: PGS.TS ĐỖ VĂN NHƠN
HVTH: TRẦN KHÁNH AN
MSHV: CH1301076
LỚP: CH08-02
HVTH: CH1301076 - Trần Khánh An 1
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
TP.HCM, tháng 10 năm 2014
MỤC LỤC
HVTH: CH1301076 - Trần Khánh An 2
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
MỞ ĐẦU
Thuật toán và cách thiết kế, đánh giá thuật toán đóng vai trò quan trọng đối với mỗi
kỹ sư công nghệ thông tin. Nó cung cấp những kiến thức giúp phân tích và thiết kế thuật
toán, những kỹ năng cần thiết để giải quyết các bài toán, các vấn đề hay gặp trong lĩnh
vực công nghệ thông tin.
Để giải một bài toán, điều trước tiên là chúng ta phải có thuật toán. Một câu hỏi đặt
ra là làm thế nào để tìm ra được thuật toán cho một bài toán? Lớp các bài toán được đặt
ra từ các ngành khoa học kỹ thuật, từ các lĩnh vực hoạt động thực tiễn của con người là
hết sức phong phú và đa dạng. Các thuật toán giải các lớp bài toán khác nhau cũng rất
khác nhau. Để giải quyết được chúng ta cần có các kỹ thuật để thiết kế thuật toán. Mỗi kỹ
thuật có các tính chất riêng và chỉ thích hợp cho một số dạng bài toán nào đó. Vì chúng ta


không thể áp dụng máy móc một chiến lược cho một vấn đề, mà ta phải phân tích kỹ vấn
đề, cấu trúc của vấn đề, các đặc điểm của vấn đề sẽ quyết định chiến lược có khả năng áp
dụng.
Trong bài tiểu luận em tập trung nghiên cứu về thuật toán, các bước cơ bản để giải
quyết bài toán, các kỹ thuật thiết kế và phân tích thuật toán.
Bài toán người du lịch là một trong những bài toán được nghiên cứu sâu nhất trong
lĩnh vực tối ưu hoá. Báo cáo này sẽ trình bày một hướng tiếp cận giải quyết bài toán
người du lịch sử dụng giải thuật di truỵền. Giải thuật di truyền là hướng tiếp cận heuristic
nhằm đưa ra lời giải tốt (có thể không là tối ưu nhất) khi mà không thể đưa ra một giải
thuật chính xác hay việc vét cạn là trường hợp bất khả thi cho bài toán NP-Hard.
HVTH: CH1301076 - Trần Khánh An 3
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
CHƯƠNG 1: VẤN ĐỀ VÀ THUẬT TOÁN
1. Vấn đề và biểu diễn vấn đề
1.1. Khái niệm vấn đề:
Vấn đề: là những tình huống không mong muốn hoặc có hại và cần phải được xử lý
và khắc phục.
• Là một điều đó là khó khăn để đạt được.
• Một cuộc tìm tòi bắt đầu từ điều kiện có sẵn nhất định để nghiên cứu hoặc chứng minh
một sự thật, kết quả, hoặc quy luật.
1.2. Xác định vấn đề:
Những yếu tố sau đây sẽ giúp xác định vấn đề một cách chính xác:
• Tình huống, ngữ cảnh, cơ sở dữ liệu-thông tin-tri thức.
• Giả thiết.
• Mục tiêu, yêu cầu.
• Điều kiện, ràng buộc, phạm vi.
2. Thuật toán
2.1. Định nghĩa thuật toán
Thuật toán là một khái niệm cơ sở của Toán học và Tin học. Hiểu một cách đơn
giản, thuật toán là một tập các hướng dẫn nhằm thực hiện một công việc nào đó. Ðối với

việc giải quyết một vấn đề - bài toán thì thuật toán có thể hiểu là một tập hữu hạn các
hướng dẫn rõ ràng để người giải toán có thể theo đó mà giải quyết được vấn đề. Như vậy,
thuật toán là một phương pháp thể hiện lời giải của vấn đề - bài toán.
Việc nghiên cứu về thuật toán có vai trò rất quan trọng trong khoa học máy tính vì
máy tính chỉ giải quyết được vấn đề khi đã có hướng dẫn giải rõ ràng và đúng. Nếu
hướng dẫn giải sai hoặc không rõ ràng thì máy tính không thể giải đúng được bài toán.
Trong khoa học máy tính, thuật toán được định nghĩa là một dãy hữu hạn các bước không
mập mờ và có thể thực thi được, quá trình hành động theo các bước này phải dừng và cho
được kết quả như mong muốn. .
2.2. Các đặc trưng cơ bản của thuật toán.
a. Tính hữu hạn: thuật toán bao giờ cũng phải kết thúc sau hữu hạn bước mặc dù số bước
này có thể rất lớn.
b. Tính xác định: các bước phải rõ ràng, thực hiện được ra một kết quả nào đó.
HVTH: CH1301076 - Trần Khánh An 4
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
c. Tính chính xác: đảm bảo kết quả tính toán hay các thao tác thực hiện được là chính xác.
d. Ðầu vào và đầu ra: mọi thuật toán, dù có đơn giản đến mấy cũng phải nhận dữ liệu đầu
vào, xử lý nó và cho ra kết quả cuối cùng.
e. Tính hiệu quả: tính hiệu quả của thuật toán được đánh giá dựa trên một số tiêu chuẩn
như khối lượng tính toán, không gian và thời gian khi thuật toán được thi hành. Tính hiệu
quả của thuật toán là một yếu tố quyết định để đánh giá, chọn lựa cách giải quyết vấn đề-
bài toán trên thực tế. Có rất nhiều phương pháp để đánh giá tính hiệu quả của thuật toán.
Tiêu chuẩn được dùng rộng rãi để đánh giá là độ phức tạp của thuật toán.
f. Tính tổng quát: thuật toán có tính tổng quát là thuật toán phải áp dụng được cho mọi
trường hợp của bài toán chứ không phải chỉ áp dụng được cho một số trường hợp riêng lẻ
nào đó. Chẳng hạn giải phương trình bậc hai sau đây bằng Delta đảm bảo được tính chất
này vì nó luôn giải được với mọi giá trị số thực a,b,c bất kỳ. Tuy nhiên, không phải thuật
toán nào cũng đảm bảo được tính tổng quát. Trong thực tế, có lúc người ta chỉ xây dựng
thuật toán cho một dạng đặc trưng của bài toán mà thôi.
2.3. Phân tích thuật toán.

2.3.1. Nguyên tắc phân tích:
Độ phức tạp về thời gian của một thuật toán được xác định bằng số lượng các
thao tác căn bản cần thiết để giải quyết vấn đề đặt ra.
2.3.2. Mục tiêu:
Đánh giá độ phức tạp thuật toán là đánh giá lượng tài nguyên các loại mà thuật toán
đòi hỏi sử dụng. Có hai loại tài nguyên quan trọng là thời gian và bộ nhớ. Ta sẽ tập trung
vào phân tích thời gian thực hiện thuật toán, tiêu chuẩn để đánh giá hiệu lực của thuật
toán hay đề cập tới.
Các loại thời gian tính mà ta sẽ quan tâm đến:
• Thời gian tính tốt nhất: thời gian tối thiểu cần thiết để thực hiện thuật toán với mọi bộ dữ
liệu đầu vào kích thước .
• Thời gian tính trung bình: thời gian trung bình cần thiết để thực hiện thuật toán trên tập
hữu hạn dữ liệu đầu vào kích thước
• Thời gian tính xấu nhất: thời gian nhiều nhất cần thiết để thực hiện thuật toán với mọi bộ
dữ liệu đầu vào kích thước
Xem thời gian chạy của thuật toán là một hàm theo kích thước của dữ liệu nhập.
Cách xác định xem số lượng các thao tác căn bản phụ thuộc vào kích thước input như
sau:
n : kích thước input
HVTH: CH1301076 - Trần Khánh An 5
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
T(n) : số các thao tác căn bản
Ví dụ: Vấn đề tìm x trong một mảng một chiều
Thao tác căn bản: So sánh x với một phần tử trong mảng
Kích thước input: Số lượng các phần tử trong mảng
2.3.3. Sự phân lớp các thuật toán
Hầu hết các thuật toán đều có một tham số chính là N, thông thường đó là số lượng
các phần tử dữ liệu được xử lý mà ảnh hưởng rất nhiều tới thời gian chạy. Tham số N có
thể là bậc của một đa thức, kích thước của một tập tin được sắp xếp hay tìm kiếm, số nút
trong một đồ thị .v.v

Hằng số: Hầu hết các chỉ thị của các chương trình đều được thực hiện một lần hay
nhiều nhất chỉ một vài lần. Nếu tất cả các chỉ thị của cùng một chương trình có tính chất
nầy thì chúng ta sẽ nói rằng thời gian chạy của nó là hằng số. Điều nầy hiển nhiên là hoàn
cảnh phấn đấu để đạt được trong việc thiết kế thuật toán.
logN: Khi thời gian chạy của chương trình là logarit tức là thời gian chạy chương
trình tiến chậm khi N lớn dần. Thời gian chạy thuộc loại nầy xuất hiện trong các chương
trình mà giải một bài toán lớn bằng cách chuyển nó thành một bài toán nhỏ hơn, bằng
cách cắt bỏ kích thước bớt một hằng số nào đó. Với mục đích của chúng ta, thời gian
chạy có được xem như nhỏ hơn một hằng số "lớn". Cơ số của logarit làm thay đổi hằng
số đó nhưng không nhiều: khi N là một ngàn thì logN là 3 nếu cơ số là 10, là 10 nếu cơ
số là 2; khi N là một triệu, logN được nhân gấp đôi. Bất cứ khi nào N được nhân đôi,
logN tăng lên thêm một hằng số, nhưng logN không bị nhân gấp đôi khi N tăng tới N
2
.
N: Khi thời gian chạy của một chương trình là tuyến tính, nói chung đây trường hợp
mà một số lượng nhỏ các xử lý được làm cho mỗi phần tử dữ liệu nhập. Khi N là một
triệu thì thời gian chạy cũng cỡ như vậy. Khi N được nhân gấp đôi thì thời gian chạy
cũng được nhân gấp đôi. Đây là tình huống tối ưu cho một thuật toán mà phải xử lý N dữ
liệu nhập (hay sản sinh ra N dữ liệu xuất).
NlogN: Đây là thời gian chạy tăng dần lên cho các thuật toán mà giải một bài toán
bằng cách tách nó thành các bài toán con nhỏ hơn, kế đến giải quyết chúng một cách độc
lập và sau đó tổ hợp các lời giải. Bởi vì thiếu một tính từ tốt hơn (có lẻ là "tuyến tính
logarit"?), chúng ta nói rằng thời gian chạy của thuật toán như thế là "NlogN". Khi N là
một triệu, NlogN có lẽ khoảng hai mươi triệu. Khi N được nhân gấp đôi, thời gian chạy
bị nhân lên nhiều hơn gấp đôi (nhưng không nhiều lắm).
N
2
: Khi thời gian chạy của một thuật toán là bậc hai, trường hợp nầy chỉ có ý nghĩa
thực tế cho các bài toán tương đối nhỏ. Thời gian bình phương thường tăng dần lên trong
các thuật toán mà xử lý tất cả các cặp phần tử dữ liệu (có thể là hai vòng lặp lồng nhau).

Khi N là một ngàn thì thời gian chạy là một triệu. Khi N được nhân đôi thì thời gian chạy
tăng lên gấp bốn lần.
HVTH: CH1301076 - Trần Khánh An 6
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
N
3
:Tương tự, một thuật toán mà xử lý các bộ ba của các phần tử dữ liệu (có lẻ là ba
vòng lặp lồng nhau) có thời gian chạy bậc ba và cũng chỉ có ý nghĩa thực tế trong các bài
toán nhỏ. Khi N là một trăm thì thời gian chạy là một triệu. Khi N được nhân đôi, thời
gian chạy tăng lên gấp tám lần.
2
N
: Một số ít thuật toán có thời gian chạy lũy thừa lại thích hợp trong một số trường
hợp thực tế, mặc dù các thuật toán như thế là "sự ép buộc thô bạo" để giải các bài toán.
Khi N là hai mươi thì thời gian chạy là một triệu. Khi N gấp đôi thì thời gian chạy được
nâng lên lũy thừa hai!
3. Quy trình xây dựng giải pháp cho vấn đề
3.1 Mô hình hóa vấn đề:
Mục đích của việc mô hình hóa vấn đề là làm sáng tỏ vấn đề, giúp chúng ta có thể
đưa ra được các lỗi hoặc các thiếu xót của vấn đề.
3.2 Thiết kế thuật toán
Để giải một bài toán, điều trước tiên là chúng ta phải có thuật toán. Một câu hỏi đặt
ra là làm thế nào để tìm ra được thuật toán cho một bài toán đã đặt ra? Lớp các bài toán
được đặt ra từ các ngành khoa học kỹ thuật, từ các lĩnh vực hoạt động của con người là
hết sức phong phú và đa dạng. Các thuật toán giải các lớp bài toán khác nhau cũng rất
khác nhau. Để thiết kế thuật toán ta có một số kỹ thuật thiết kế thuật toán chung như:
Chia để trị (divide-and-conque), phương pháp tham lam (greedy method), qui hoạch động
(dynamic programming) Việc nắm được các chiến lược thiết kế thuật toán này là hết
sức quan trọng và cần thiết, nó giúp cho ta dễ tìm ra các thuật toán mới cho các bài toán
mới được đưa ra.

3.3 Diễn giải thuật toán
Sau khi thiết kế thuật toán ta tiến hành diễn giải thuật toán đó. Thông thường ta
không nên cụ thể hóa ngay toàn bộ chương trình mà nên tiến hành theo phương pháp tinh
chế từng bước từ tổng thế đến chi tiết hơn.
Thuật toán có thể diễn đạt dưới nhiều hình thức, chẳng hạn dưới dạng lưu đồ, dạng
ngôn ngữ tự nhiên, dạng mã giả hoặc một ngôn ngữ lập trình nào đó.
3.4 Chứng minh tính đúng đắn của thuật toán.
Khi một thuật toán được làm ra, ta cần phải chứng minh rằng, thuật toán khi được
thực hiện sẽ cho ta kết quả đúng với mọi dữ liệu vào hợp lệ. Điều này gọi là chứng minh
tính đúng đắn của thuật toán. Việc chứng minh tính đúng đắn của thuật toán là một công
việc không dễ dàng. Trong nhiều trường hợp, nó đòi hỏi ta phải có trình độ và khả năng
tư duy toán học tốt.
HVTH: CH1301076 - Trần Khánh An 7
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
3.5 Tính hiệu quả về phương diện lý thuyết và thực hành
Khi giải một vấn đề, chúng ta cần chọn trong số các thuật toán, một thuật toán mà
chúng ta cho là “tốt” nhất .Vậy ta cần lựa chọn thuật toán dựa trên cơ sở nào? Thông
thường ta dựa trên hai tiêu chuẩn sau đây:
• Thuật toán đơn giản, dễ hiểu, dễ cài đặt (dễ viết chương trình
• Thuật toán sử dụng tiết kiệm nhất các nguồn tài nguyên của máy tính, và đặc biệt chạy
nhanh nhất có thể được.
Khi ta viết một chương trình chỉ để sử dụng một số ít lần, và cái giá của thời gian
viết chương trình vượt xa cái giá của chạy chương trình thì tiêu chuẩn thứ nhất là quan
trọng nhất. Nhưng có trường hợp ta cần viết các chương trình (hoặc thủ tục, hàm) để sử
dụng nhiều lần, cho nhiều người sử dụng, khi đó giá của thời gian chạy chương trình sẽ
vượt xa giá viết nó. Chẳng hạn, các thủ tục sắp xếp, tìm kiếm được sử dụng rất nhiều lần,
bởi rất nhiều người trong các bài toán khác nhau. Trong trường hợp này ta cần dựa trên
tiêu chuẩn thứ hai. Ta sẽ cài đặt thuật toán có thể sẽ rất phức tạp, miễn là chương trình
nhận được chạy nhanh hơn so với các chương trình khác.
Tiêu chuẩn hai được xem là tính hiệu quả của thuật toán. Tính hiệu quả của thuật

toán bao gồm hai nhân tố cơ bản:
• Dung lượng không gian nhớ cần thiết để lưu giữ các dữ liệu vào, các kết quả tính toán
trung gian và các kết quả của thuật toán.
• Thời gian cần thiết để thực hiện thuật toán (ta gọi là thời gian chạy). Chúng ta chỉ quan
tâm đến thời gian thực hiện thuật toán, có nghĩa là ta nói đến đánh giá thời gian thực
hiện. Một thuật toán có hiệu quả được xem là thuật toán có thời gian chạy ít hơn so với
các thuật toán khác.
3.6 Tối ưu thuật toán
Tối ưu thuật toán tức là đi tìm một hàm mục tiêu có chi phí ít nhất, hay lớn nhất
trong một tập hợp các hàm khả dĩ để đạt được một mục đích cụ thể. Hiểu theo cách thông
thường tối ưu là thủ tục giảm tối thiểu thời gian, không gian,… của thuật toán.
CHƯƠNG 2: CÁC PHƯƠNG PHÁP GIẢI QUYẾT VẤN ĐỀ
1. Phương pháp trực tiếp:
Xác định trực tiếp được lời giải qua một thủ tục tính toán (công thức, hệ thức, định
luật, …) hoặc qua các bước căn bản để có được lời giải.
Việc giải quyết vấn đề trên máy tính chỉ là thao tác lập trình hay là sự chuyển đổi
lời giải từ ngôn ngữ tự nhiên sang ngôn ngữ máy tính.
Có ba loại cơ bản:
HVTH: CH1301076 - Trần Khánh An 8
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
• Lọai thứ nhất: dùng để biểu diễn cho các bài toán đã có lời giải chính xác bằng một công
thức toán học nào đó.
Ví dụ: tính tổng n số nguyên dương.
• Loại thứ hai, biểu diễn cho các bài toán có công thức giải gần đúng (công thức tính sin,
cos, giải phương trình siêu việt, …).
Ví dụ: giải phương trình bậc 2
• Loại cuối cùng, biểu diễn các lời giải không tường minh bằng kỹ thuật đệ quy
2. Phương pháp gián tiếp:
Được sử dụng khi chưa tìm ra lời giải chính xác của vấn đề. Đây là cách tiếp cận
chủ yếu của loài người từ xưa đến nay. Lời giải trực tiếp bao giờ cũng tốt hơn, nhưng

không phải lúc nào cũng có
Mỗi phương pháp có các tính chất riêng và chỉ thích hợp cho một số dạng vấn đề
nào đó. Cần nhấn mạnh rằng, ta không thể áp dụng máy móc một chiến lược cho một vấn
đề, mà ta phải phân tích kỹ vấn đề. Cấu trúc của vấn đề, các đặc điểm của vấn đề sẽ quyết
định chiến lược có khả năng áp dụng.
Đối với lớp các vấn đề giải được bằng thuật toán, dựa vào các đặc trưng của quá
trình thiết kế của thuật toán cho vấn đề, ta có thể chỉ ra một số các phương pháp thiết kế
thuật toán cơ bản sau đây:
• Phương pháp chia để trị (Divide-and-Conquer method): Ý tưởng là chia dữ liệu thành
từng miền đủ nhỏ, giải bài toán trên các miền đã chia rồi tổng hợp kết quả lại. Chẳng hạn
như thuật toán Quicksort.
• Phương pháp tham lam (Greedy Method): Ý tưởng là xác định trật tự xử lý để có lợi
nhất, Sắp xếp dữ liệu theo trật tự đó, rồi xử lý dữ liệu theo trật tự đã nêu. Công sức bỏ ra
là tìm ra trật tự đó. Chẳng hạn thuật toán tìm cây bao trùm nhỏ nhất (Shortest
spanning Trees).
• Phương pháp Quy hoạch động (Dynamic Programming method): Phương pháp quy
hoạch động dựa vào một nguyên lý, gọi là nguyên lý tối ưu của Bellman: “ Nếu lời giải
của bài toán là tối ưu thì lời giải của các bài toán con cũng tối ưu ”. Phương pháp này tổ
chức tìm kiếm lời giải theo kiểu từ dưới lên. Xuất phát từ các bài toán con nhỏ và đơn
giản nhất, tổ hợp các lời giải của chúng để có lời giải của bài toán con lớn hơn và cứ
như thế cuối cùng được lời giải của bài toán ban đầu. Chẳng hạn thuật toán “chiếc túi
xách” (Knapsack).
• Phương pháp nhánh cận (branch-and-bound method): Ý tưởng là trong quá trình tìm
kiếm lời giải, ta phân hoạch tập các phương án của bài toán ra thành hai hay nhiều tập
HVTH: CH1301076 - Trần Khánh An 9
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
con được biểu diễn như là các nút của cây tìm kiếm và cố găng bằng phép đánh giá cận
cho các nút, tìm cách loại bỏ các nhánh của cây mà ta biết chắc không chưa phương án
tối ưu. Chẳng hạn thuật toán giải bài toán người du lịch.
• Phương pháp vét cạn (Brute force): Đây là phương pháp đơn giản nhất, nhưng cũng

không hiểu quả nhất. Phương pháp vét cạn thử tất cả các khả năng xem khả năng nào là
nghiệm đúng của bài toán cần giải quyết.
2.1. Phương pháp chia để trị (Divide - and - Conquer)
2.2.1. Ý tưởng:
Có lẽ quan trọng và áp dụng rộng rãi nhất là kỹ thuật thiết kế “Chia để trị”. Nó
phân rã bài toán kích thước n thành các bài toán con nhỏ hơn mà việc tìm lời giải của
chúng là cùng một cách. Lời giải của bài toán đã cho được xây dựng từ lời giải của các
bài toán con này. Ta có thể nói vắn tắt ý tưởng chính của phương pháp này là : chia dữ
liệu thành từng miền đủ nhỏ, giải bài toán trên các miền đã chia rồi tổng hợp kết quả lại.
2.2.2. Mô hình
Nếu gọi DivideAndConquer (R) - Với R là miền dữ liệu - là hàm thể hiện cách
giải bài toán theo phương pháp chia để trị thì ta có thể viết :
devideAndConquer(R)
nếu R đủ nhỏ:
giải bài toán.
Ngược lại:
Phân hoạch R thành các Ri
Với mỗi Ri: devideAndConquer(Ri)
Tổng hợp kết quả.
2.3. Phương pháp quay lui (Back Tracking)
2.3.1. Ý tưởng:
Nét đặc trưng của phương pháp quay lui là các bước hướng tới lời giải cuối cùng
của bài toán hoàn toàn được làm thử.
Tại mỗi bước, nếu có một lựa chọn được chấp nhận thì ghi nhận lại lựa chọn này và
tiến hành các bước thử tiếp theo. Còn ngược lại không có lựa chọn nào thích hợp thì làm
lại bước trước, xoá bỏ sự ghi nhận và quay về chu trình thử các lựa chọn còn lại.
Hành động này được gọi là quay lui, thuật toán thể hiện phương pháp này gọi là
quay lui. Điểm quan trọng của thuật toán là phải ghi nhớ tại mỗi bước đi qua để tránh
trùng lặp khi quay lui. Dễ thấy là các thông tin này cần được lưu trử vào một ngăn xếp,
nên thuật toán thể hiện ý thiết kế một cách đệ quy.

HVTH: CH1301076 - Trần Khánh An 10
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
2.3.2. Mô hình
Lời giải của bài toán thường biểu diễn bằng một vectơ gồm n thành phần x = (x
1
, ,
x
n
) phải thỏa mãn các điều kiện nào đó. Để chỉ ra lời giải x, ta phải xây dựng dần các
thành phần lời giải x
i
.
Tại mỗi bước i :
+ Đã xây dựng xong các thành phần x
1
, , x
i-1.
+ Xây dựng thành phần xi bằng cách lần lượt thử tất cả các khả năng mà xi có
thể chọn :
• Nếu một khả năng j nào đó phù hợp cho x
i
thì xác định x
i
theo khả
năng j. Thường phải có thêm thao tác ghi nhận trạng thái mới của bài toán để hổ trợ cho
bước quay lui. Nếu i = n thì ta có được một lời giải, nguợc lại thì tiến hành bước i+1 để
xác định x
i+1
.
• Nếu không có một khả năng nào chấp nhận được cho x

i
thì ta lùi lại
bước trước (bước i-1) để xác định lại thành phần x
i-1
.
Để đơn giản, ta giả định các khả năng chọn lựa cho các x
i
tại mỗi bước là như
nhau, do đó ta phải có thêm một thao tác kiểm tra khả năng j nào là chấp nhận được cho
x
i
.
Mô hình của phương pháp quay lui có thể viết bằng thủ tục sau, với n là số
bước cần phải thực hiện, k là số khả năng mà x
i
có thể chọn lựa.
Try(i) ≡
for ( j = 1 → k)
If ( x
i
chấp nhận được khả năng j)
{
Xác định xi theo khả năng j;
Ghi nhận trạng thái mới;
if( i < n)
Try(i+1);
else
Ghi nhận nghiệm;
Trả lại trạng thái cũ cho bài toán;
};

Ghi chú:
Tìm nghiệm bằng phương pháp quay lui có thể chuyển về tìm kiếm trên cây
không gian các trạng thái, với cây được xây dựng từng mức như sau:
- Các nút con của gốc (thuộc mức 1) là các khả năng có thể chọn cho x
1
.
HVTH: CH1301076 - Trần Khánh An 11
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
- Giả sử x
i-1
làmột nút ở mức thứ i-1, khi đó các nút con của x
i-1
là các khả
năng mà x
i
có thể chọn, một khi đã tìm được các thành phần x
1
, , x
i-1
.
Như vậy, mỗi nút x
i
của cây biểu diễn một lời giải bộ phận, đó là các nút nằm
trên đường đi từ gốc đến nút đó.
Ta có thể nói việc tìm kiếm nghiệm bằng phương pháp quay lui chính là tìm
kiếm theo chiều sâu trên cây không gian các trạng thái.
2.4. Phương pháp nhánh cận (Branch And Bound)
2.4.1. Ý tưởng:
Phương pháp quay lui, vét cạn có thể giải các bài toán tối ưu, bằng cách lựa chọn
phương án tối ưu trong tất cả các lời giải tìm được. Nhưng nhiều bài toán không gian các

lời giải là quá lớn, nên áp dụng phương pháp pháp quay lui khó đảm bảo về thời gian
cũng như kỹ thuật. Cho nên ta cần phải cải tiến thuật toán quay lui để hạn chế bớt việc
duyệt các phương án. Có nhiều cách cải tiến, trong đó có phương pháp nhánh cận.
Phương pháp nhánh cận là một cải tiến của phương pháp quay lui, dùng để tìm lời giải tối
ưu của bài toán.
Ý tưởng chính của nó như sau: Trong quá trình duyệt ta luôn giữ lại một phương
án mẫu (có thể xem là lời giải tối ưu cục bộ – chẳng hạn có giá nhỏ nhất tại thời điểm
đó). Đánh giá nhánh cận là phương pháp tính giá của phương án ngay trong quá trình xây
dựng các thành phần của phương án theo hướng đang xây dựng có thể tốt hơn phương án
mẫu hay không. Nếu không ta lựa chọn theo hướng khác.
2.4.2. Mô hình
Giả sử bài toán tối ưu cho là :
Tìm Min{f(x) : x∈D};
Với
Nghiệm của bài toán nếu có sẽ được biểu diễn dưới dạng :x = (x
1
, ,x
n
)
Trong quá trình liệt kê theo phương pháp quay lui, ta xây dựng dần các thành phần
của nghiệm.
Một bộ phận i thành phần (x
1
, , x
i
) sẽ gọi là một lời giải (phương án) bộ phận
cấp i. Ta gọi X
i
là tập các lời giải bộ phận cấp i,
Đánh giá cận là tìm một hàm g xác định trên các X

i
sao cho :
Bất đẳng thức này có nghĩa là giá trị g(x
1
, , x
i
) không lớn hơn giá trị của các
phương án mở rộng từ lời giải bộ phận (x
1
,…, x
i
) .
HVTH: CH1301076 - Trần Khánh An 12
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
Sau khi tìm được hàm đánh giá cận g, ta dùng g để giảm bớt chi phí duyệt các
phương án theo phương pháp quay lui.
Giả sử x* là lời giải tốt nhất hiện có (phương án mẫu), còn f* là giá trị tốt nhất
tương ứng f* = f(x*).
Nếu g(x
1
, , x
i
) > f* thì :
Nên chắc rằng các lời giải mở rộng từ (x
1
,…, x
i
) sẽ không tốt hơn phương án
mẫu, do đó có thể bỏ đi không cần phát triển lời giải bộ phận (x
1

,…, x
i
) để tìm lời giải tối
ưu của bài toán.
Thủ tục quay lui sửa lại thành thủ tục nhánh cận như sau:
Try (i) ≡
for (j = 1 → n)
if( Chấp nhận được )
{
Xác định x
i
theo j;
Ghi nhận trạng thái mới;
if(i == n)
Cập nhật lời giải tối ưu ;
else
{
Xác định cận g(x
1
,…, x
i
) ;
if (g(x
1
,…, x
i
) = f* )
Try (i+1);
}
// Trả bài toán về trạng thái cũ

}
Thực chất của phương pháp nhánh cận là tìm kiếm theo chiều sâu trên cây liệt kê lời
giải như phương pháp quay lui, chỉ khác có một điều là khi tìm được x
i
mà đánh giá cận
g(x
1
,…,x
i
)>f* thì ta cắt bỏ các nhánh con từ x
i
đi xuống, mà quay lên ngay cha của nó là
x
i
-1.
Vấn đề là xác định hàm đánh giá cận như thế nào ?
HVTH: CH1301076 - Trần Khánh An 13
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
3. Phương pháp Heuristic
Trong nhiều bài toán dùng phương pháp thử - sai sẽ dẫn đến số lượng thử quá lớn
không chấp sẽ dẫn đến số lượng thử quá lớn không chấp nhận được.
Heuristic chính là ước lượng về khả năng dẫn đến lời giải của một trạng thái:
phương pháp vét cạn nhưng có thêm tri thức đi kèm, tối ưu cục bộ, nguyên lý hướng
đích, nguyên lý sắp thứ tự,
Mở rộng khái niệm thuật toán : thuật giải
Trong quá trình nghiên cứu giải quyết các vấn đề - bài toán, người ta đã đưa ra những
nhận xét như sau :
 Có nhiều bài toán cho đến nay vẫn chưa tìm ra một cách giải theo kiểu thuật toán
và cũng không biết là có tồn tại thuật toán hay không.
 Có nhiều bài toán đã có thuật toán để giải nhưng không chấp nhận được vì thời

gian giải theo thuật toán đó quá lớn hoặc các điều kiện cho thuật toán khó đáp
ứng.
 Có những bài toán được giải theo những cách giải vi phạm thuật toán nhưng vẫn
chấp nhận được.
Từ những nhận định trên, người ta thấy rằng cần phải có những đổi mới cho khái
niệm thuật toán. Người ta đã mở rộng hai tiêu chuẩn của thuật toán : tính xác định và tính
đúng đắn. Việc mở rộng tính xác định đối với thuật toán đã được thể hiện qua các giải
thuật đệ quy và ngẫu nhiên. Tính đúng của thuật toán bây giờ không còn bắt buộc đối với
một số cách giải bài toán, nhất là các cách giải gần đúng. Trong thực tiễn, có nhiều
trường hợp người ta chấp nhận các cách giải thường cho kết quả tốt (nhưng không phải
lúc nào cũng tốt) nhưng ít phức tạp và hiệu quả. Chẳng hạn nếu giải một bài toán bằng
thuật toán tối ưu đòi hỏi máy tính thực hiện nhiều năm thì chúng ta có thể sẵn lòng chấp
nhận một giải pháp gần tối ưu mà chỉ cần máy tính chạy trong vài ngày hoặc vài giờ.
Các cách giải chấp nhận được nhưng không hoàn toàn đáp ứng đầy đủ các tiêu
chuẩn của thuật toán thường được gọi là các thuật giải. Khái niệm mở rộng này của
thuật toán đã mở rộng cửa cho chúng ta trong việc tìm kiếm phương pháp để giải quyết
các bài toán được đặt ra.
Một trong những thuật giải thường được đề cập đến và sử dụng là các cách giải theo
kiểu Heuristic. Nó thể hiện cách giải bài toán với các đặc tính sau :
• Thường tìm được lời giải tốt (nhưng không chắc là lời giải tốt nhất)
• Giải bài toán theo thuật giải Heuristic thường dễ dàng và nhanh chóng đưa ra kết quả hơn
so với giải thuật tối ưu, vì vậy chi phí thấp hơn.
• Thuật giải Heuristic thường thể hiện khá tự nhiên, gần gũi với cách suy nghĩ và hành
động của con người.
HVTH: CH1301076 - Trần Khánh An 14
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
Có nhiều phương pháp để xây dựng một thuật giải Heuristic, trong đó người ta
thường dựa vào một số nguyên lý cơ sở như sau:
• Nguyên lý vét cạn thông minh: Trong một bài toán tìm kiếm nào đó, khi không gian tìm
kiếm lớn, ta thường tìm cách giới hạn lại không gian tìm kiếm hoặc thực hiện một kiểu

dò tìm đặc biệt dựa vào đặc thù của bài toán để nhanh chóng tìm ra mục tiêu.
• Nguyên lý tham lam (Greedy): Lấy tiêu chuẩn tối ưu (trên phạm vi toàn cục) của bài
toán để làm tiêu chuẩn chọn lựa hành động cho phạm vi cục bộ của từng bước (hay từng
giai đoạn) trong quá trình tìm kiếm lời giải.
• Nguyên lý thứ tự : Thực hiện hành động dựa trên một cấu trúc thứ tự hợp lý của không
gian khảo sát nhằm nhanh chóng đạt được một lời giải tốt.
• Hàm Heuristic: Trong việc xây dựng các thuật giải Heuristic, người ta thường dùng các
hàm Heuristic. Ðó là các hàm đánh giá thô, giá trị của hàm phụ thuộc vào trạng thái hiện
tại của bài toán tại mỗi bước giải. Nhờ giá trị này, ta có thể chọn được cách hành động
tương đối hợp lý trong từng bước của thuật giải.
• Meta heuristic: là loại heuristic tổng quát có thể áp dụng cho nhiều lớp bài toán. Meta
heuristic là một lãnh vực nghiên cứu phát triển mạnh mẽ, với sự ra đời của nhiều meta
heuristic như: giải thuật di truyền (genetic algorithm), giải thuật mô phỏng luyện kim
(simulated annealing), giải thuật đàn kiến ACO, tìm kiếm tabu (Tabu search)
CHƯƠNG 3: GIẢI THUẬT DI TRUYỀN (GA)
1. Giới thiệu về giải thuật di truyền
Giải thuật di truyền là một kỹ thuật của khoa học máy tính nhằm tìm kiếm giải pháp
thích hợp cho các bài toán tối ưu tổ hợp (combinatorial optimization). Giải thuật di
truyền là một phân ngành của giải thuật tiến hóa vận dụng các nguyên lý của tiến hóa như
di truyền, đột biến, chọn lọc tự nhiên, và trao đổi chéo.
Giải thuật di truyền thường được ứng dụng nhằm sử dụng ngôn ngữ máy tính để mô
phỏng quá trình tiến hoá của một tập hợp những đại diện trừu tượng (gọi là những nhiễm
sắc thể) của các giải pháp có thể (gọi là những cá thể) cho bài toán tối ưu hóa vấn đề. Tập
hợp này sẽ tiến triển theo hướng chọn lọc những giải pháp tốt hơn.
Thông thường, những giải pháp được thể hiện dưới dạng nhị phân với những chuỗi 0 và
1, nhưng lại mang nhiều thông tin mã hóa khác nhau. Quá trình tiến hóa xảy ra từ một tập
hợp những cá thể hoàn toàn ngẫu nhiên ở tất cả các thế hệ. Trong từng thế hệ, tính thích
nghi của tập hợp này được ước lượng, nhiều cá thể được chọn lọc định hướng từ tập hợp
hiện thời (dựa vào thể trạng), được sửa đổi (bằng đột biến hoặc tổ hợp lại) để hình thành
HVTH: CH1301076 - Trần Khánh An 15

Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
một tập hợp mới. Tập hợp này sẽ tiếp tục được chọn lọc lặp đi lặp lại trong các thế hệ kế
tiếp của giải thuật.
Như đã nói ở trên, GA là một thành phần của EC- một lĩnh vực được coi là có tốc độ phát
triển nhanh của trí tuệ nhân tạo. EC được chia ra thành 5 nhóm :
 Giải thuật di truyền (Genetic Algorithm - GA): Dựa vào quá trình di truyền
trong tự nhiên để cải tiến lời giải qua các thế hệ bắt nguồn từ một tập các lời giải
ban đầu.
 Quy hoạch tiến hoá (Evolutionary Programming -EP): Dựa vào quy luật tiến hoá,
tìm phương pháp liên hợp đủ khả năng giải quyết trọn vẹn một bài toán từ một lớp
các phương pháp giải quyết được một số phần của bài toán.
 Các chiến lược tiến hoá ( Evolutionary Strategies -ES): Dựa trên một số chiến
lược ban đầu, tiến hoá để tạo ra những chiến lược mới phù hợp với môi trường
thực tế một cách tốt nhất.
 Lập trình di truyền (Genetic Programming -GP): Mở rộng giải thuật di truyền
trong lĩnh vực các chương trình của máy tính. Mục đích của nó là để sinh ra một
cách tự động các chương trình máy tính giải quyết một cách tối ưu một vấn đề cụ
thể.
 Các hệ thống phân loại (Classifier Systems- CS): Các GA đặc biệt được dùng
trong việc học máy và việc phát hiện các quy tắc trong các hệ dựa trên các quy
tắc.
Giải thuật di truyền cũng như các thuật toán tiến hoá đều được hình thành dựa trên một
quan niệm được coi là một tiên đề phù hợp với thực tế khách quan. Đó là quan niệm
"Quá trình tiến hoá tự nhiên là quá trình hoàn hảo nhất, hợp lý nhất và tự nó đã mang
tính tối ưu". Quá trình tiến hoá thể hiện tính tối ưu ở chỗ thế hệ sau bao giờ cũng tốt hơn
thế hệ trước.
Quá trình phát triển của giải thuật di truyền có thể được chỉ ra qua các mốc thời gian sau :
 1960 : Ý tưởng đầu tiên về Tính toán tiến hoá được Rechenberg giới thiệu trong
công trình "Evolution Strategies" (Các chiến lược tiến hoá). Ý tưởng này sau đó
được nhiều nhà nghiên cứu phát triển.

 1975 : Giải thuật gen do John Holland phát minh và được phát triển bởi ông cùng
với các đồng nghiệp và những sinh viên. Cuốn sách "Adaption in Natural and
Artificial Systems" (Sự thích nghi trong các hệ tự nhiên và nhân tạo) xuất bản năm
1975 đã tổng hợp các kết quả của quá trình nghiên cứu và phát triển đó.
 1992 : John Koza đã dùng GA để xây dựng các chương trình giải quyết một số
bài toán và gọi phương pháp này là " lập trình gen".
Ngày nay giải thuật di truyền càng trở nên quan trọng, đặc biệt là trong lĩnh vực tối ưu
hoá, một lĩnh vực có nhiều bài toán thú vị, được ứng dụng nhiều trong thực tiễn nhưng
thường khó và chưa có giải thuật hiệu quả để giải .
HVTH: CH1301076 - Trần Khánh An 16
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
2. Các khái niệm cơ bản
Giải thuật di truyền dựa vào quá trình tiến hoá trong tự nhiên nên các khái niệm và
thuật ngữ của nó đều có liên quan đến các thuật ngữ của di truyền học.
Cá thể, nhiễm sắc thể
Trong giải thuật di truyền, một cá thể biểu diễn một giải pháp của bài toán. Không
giống với trong tự nhiên, một cá thể có nhiều nhiễm sắc thể (NST), ở đây ta quan niệm
một cá thể có một nhiễm sắc thể. Do đó khái niệm cá thể và nhiễm sắc thể trong giải
thuật di truyền coi như là tương đương.
Một NST được tạo thành từ nhiều gen, mỗi gen có thể có các giá trị khác nhau để
quy định một tính trạng nào đó. Trong GA, một gen được coi như một phần tử trong
chuỗi NST.
Quần thể
Quần thể là một tập hợp các cá thể có cùng một số đặc điểm nào đấy. Trong giải
thuật di truyền ta quan niệm quần thể là một tập các lời giải của một bài toán.
Chọn lựa
Trong tự nhiên, quá trình chọn lọc và đấu tranh sinh tồn đã làm thay đổi các cá thể
trong quần thể. Những cá thể tốt, thích nghi được với điều kiện sống thì có khả năng đấu
tranh lớn hơn, do đó có thể tồn tại và sinh sản. Các cá thể không thích nghi được với điều
kiện sống thì dần mất đi. Dựa vào nguyên lý của quá trình chọn lọc và đấu tranh sinh

tồn trong tự nhiên, chọn lựa các cá thể trong GA chính là cách chọn các cá thể có độ
thích nghi tốt để đưa vào thế hệ tiếp theo hoặc để cho lai ghép, với mục đích là sinh ra
các cá thể mới tốt hơn. Có nhiều cách để lựa chọn nhưng cuối cùng đều nhằm đáp ứng
mục tiêu là các cá thể tốt sẽ có khả năng được chọn cao hơn.
Lai ghép
Lai ghép trong tự nhiên là sự kết hợp các tính trạng của bố mẹ để sinh ra thế hệ con.
Trong giải thuật di truyền, lai ghép được coi là một sự tổ hợp lại các tính chất (thành
phần) trong hai lời giải cha mẹ nào đó để sinh ra một lời giải mới mà có đặc tính mong
muốn là tốt hơn thế hệ cha mẹ. Đây là một quá trình xảy ra chủ yếu trong giải thuật di
truyền.
Đột biến
Đột biến là một sự biến đổi tại một ( hay một số ) gen của nhiễm sắc thể ban đầu để
tạo ra một nhiễm sắc thể mới. Đột biến có xác suất xảy ra thấp hơn lai ghép. Đột biến có
thể tạo ra một cá thể mới tốt hơn hoặc xấu hơn cá thể ban đầu. Tuy nhiên trong giải thuật
di truyền thì ta luôn muốn tạo ra những phép đột biến cho phép cải thiện lời giải qua từng
thế hệ.
HVTH: CH1301076 - Trần Khánh An 17
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
3. Mô hình giải thuật di truyền
Với các khái niệm được giới thiệu ở trên, giải thuật di truyền được mô tả như sau :
Hình: Sơ đồ mô tả giải thuật di truyền
1. [Bắt đầu ] Nhận các tham số cho thuật toán.
2. [Khởi tạo ] Sinh ngẫu nhiên một quần thể gồm n cá thể ( là n lời giải cho bài toán)
3. [Quần thể mới ] Tạo quần thể mới bằng cách lặp lại các bước sau cho đến khi quần
thể mới hoàn thành
a.[Thích nghi] Ước lượng độ thích nghi eval(x) của mỗi cá thể.
b.[Kiểm tra ] Kiểm tra điều kiện kết thúc giải thuật.
HVTH: CH1301076 - Trần Khánh An 18
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
c.[Chọn lọc] Chọn hai cá thể bố mẹ từ quần thể cũ theo độ thích nghi của

chúng (cá thể có độ thích nghi càng cao thì càng có nhiều khả năng được chọn)
d.[Lai ghép] Với một xác suất lai ghép được chọn, lai ghép hai cá thể bố mẹ
để tạo ra một cá thể mới.
e.[Đột biến] Với một xác suất đột biến được chọn, biến đổi cá thể mới
5. [Chọn kết quả] Nếu điều kiện dừng được thỏa mãn thì thuật toán kết thúc và trả
về lời giải tốt nhất trong quần thể hiện tại
4. Các tham số của GA
Kích thước quần thể:
Kích thước quần thể cho biết có bao nhiêu cá thể trong một quần thể (trong một thế
hệ). Qua các nghiên cứu cũng như các thử nghiệm đã cho thấy kích thước quần thể không
nên quá bé cũng như không quá lớn. Nếu có quá ít cá thể thì ít có khả năng thực hiện lai
giống và chỉ một phần nhỏ không gian tìm kiếm được dùng. Như vậy sẽ dễ xảy ra trường
hợp bỏ qua các lời giải tốt. Nhưng quá nhiều cá thể cũng không tốt vì GA sẽ chạy chậm
đi, ảnh hưởng đến hiệu quả của giải thuật. Các nghiên cứu cũng đã chỉ ra không có lợi
khi tăng kích thước quần thể lên quá một giới hạn cho phép.
Xác suất lai ghép
Xác suất lai ghép cho biết việc lai ghép tạo ra thế hệ mới được thực hiện thường
xuyên như thế nào. Xác suất lai ghép là p
c
, khi đó khả năng để một cá thể được lai ghép
là p
c
. Nếu không thực hiện lai ghép, con sinh ra sẽ giống hoàn toàn bố mẹ. Nếu được lai
ghép, con sinh ra sẽ có một phần giống bố và một phần giống mẹ.
Xác suất đột biến
Xác suất đột biến cho biết các gen của NST thay đổi thường xuyên như thế nào.
Xác suất đột biến là p
m
, khi đó khả năng để mỗi gen của một NST bất kỳ bị đột biến là
p

m
. Toán tử đột biến có tác dụng ngăn ngừa giải thuật di truyền rơi vào tình trạng cực trị
địa phương, tuy nhiên nếu thực hiện đột biến với xác suất quá cao sẽ biến giải thuật di
truyền thành giải thuật tìm kiếm ngẫu nhiên.
5. Các cách mã hoá NST
Trong giải thuật di truyền cách mã hóa NST rất quan trọng nó không chỉ quyết
định đến hiệu quả của giải thuật mà còn ảnh hưởng đến việc lựa chọn các toán tử trong
các bước lai ghép và đột biến. Với mỗi kiều bài toán khác nhau có nhiều cách mã hóa
NST .
Cách mã hoá NST được đánh giá là một trong hai yếu tố quyết định trong xây
dựng giải thuật di truyền. Phần sau đây sẽ trình bày một số cơ chế mã hoá nhiễm sắc thể
HVTH: CH1301076 - Trần Khánh An 19
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
hay dùng cho giải thuật di truyền. Tuy nhiên, tuỳ thuộc vào các tri thức riêng của từng bài
toán mà ta sẽ lựa chọn hay xây dựng cách biểu diễn nhiễm sắc thể riêng phù hợp với bài
toán của mình.
Mã hoá nhị phân
Trong tất cả các phương pháp mã hóa thì phương pháp mã hoá nhị phân là phương
pháp mã hoá nhiễm sắc thể đơn giản và ra đời sớm nhất. Trong mã hoá nhị phân, mỗi
nhiễm sắc thể là một chuỗi nhị phân, mỗi bit trong nó có thể biểu diễn một đặc tính của
lời giải.
Ví dụ: hai nhiễm sắc thể 1 và 2 có chiều dài là 15.
Nhiễm sắc thể 1: 110110010011011
Nhiễm sắc thể 2: 110111100001111
Chẳng hạn, trong bài toán cái túi, để biểu diễn một cách xếp đồ vào túi, ta sẽ dùng
một chuỗi nhị phân có kích thước bằng số đồ vật, mỗi bit tương ứng với các đồ vật sẽ có
hai giá trị: giá trị 0 nếu đồ vật đó không được cho vào túi và giá trị 1 nếu đồ vật được cho
vào túi.
Mã hoá nhị phân tuy là phổ biến nhưng nó có một nhược điểm là có thể tạo ra
không gian mã hoá lớn hơn so với không gian giá trị của nhiễm sắc thể, hơn nữa có thể

xảy ra trường hợp các toán tử lai ghép và đột biến tạo ra các cá thể không nằm trong
không gian tìm kiếm và đòi hỏi phải có những phương pháp sửa chữa để làm cá thể tạo ra
nằm trong không gian tìm kiếm. Do đó, với nhiều bài toán thì biểu diễn nhị phân là
không hữu hiệu, điển hình là bài toán TSP.
Mã hoá hoán vị
Mã hoá hoán vị có thể được sử dụng trong các bài toán liên quan đến thứ tự như
bài toán du lịch hay bài toán lập lịch.
Trong mã hoá hoán vị, mỗi nhiễm sắc thể là một chuỗi các số biểu diễn một trình tự.
Ví dụ :
Nhiễm sắc thể 1: 1 5 4 3 2 6 7 9 8
Nhiễm sắc thể 2: 9 1 7 3 8 5 6 4 2
Mã hoá hoán vị phù hợp cho các bài toán liên quan đến thứ tự. Đối với các bài
toán này, việc thao tác trên các nhiễm sắc thể chính là hoán vị các số trong chuỗi đó làm
thay đổi trình tự của nó.
Ví dụ: Trong bài toán người du lịch, để biểu diễn một cách đi của người du lịch
thì dùng một nhiễm sắc thể mà trình tự các số trong chuỗi cho biết thứ tự các thành phố
mà người du lịch đi qua.
Mã hoá theo giá trị
Mã hoá trực tiếp theo giá trị có thể được dùng trong các bài toán sử dụng giá trị
phức tạp như trong số thực. Trong đó, mỗi nhiễm sắc thể là một chuỗi các giá trị. Các giá
HVTH: CH1301076 - Trần Khánh An 20
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
trị có thể là bất cứ cái gì liên quan đến bài toán, từ số nguyên, số thực, kí tự cho đến các
đối tượng phức tạp hơn.
Ví dụ:
Nhiễm sắc thể 1: 1.23 5.32 0.34 2.98 3.54
Nhiễm sắc thể 2: (back), (back), (right), (forward), (left)
Mã hoá theo giá trị thường dùng cho các bài toán đặc biệt. Trong cách mã hoá này
ta thường phải phát triển các toán tử đột biến và lai ghép cho phù hợp với từng bài toán.
6. Khởi tạo quần thể ban đầu

Quần thể ban đầu ảnh hưởng khá nhiều đến hiệu quả giải thuật, tuy nhiên trong nhiều bài
toán thì quần thể ban đầu thường được lựa chọn ngẫu nhiên
Hàm tính độ thích nghi
Hàm độ thích nghi(fitness function) là hàm đánh giá hay hàm mục tiêu thể hiện
tính thích ngi của cá thể hay độ tốt của lời giải
Cơ chế lựa chọn
Cơ chế lựa chọn được áp dụng khi quần thể P(t+1) được tạo ra từ việc chọn các
cá thể từ quần thể P(t) để thực hiện việc lai ghép và đột biến. Có nhiều cách để lựa chọn
các cá thể từ một quần thể. Sau đây sẽ giới thiệu một số cơ chế hay áp dụng.
Để tiện mô tả các cơ chế lựa chọn ta đưa ra một số kí hiệu sau :
Cách biểu diễn các nhiễm sắc thể thứ i là v
i
.
Hàm tính độ thích nghi của nhiễm sắc thể v
i
là f(v
i
).
Kích thước quần thể là pop_size.
Số nhiễm sắc thể cần chọn là N.
Lựa chọn tỷ lệ
Trước khi lựa chọn thì tính các giá trị sau :
 Tính tổng độ thích nghi của cả quần thể:

=
=
sizepop
i
i
vfF

_
1
)(

 Tính xác suất chọn p
i
cho mỗi nhiễm sắc thể v
i
: p
i
= f(v
i
)/F
 Tính vị trí xác suất q
i
của mỗi nhiễm sắc thể :

=
=
i
j
ji
Pq
1
Cơ chế lựa chọn theo bánh xe Roulet được thực hiện bằng cách quay bánh xe
Roulet N lần. Mỗi lần chọn một nhiễm sắc thể từ quần thể hiện hành vào quần thể mới
bằng cách sau :
 Phát sinh ngẫu nhiên một số r trong khoảng [0,1].
HVTH: CH1301076 - Trần Khánh An 21
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn

 Nếu r < q
1
thì chọn nhiễm sắc thể v
1
; ngược lại thì chọn nhiễm sắc thể thứ i ( 2 ≤ i
≤ pop_size ) sao cho q
i-1
≤ r ≤ q
i
.
Với cơ chế lựa chọn như thế này thì có một số nhiếm sắc thể sẽ được chọn nhiều
lần. Điều này phù hợp với lý thuyết lược đồ: Các nhiễm sắc thể tốt nhất thì có nhiều bản
sao, nhiễm sắc thể trung bình thì không đổi , nhiễm sắc thể kém thì chết đi [11].
Lựa chọn xếp hạng
Cơ chế lựa chọn xếp hạng được mô tả như sau:
 Sắp xếp các nhiễm sắc thể trong quần thể theo độ thích nghi từ thấp đến cao.
 Đặt lại độ thích nghi cho quần thể đã sắp xếp theo kiểu: nhiễm sắc thể thứ nhất có
độ thích nghi là 1, NST thứ hai có độ thích nghi là 2, .v.v., NST thứ pop_size có
độ thích nghi là pop_size.
Theo phương pháp này việc một NST được chọn nhiều lần như trong lựa chọn
theo kiểu bánh xe Roulet đã giảm đi. Nhưng nó có thể dẫn đến sự hội tụ chậm và NST có
độ thích nghi cao cũng không khác mấy so với các NST khác.
Lựa chọn theo cơ chế lấy mẫu ngẫu nhiên
Cơ chế lựa chọn:
 Biểu diễn xác suất chọn các NST lên trên một đường thẳng.
 Đặt N điểm chọn lên đường thẳng. Các điểm chọn này cách nhau 1/N, điểm đầu
tiên đặt ngẫu nhiên trong khoảng [0,1/N]
 Với một điểm chọn, NST gần với nó nhất về bên phải sẽ được chọn.
Phương pháp này có đặc điểm là các điểm chọn được phân bố đều trên trục số, do
đó sẽ gần với điểm xứng đáng được chọn.

Lựa chọn tranh đấu
Cơ chế lựa chọn :
 Lấy một số NST trong quần thể, NST nào có độ thích nghi cao nhất được chọn.
 Lặp lại thao tác trên N lần.
7. Các toán tử di truyền
Các toán tử di truyền là các hàm biến đổi NST từ thế hệ P(t) để tạo ra các NST của
thế hệ P(t+1). Các toán tử di truyền của GA là toán tử lai ghép và đột biến. Việc xây
dựng hai toán tử này đóng vai trò rất quan trọng trong hiệu quả của giải thuật. Nó phải
được đảm bảo rằng kết quả sinh ra của 2 toán tử là hợp lệ theo nghĩa phải nằm trong
không gian tìm kiếm của giải thuật, lấy ví dụ với bài toán TSP thì việc mã hóa nhị phân
và toán tử đột biến và lai ghép sẽ tạo ra các cá thể không phù hợp vì không tạo thành 1
đường đi hợp lệ, do đó mã hóa nhị phân ít được dùng cho bài toán TSP.
Toán tử lai ghép
HVTH: CH1301076 - Trần Khánh An 22
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
Lai ghép đơn điểm cắt :
 Một điểm cắt được chọn tại một vị trí thứ k trên NST.
 Từ đầu NST đến vị trí k, NST con sao chép từ cha, phần còn lại sao chép từ
mẹ.
Lai ghép hai điểm cắt :
 Hai điểm cắt được chọn .
 Từ đầu cho đến điểm cắt thứ nhất được sao chép từ cha, từ điểm cắt thứ
nhất đến điểm cắt thứ hai sao chép từ mẹ và phần còn lại sao chép từ cha.
Lai ghép đồng nhất :
 Có một mặt nạ sao chép là một chuỗi nhị phân có chiếu dài bằng chiều dài
NST.
 Xây dựng NST mới: Duyệt qua mặt nạ, bit có giá trị một thì sao chép gen
tại vị trí đó từ NST cha sang con, bit có giá trị 0 thì sao chép từ mẹ.
 Mặt nạ được phát sinh ngẫu nhiên đối với từng cặp cha mẹ.
Lai ghép số học: NST con được tạo thành bằng cách thực hiện một phép toán

logic nào đó như AND, OR, … với cặp NST bố mẹ.
Toán tử đột biến
Phép đảo bit : Bit được chọn sẽ bị đảo
Thay đổi thứ tự : Hai số được chọn hoán đổi vị trí cho nhau.
8. Chiến lược nạp lại quần thể
Nạp lại hoàn toàn
Tạo ra số NST mới bằng kích thước quần thể và quần thể mới bao gồm toàn các
NST mới này, không có NST nào của thế hệ trước.
Nạp lại ngẫu nhiên
Tạo ra số NST mới ít hơn kích thước quần thể và thay thế một cách ngẫu nhiên
các NST ở thế hệ trước bằng NST ở thế hệ sau.
Nạp lại theo mô hình cá thể ưu tú
Tạo ra số NST mới ít hơn kích thước quần thể và thay thế chúng cho các bố mẹ có
độ thích nghi thấp.
Nhận xét về các chiến lược nạp lại :
 Nạp lại hoàn toàn : là chiến lược đơn giản nhất. Mỗi NST chỉ tồn tại trong một
thế hệ, sang thế hệ tiếp theo sẽ được thay mới hoàn toàn. Như vậy sẽ xảy ra trường
HVTH: CH1301076 - Trần Khánh An 23
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
hợp là các NST tốt sẽ không được giữ lại, do đó chiến lược này không phải là
chiến lược phù hợp cho việc cải thiện lời giải qua các thế hệ.
 Nạp lại theo mô hình cá thể ưu tú: Được coi là chiến lược tối ưu. Các NST tốt sẽ
sống sót qua nhiều thế hệ. Qua mỗi thế hệ, sẽ có một số lượng nhất định các NST
tồi bị thay thế. Tuy chiến lược không kiểm tra các NST con cháu nạp vào có tốt
hơn bố mẹ bị loại đi hay không nhưng chắc chắn là những NST con cháu nạp vào
nếu là tồi thì sẽ bị loại trong thế hệ tiếp. Như vậy nó vẫn đảm bảo qua nhiều thế hệ
thì tính chất của quần thể sẽ được cải thiện dần dần.
CHƯƠNG 4: BÀI TOÁN NGƯỜI DU LỊCH
1. Xây dựng giải pháp cho bài toán người du lịch
1.1. Giới thiệu bài toán

Bài toán người du lịch (Travelling Salesman problem (TSP)) là một bài toán nổi
tiếng trong lĩnh vực tối ưu tổ hợp được nghiên cứu trong lý thuyết khoa học máy tính.
Nội dung của nó khá đơn giản , nó được phát biểu như sau : Cho một danh sách các thành
phố và khoảng cách giữa chúng , nhiệm vụ là phải tìm đường đi ngắn nhất có thể mà chỉ
thăm mỗi thành phố đúng 1 lần.
Bài toán được lần đầu tiên đưa ra như một vấn đề toán học vào năm 1930 và là
một trong số những bài toán được nghiên cứu chuyên sâu trong lĩnh vực tổ hợp thời đó.
Nó được sử dụng như một sự đánh giá cho nhiều phương thức tối ưu khác nhau. Thậm
chí bài toán là thuộc lớp NP khó , một lượng rất lớn các heuristic và phương thức tìm
kiếm cụ thể đã được biết đến vì vậy một vài trường hợp của bài toán với khoảng chục
nghìn thành phố đã được giải quyết.
TSP có một vài ứng dụng thậm chí trong dạng thức nguyên thuỷ của nó như lập kế hoạch
, logistic , và sản xuất các microchip. Thay đổi đi chút ít nó xuất hiện như một bài toán
con trong rất nhiều lĩnh vực như việc phân tích gen trong sinh học. Trong những ứng
dụng này, khái niệm thành phố có thể thay đổi thành khách hàng, các điểm hàn trên bảng
mạch, các mảnh DNA trong gen, và khái niệm khoảng cách có thể biểu diễn bởi thời gian
du lịch hay giá thành , hay giống như sự so sánh giữa các mảnh DNA với nhau. Trong
nhiều ứng dụng, các hạn chế truyền thống như giới hạn tài nguyên hay giới hạn thời gian
thậm chí còn làm cho bài toán trở nên khó hơn
1.2. Phát biểu bài toán
Một du khách muốn thăm mọi thành phố anh quan tâm, mỗi thành phố thăm qua
đúng một lần; rồi trở về điểm khởi hành. Biết trước chi phí di chuyển giữa hai thành phố
bất kỳ. Hãy xây dựng một lộ trình thỏa các điều kiện trên với tổng chi phí là nhỏ nhất.
HVTH: CH1301076 - Trần Khánh An 24
Thuật toán & PP giải quyết vấn đề PGS.TS Đỗ Văn Nhơn
1.3. Mô hình hóa vấn đề
• Xác định DIK:
Vấn đề được mô hình hóa bằng đồ thị có trọng số dương G={V,E}. Trong đó:
V: là tập đỉnh
E: là tập cạnh

w là hàm trọng số: E->R
+
• Xác định Input:
V: Tập các đỉnh cần phải đi qua.
E: Tập cạnh nối các đỉnh của đồ thị.
• Xác định Output:
Là đường đi ngắn nhất từ a đến z. Kí hiệu (P): là danh sách đỉnh từ [a,…,z].
1.4. Thiết kế thuật toán
 Ý tưởng:
TSP là bài toán tối ưu tổ hợp. Có thể giải bài toán này bằng nhiều phương pháp:
phương pháp nhánh cận kết hợp quay lui, phương pháp gần đúng hay những phương
pháp tìm kiếm heuristic.
Gọi π là một hoán vị của {1, , n} thì một hành trình thỏa yêu cầu bài toán có
dạng:
Nên có tất cả n! hành trình như thế.
Nếu ta cố định một địa điểm xuất phát, chẳng hạn T
1
, thì có (n-1)! hành trình.
Bài toán chuyển về dạng :
Tìm Min{f(a
2
, , a
n
) : (a
2
, , a
n
) là hoán vị của {2, ,n}}.
Với
Cách giải bài toán sẽ kết hợp đánh giá nhánh cận trong quá trình liệt kê

phương án của thuật toán quay lui.
 Thiết kế
Input: C = (C
ij
)
Output: - x* = (x
1
, ,x
n
) // Hành trình tối ưu
HVTH: CH1301076 - Trần Khánh An 25

×