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

Phát triển thuật toán giải bài toán tối ưu hóa trong điều hành vận tải chở hành khách và hàng hóa chia sẻ lộ trình

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 (1.34 MB, 55 trang )

BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
---------------------------------------

Thân Thị Lệ Quyên

PHÁT TRIỂN THUẬT TOÁN GIẢI BÀI TOÁN TỐI ƯU HOÁ
TRONG ĐIỀU HÀNH VẬN TẢI CHỞ HÀNH KHÁCH VÀ HÀNG
HỐ CHIA SẺ LỘ TRÌNH
Chun ngành: Cơng nghệ thơng tin

LUẬN VĂN THẠC SĨ KHOA HỌC
CƠNG NGHỆ THƠNG TIN

NGƯỜI HƯỚNG DẪN KHOA HỌC
TS. Phạm Quang Dũng

Hà Nội – Năm 2017


CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập – Tự do – Hạnh phúc
BẢN XÁC NHẬN CHỈNH SỬA LUẬN VĂN THẠC SĨ
Họ và tên tác giả luận văn: Thân Thị Lệ Quyên
Đề tài luận văn: Phát triển thuật toán giải bài toán tối ưu hoá trong điều hành
vận tải chở hành khách và hàng hố chia sẻ lộ trình
Chun ngành:
Công nghệ thông tin
Mã số SV:
CB150297
Tác giả, Người hướng dẫn khoa học và Hội đồng chấm luận văn xác nhận tác giả đã


sửa chữa, bổ sung luận văn theo biên bản họp Hội đồng ngày 28/10/2017 với các
nội dung sau:
A. Về trình bày
1. Phần Hàm mục tiêu f1 và f2 bổ sung "--> max" hoặc "--> min"
2. Hình 1.18 sửa E2 thành E1
B. Về nội dung
1. Bổ sung thêm tính toán độ phức tạp của thuật toán
2. Bổ sung thêm ưu điểm, nhược điểm của thuật toán

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

Hà Nội, ngày 10 tháng 11 năm 2017
Tác giả luận văn

CHỦ TỊCH HỘI ĐỒNG


LỜI MỞ ĐẦU

Trong thực tế hiện nay có nhiều loại mơ hình vận tải. Việc vận chuyển hàng
hóa từ kho đến các cửa hàng. Hệ thống chuyển hàng hóa theo yêu cầu. Hệ thống
chở người và vận chuyển hàng hóa theo tuyến cố định, hệ thống taxi, hệ thống xe
buýt... các mơ hình này về cơ bản đã phục vụ phần lớn nhu cầu đi lại và vận chuyển
hàng hóa. Tuy nhiên mơ hình vận tải truyền thống đặc biệt là ở khu vực thành thị,
hoạt động chở người và hoạt động vận chuyển hàng hóa được xử lý riêng biệt. Việc
thiếu thông tin thời gian thực và sự phức tạp về lập kế hoạch tăng do sự kết hợp như
vậy là một trong những lý do chính. Có rất ít nghiên cứu về lợi ích có được bằng
cách kết hợp việc vận chuyển hàng hóa và chở người. Việc kết hợp này phù hợp với
xu hướng phát triển của nền kinh tế chia sẻ.
Kết hợp chở người và vận chuyển hàng hóa tạo ra cơ hội kinh doanh hấp dẫn

bởi vì nhu cầu vận chuyển tương tự có thể được đáp ứng với ít xe và chi phí thấp
hơn. Với chi phí thấp hơn sẽ kéo theo giá thành trong việc chở người và vận chuyển
hàng hóa chi phí sẽ giảm theo, ngồi ra cịn giảm nguy cơ tắc nghẽn giao thông, gây
ra nhiều hệ lụy như về ô nhiễm môi trường….
Trong luận văn này, chúng tôi khảo sát bài tốn lập lộ trình vận tải kết hợp
giữa chở người và hàng hóa. Trong đó cần tính tốn lộ trình cho một đội xe Taxi
phục vụ các yêu cầu vận chuyển, mỗi yêu cầu bao gồm các thông tin như điểm đón,
điểm trả, khung thời gian... Sau đó chúng tơi đề xuất và cài đặt thử nghiệm 7 thuật
tốn tham lam xây dựng lời giải. Các thuật toán này được cài đặt, thử nghiệm và
đánh giá trên các bộ dữ liệu trích xuất từ bộ dữ liệu vận hành của Taxi San
Francisco.
Luận văn được chia thành 3 chương không kể phần mở đầu và kết luận:
Chương 1 trình bày cơ sở lý thuyết về bài toán tối ưu tổ hợp, bài tốn tối ưu lộ trình
vận tải, các hướng tiếp cận và thư viện. Chương 2 trình bày về 7 thuật toán tham
lam và chiến lược của từng thuật tốn. Chương 3 trình bày về kết quả thử nghiệm và
đánh giá đối với các bộ dữ liệu và tốc độ khác nhau.

Trang 1


MỤC LỤC
Trang
LỜI MỞ ĐẦU ............................................................................................................1
LỜI CẢM ƠN ............................................................................................................4
DANH MỤC CÁC CHỮ VIẾT TẮT .........................................................................5
DANH MỤC CÁC BẢNG..........................................................................................6
DANH MỤC CÁC HÌNH VẼ.....................................................................................7
DANH MỤC CÁC GIẢ MÃ ......................................................................................7
CHƯƠNG 1. CƠ SỞ LÝ THUYẾT .........................................................................8
1.1 Bài toán tối ưu tổ hợp ........................................................................................8

1.2 Các hướng tiếp cận giải bài toán tối ưu tổ hợp ...............................................10
1.3 Các bài toán tối ưu điều hành vận tải ..............................................................11
1.4 Thư viện CBLSVR ..........................................................................................13
1.5 Bài toán điều hành vận tải chở người và hàng hoá chia sẻ tuyến đường ........24
CHƯƠNG 2. CÀI ĐẶT THUẬT TOÁN GIẢI BÀI TOÁN ĐIỀU HÀNH VẬN
TẢI CHỞ NGƯỜI VÀ HÀNG HOÁ .....................................................................32
2.1 Chiến lược tham lam 1 (Greedy1)...................................................................32
2.2 Chiến lược tham lam 2 (Greedy2)...................................................................33
2.3 Chiến lược tham lam 3 (Greedy3)...................................................................35
2.4 Chiến lược tham lam 4 (Greedy4)...................................................................36
2.5 Chiến lược tham lam 5 (Greedy5)...................................................................37
2.6 Chiến lược tham lam 6 (Greedy6)...................................................................38
2.7 Chiến lược tham lam 7 (Greedy7)...................................................................39
CHƯƠNG 3. THỬ NGHIỆM VÀ ĐÁNH GIÁ ....................................................41
3.1 Dữ liệu .............................................................................................................41
3.2 Kết quả thử nghiệm và đánh giá .....................................................................41
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN .............................................................50
TÀI LIỆU THAM KHẢO ......................................................................................51

Trang 2


LỜI CAM ĐOAN
Tôi xin cam đoan số liệu và kết quả nghiên cứu trong luận văn này là trung
thực và không sao chép từ bất kỳ đồ án, luận văn nào khác. Mọi thơng tin trích dẫn
trong luận văn đã được chỉ rõ nguồn gốc rõ ràng và được phép công bố. Nếu không
đúng như đã nêu trên tôi xin hồn tồn chịu trách nhiệm về đề tài của mình.
Hà Nội, Ngày.... Tháng.... Năm 2017
Học viên thực hiện


Thân Thị Lệ Quyên

Trang 3


LỜI CẢM ƠN

Em xin gửi lời cảm ơn chân thành và sự tri ân sâu sắc đối với các thầy cô của
trường Đại học Bách Khoa Hà Nội, đặc biệt là các thầy cô trong viện Công Nghệ
Thông Tin và truyền thông của trường đã tạo điều kiện cho em được học tập và
nghiên cứu chuyên ngành công nghệ thông tin. Và em cũng xin chân thành cảm ơn
thầy TS. Phạm Quang Dũng và các thành viên trong nhóm nghiên cứu đã nhiệt tình
hướng dẫn, giúp đỡ em hồn thành khóa luận tốt nghiệp.
Với điều kiện thời gian cũng như kinh nghiệm còn hạn chế của một học viên,
luận văn này khơng thể tránh được những thiếu sót. Em rất mong nhận được sự chỉ
bảo, đóng góp ý kiến của các thầy cơ để em có điều kiện bổ sung, nâng cao ý thức
của mình, phục vụ tốt hơn trong công việc thực tế.
Em xin chân thành cảm ơn!

Trang 4


DANH MỤC CÁC CHỮ VIẾT TẮT

Tên đầy đủ

Chữ viết tắt
VRP
CVRP


VRPTW

CBLS

CBLSVR

Ý nghĩa

Vehicle Routing Problem

Bài toán vận tải

Capacitated Vehicle Routing

Bài toán vận tải có ràng buộc

Problem

sức chứa

Vehicle Routing Problem with

Bài tốn vận tải có ràng buộc

Time Window

về khung thời gian

Constraint Based Local Search


Tìm kiếm cục bộ dựa trên
ràng buộc

Constraint Based Local Search

Tìm kiếm cục bộ dựa trên

Vehicle Routing

ràng buộc các bài toán vận tải
Tìm kiếm trên các tập láng

VNS

Variable Neighborhood Search

ILP

Integer Linear Program

Quy hoạch ngun tuyến tính

VRPPD

VRP Pickup and Delivery

Bài tốn vận chuyển hàng

Trang 5


giềng khác nhau.


DANH MỤC CÁC BẢNG
Bảng 1.1: Nhóm hàm khởi tạo lời giải ......................................................................21
Bảng 1.2: Nhóm hàm truy vấn về trạng thái của lời giải ..........................................21
Bảng 1.3: Một số hàm và ràng buộc cơ bản được thiết kế trong thư viện CBLSVR23
Bảng 1.4: Các ký hiệu hình vẽ ..................................................................................26
Bảng 3.1: Mơ tả bộ dữ liệu........................................................................................41
Bảng 3.2: Kết quả thử nghiệm với bộ dữ liệu n1000r100_1 ....................................43
Bảng 3.3: Kết quả thử nghiệm với bộ dữ liệu n1000r200_1 ....................................44
Bảng 3.4: Kết quả thử nghiệm với bộ dữ liệu n2000r100_1 ....................................45
Bảng 3.5: Kết quả thử nghiệm với bộ dữ liệu n2000r200_1 ....................................47
Bảng 3.6: Kết quả thuật toán tham lam thứ 5 với trường hợp ngẫu nhiên................48
Bảng 3.7: So sánh thuật toán greedy2 với bộ dữ liệu n2000r100_1 .........................48

Trang 6


DANH MỤC CÁC HÌNH VẼ
Hình 1.1: Ví dụ 2 tuyến đường khác nhau ................................................................14
Hình 1.2: Minh họa thuật tốn performTwoOptMove1(2,6) ....................................14
Hình 1.3: Minh họa thuật tốn performTwoOptMove1(2,6) ....................................14
Hình 1.4: Minh họa thuật tốn performTwoOptMove3(2,6) ....................................15
Hình 1.5: Minh họa thuật tốn performTwoOptMove4(2,6) ....................................15
Hình 1.6: Ví dụ 2 tuyến đường khác nhau router[1], router[2].................................16
Hình 1.7: Minh họa thuật tốn performTwoOptMove5(2,6) ....................................16
Hình 1.8: Minh họa thuật tốn performTwoOptMove6(2,6) ....................................16
Hình 1.9: Minh họa thuật tốn performTwoOptMove7(2,6) ....................................17
Hình 1.10: Minh họa thuật tốn performTwoOptMove8(2,6) ..................................17

Hình 1.11: Ví dụ 2 tuyến đường với 5 điểm .............................................................18
Hình 1.12: Minh họa thuật tốn performOrOptMove1(2,4,6) ..................................18
Hình 1.13: Minh họa thuật tốn performOrOptMove2(2,4,6) ..................................18
Hình 1.14: Ví dụ tuyến đường với 8 điểm ................................................................19
Hình 1.15: Minh họa thuật tốn performThreeOptMove1(2,4,6) .............................19
Hình 1.16: Ví dụ 2 tuyến đường router[1] và router [2] với các điểm khác nhau ....20
Hình 1.17: Minh họa giải thuật performCrossExchangeMove(2,4,7,9) ...................20
Hình 1.18: Minh họa lộ trình vận tải cho 3 xe ..........................................................27

DANH MỤC CÁC GIẢ MÃ
Giả mã 2.1: Thuật toán tham lam thứ 1 ....................................................................33
Giả mã 2.2: Thuật toán tham lam thứ 2 ....................................................................34
Giả mã 2.3: Thuật toán tham lam thứ 3 ....................................................................35
Giả mã 2.4: Thuật toán tham lam thứ 4 ....................................................................36
Giả mã 2.5: Thuật toán tham lam thứ 5 ....................................................................37
Giả mã 2.6: Thuật toán tham lam thứ 6 ....................................................................38
Giả mã 2.7: Thuật toán tham lam thứ 7 ....................................................................40

Trang 7


CHƯƠNG 1. CƠ SỞ LÝ THUYẾT
1.1 Bài toán tối ưu tổ hợp
Bài toán tối ưu tổ hợp là bài toán không quan tâm đến việc xây dựng tất cả
các cấu hình như bài tốn liệt kê mà chỉ nhằm xây dựng một cấu hình “tốt” nhất
theo một mục tiêu nào đó. Bài tốn thường xuất hiện rất nhiều trong các lĩnh vực
của đời sống xã hội đặc biệt là các hoạt động quản lý, lập kế hoạch, điều hành trong
các tổ chức, doanh nghiệp. Như bài toán lập tuyến tối ưu trong lĩnh vực giao thông
vận tải [18] [16], bài tốn đóng gói hàng hóa [26], bài tốn xếp hàng trong các dây
chuyền sản xuất [8], bài toán xếp thời khóa biểu trong quản lý đào tạo [25]…

Mục tiêu của các bài tốn này là cần tìm ra một lời giải thỏa mãn một tập các
ràng buộc đặt ra, đồng thời tối ưu một hoặc nhiều hàm mục tiêu nào đó.
Một bài tốn tối ưu tổ hợp [31] là một bộ (X,D,C,f) trong đó:
X ={X1,…,Xn} là tập các biến,
D ={D1,…,Dn} trong đó Di là một tập rời rạc thể hiện miền giá trị của Xi.
C ={C1,…,Ck} là tập các ràng buộc được định nghĩa trên các biến,
f là hàm mục tiêu cần tối ưu. Trong nhiều bài toán, yêu cầu đặt ra là tìm lời
giải thỏa mãn ràng buộc, vì vậy hàm mục tiêu f khơng được quan tâm.
Bài tốn tối ưu tổ hợp có nhiều ứng dụng trong thực tế, đã và đang thu hút
được đầu tư nghiên cứu nhằm giải quyết các vấn đề trong điều hành, sản xuất để
tăng sản lượng lao động, tiết kiệm chi phí ngun liệu và thời gian.
Ví dụ về bài tốn N-Queen yêu cầu xếp n con hậu lên một bàn cờ vua kích
thước nxn sao cho khơng có hai con hậu bất kì nào khống chế nhau. Khả năng
khống chế của mỗi con hậu bao gồm:
Khống chế những ô cùng hàng hoặc cùng cột.
Khống chế những ô thuộc cùng đường chéo.
Bài toán N-Queen thuộc vào lớp bài toán tối ưu tổ hợp, có thể được mơ tả bằng mơ
hình tốn học:
Tập n biến quyết định X = {X1,X2,…,Xn}: Biến Xi biểu thị hàng cho con hậu
đứng ở cột i.
Miền giá trị D = {D1,D2,…,Dn} trong đó Di= {1…n} Mỗi biến Xi có miền từ
1 đến n.
Trang 8


Tập ràng buộc:
Xi ≠ Xj với i ≠ j: Các con hậu không ở cùng 1 hàng.
Xi+i ≠ Xj+j với i ≠ j: Các con hậu không khống chế theo đường chéo.
Xi-i ≠ Xj-j với i ≠ j: Các con hậu khơng khống chế theo đường chéo.
Q trình giải bài tốn theo hướng tìm kiếm cục bộ dựa trên ràng buộc gồm hai

bước chính dựa theo kiến trúc CBLS [28]:
Mơ hình hóa bài tốn
Định nghĩa các biến quyết định.
Xây dựng ràng buộc và hàm mục tiêu.
Tìm kiếm
Khởi tạo lời giải ban đầu.
Thực hiện lặp: Di chuyển qua các lời giải lân cận.
Phân tích bài tốn N-Queen với n = 8 theo mơ hình CBLS. Q trình mơ hình hóa
bài tốn dựa theo mơ hình tốn học đã trình bày ở trên:
Tập biến: Mảng x[i], trong đó x[i] là hàng của con hậu trên cột i.
Miền giá trị x[i], D[i] = [0...7].
Tập ràng buộc:
Xi ≠ Xj với i ≠ j
Xi+i ≠ Xj+j với i ≠ j
Xi-i ≠ Xj-j với i ≠ j
Một lời giải là một cách gán giá trị {X1 = x1, X2 = x2,…, X7 = x7} thỏa mãn
tất cả các ràng buộc.
Tập lời giải lân cận của một lời giải S = {x1,x2,…x7} gồm mọi lời giải S’ =
{y1, y2,…y7} sao cho:
xi ≠ yi với một giá trị i duy nhất.
xj = yj với mọi j ≠ i.
Chỉ có duy nhất một loại bước di chuyển là gán lại giá trị một phần tử Xi trong tập
biến. Lời giải được khởi tạo ngẫu nhiên. Tìm kiếm dừng lại khi khơng cịn vi phạm.
Lời giải tiếp theo được lựa chọn ra trong các lời giải lân cận hiện tại theo
cách tham lam:
Chọn con hậu ở cột i đang bị khống chế nhiều nhất.
Trang 9


Gán lại giá trị Xi thành giá trị làm giảm vi phạm nhiều nhất.

1.2 Các hướng tiếp cận giải bài toán tối ưu tổ hợp
Các hướng tiếp cận để giải bài toán tối ưu tổ hợp được chia thành 2 loại:
hướng tiếp cận giải đúng và hướng tiếp cận giải gần đúng. Hướng tiếp cận giải đúng
đảm bảo luôn cho lời giải tối ưu, tuy nhiên với các bộ dữ liệu lớn thì thời gian tính
là rất lớn. Hướng tiếp cận giải gần đúng trong đó có tìm kiếm cục bộ để giải các bài
tốn tối ưu tổ hợp kích thước lớn đang được quan tâm nghiên cứu phát triển vì nó
có khả năng tìm ra lời giải chất lượng tốt trong nhiều bài tốn kích thước lớn với
thời gian hữu hạn cho phép.
1.2.1 Hướng tiếp cận giải đúng
Hướng tiếp cận giải đúng bao gồm các kỹ thuật cho phép tìm ra lời giải tối
ưu hoặc chỉ ra lời giải thỏa mãn ràng buộc khơng tồn tại vì nó duyệt hết các khả
năng trong không gian lời giải. Phương pháp này bao gồm các thuật tốn điển hình
như thuật tốn nhánh cận hoặc quy hoạnh động, quy hoạch ràng buộc, hay quy
hoạch nguyên tuyến tính (ILP).
1.2.2 Hướng tiếp cận giải gần đúng
Tìm kiếm cục bộ (Local Search) là phương pháp tìm lời giải tốt hơn từ
những lời giải là láng giềng của lời giải hiện tại bằng cách áp dụng các phép biến
đổi cục bộ để sinh ra lời giải láng giềng từ lời giải hiện tại.
Để tránh vấn đề tối ưu cục bộ của Local search có thể áp dụng các phương
pháp Meta-Heuristic được trình bày sau đây:
-

Tìm kiếm Tabu (Tabu search) [13] [14] Là thuật toán sử dụng một danh sách

chứa các thao tác di chuyển đã thực hiện trước đó, thao tác di chuyển sẽ khơng được
thực hiện nếu đã tồn tại trong danh sách. Sử dụng phương pháp này để tránh quay
trở lại các lời giải trước đó.
-

Giải thuật di truyền [15] dựa trên các nguyên lý của tiến hóa như đột biến,


chọn lọc. Ý tưởng ban đầu là khởi tạo một quần thể các lời giải. Các cặp cá thể
trong quần thể sẽ giao ghép với nhau để tạo ra cá thể mới có đặc tính như cặp cá thể
sinh ra nó. Hoặc từ một cá thể đột biến cho ra cá thể khác bằng cách thay đổi một số
đặc tính của cá thể ban đầu. Cho đến nay, đã có rất nhiều phương thức được đề xuất
Trang 10


cho quá trình ghép gặp và đột biến áp dụng cho bài tốn tối ưu, trong đó có đề xuất
khác thành cơng như [20] [5] [4].
-

Thuật tốn Variable neighborhood Search chia tập láng giềng thành các tập

láng giềng nhỏ hơn với độ ưu tiên khác nhau. Trong quá trình tìm kiếm các tập láng
giềng sẽ lần lượt được duyệt theo thứ tự ưu tiên theo các mức độ ưu tiên cho trước.
Nếu tìm thấy láng giềng tốt hơn lời giải hiện tại thì các tập láng giềng cịn lại sẽ
khơng được duyệt, nhờ vậy tại mỗi vòng lặp, lời giải được cải thiện với chi phí thấp
và trong tình huống gặp tối ưu cục bộ, tất cả các tập láng giềng sẽ được duyệt để tìm
lời giải tốt hơn do đó khả năng tìm được lời giải tối ưu sẽ cao hơn. Hansen đã
nguyên cứu tỉ mỉ thuật toán Variable Neighborhood Search (VNS) cơ bản và các kỹ
thuật cải tiến, rồi sử dụng chúng để giải nhiều bài toán cổ điển trong [19].
1.3 Các bài toán tối ưu điều hành vận tải
Bài toán tối ưu điều hành vận tải là bài tốn trong đó cần xây dựng lộ trình
cho một đội xe phục vụ các yêu cầu vận chuyển người và hàng hóa. Có nhiều biến
thể của bài tốn phụ thuộc vào ràng buộc và hàm mục tiêu trong tùy từng ngữ cảnh
cụ thể.
Vào năm 1959 Dantzig [6] và cộng sự đã đề xuất mơ hình hóa của bài tốn
vận tải dưới dạng bài tốn tối ưu. Trong mơ hình với điều kiện bao gồm các xe vận
tải giống nhau về sức chứa để vận chuyển hàng hóa từ kho trung tâm đến cho khách

hàng. Ngày nay, bài toán này được gọi chung là “Vehicle Routing Problem” (VRP)
[17] [22]. Đã có rất nhiều bài báo nghiên cứu về vấn đề này và phát triển theo nhiều
hướng khác nhau như Capacitated Vehicle Routing problem (CVRP) [30] Min-Max
Capacitated Vehicle Routing Problem (MMCVRP) [1], Vehicle Routing Problem
with Time Windows (VRPTW) [7].
Mục tiêu của bài toán CVRP là tổng chiều dài tuyến đường là ngắn nhất. Có
rất nhiều nhà khoa học đã phát triển các thuật tốn heuristics [11] [24] và thuật tốn
chính xác [3] [10].
Bài toán MMCVRP (Min-Max Capacitated Vehicle Routing Problem) với mục tiêu
tối thiểu hóa hành trình dài nhất. Thuật tốn này đầu tiên được đề xuất bởi Golden
và đồng sự [2]. Gần đây, thuật tốn tìm kiếm cục bộ đang được đề xuất và cài đặt
thử nghiệm [9] để giải bài toán MMCVRP.
Trang 11


Bài tốn VRPTW thực chất là bài tốn CVRP có bổ sung thêm ràng buộc về khung
thời gian. VRPTW Là bài toán điều hành xe sao cho với mỗi yêu cầu của khách
hàng điều tồn tại 2 tham số e, l. Xe phải đến đón trong khoảng thời gian từ e đến l
Nếu xe đến sớm hơn e thì sẽ phải chờ tới thời điểm e mới được phục vụ và xe
không được tới muộn hơn l. Một số thuật toán thường được sử dụng để giải quyết
vấn đề này là tìm kiếm Tabu, giải thuật di truyền, thuật tốn tiến hóa, tối ưu hóa
quần thể [21].
VRP kết hợp với vấn đề nhận hàng, giao hàng VRP Pickup and Delivery (VRPPD).
Bài toán này thường được áp dụng cho các dịch vụ vận chuyển hàng hóa. Xe sẽ
thực hiện 2 chức năng đó là nhận hàng từ khách và đem đi giao hàng cho khách
khác. Một xe có thể nhận hàng từ 1 hoặc nhiều khách hàng và giao cho 1 hoặc nhiều
khách khác. Như vậy sẽ có ràng buộc về thứ tự gặp khách hàng và tuân thủ theo thứ
tự hành trình đó. Khi gắn với các mơ hình thực tế trong cuộc sống trở nên khó khăn
và phức tạp hơn nhiều so với VRP cổ điển. Trong thực tế, hàng hóa khơng chỉ cần
giao đến khách hàng mà cịn nhận từ khách hàng và đưa trở lại về kho. Có nhiều

cơng trình nghiên cứu về vấn đề này, thuật tốn tìm kiếm cục bộ Heuristics đã được
đề xuất trong [12], để tối ưu hóa tuyến đường dự kiến của xe.
Đến năm 2014, một mơ hình vận tải mới kết hợp vận chuyển người và hàng hoá
được đề xuất đầu tiên bởi Li và đồng nghiệp [23]. Bài toán này sẽ được trình bày cụ
thể phần 1.5.3.
Trong một vài năm gần đây, mơ hình vận tải kết hợp giữa xe tải với thiết bị
bay UAV đã được đề xuất, nghiên cứu và thử nghiệm. Mơ hình tối ưu cho bài toán
này được đề xuất bởi Murray và Chu vào năm 2015 [27]. Mơ hình được xây dựng
theo hướng xe tải sẽ vận chuyển các hàng hoá nặng và cồng kềnh và có khoảng
cách lớn với tốc độ di chuyển chậm hơn so với thiết bị bay UAV nhưng UAV chỉ di
chuyển được trong khoảng cách ngắn và phải quay về để nạp năng lượng điện.
Điều đó cho thấy, bài tốn tối ưu điều hành vận tải được quan tâm trong
nhiều thập kỷ qua và số lượng giải pháp đã tăng lên nhanh chóng. Cùng với sự phát
triển về tốc độ xử lý và dung lượng bộ nhớ đã tăng lên đáng kể, cho phép các nhà
khoa học giải quyết nhiều trường hợp khác nhau, thử nghiệm với dữ liệu lớn và thu
được kết quả tốt hơn.
Trang 12


1.4 Thư viện CBLSVR
1.4.1 Tổng quan
Constraint Based Local Search Vehicle Routing (CBLSVR) [9] là thư viện
CBLS cho các bài toán VRP, thư viện này cung cấp sẵn các bất biến, hàm, ràng
buộc hay gặp trong các bài tốn VRP có thể sử dụng thư viện giải quyết các bài
toán VRP bằng cách lên mơ hình hóa bài tốn. Ngồi ra thư viện còn cung cấp các
giao diện giúp định nghĩa các bất biến, hàm, ràng buộc mà người dùng tự định
nghĩa có thể tích hợp với các thành phần sẵn có của thư viện. Ngồi ra thư viện cịn
có tính mở, cho phép người dùng có thể tự thiết kế và cài đặt các bất biến, hàm và
ràng buộc của mình và tích hợp vào các thành phần khác, cũng như cài đặt chiến
lược tìm kiếm của riêng mình. Các API hỗ chợ cho người dùng giảm thời gian phát

triển các ứng dụng, chương trình Local Search ngắn gọn hơn và không cần phải
thao tác trên dữ liệu phức tạp.
1.4.2 Láng giềng
Thuật toán local Search là thuật toán được tạo ra từ các lời giải láng giềng
dựa trên các thao tác di chuyển (move). Thư viện CBLSVR đề cập đến các thao tác
di chuyển (move) thông dụng như: One-point move thay đổi vị trí 1 điểm. Twopoint move đổi vị trí 2 điểm với nhau. Two-opt move xóa bỏ 2 kết nối cũ, thay bằng
2 kết nối mới giữa các điểm… Phần sau đây, các toán tử di chuyển cục bộ sẽ được
trình bày chi tiết.
1.4.2.1 Phương thức performOnePointMove(Point x, Point y)
Trong đó: điểm x và điểm y có thể cùng hoặc khác tuyến đường (route)
Thực hiện: chèn điểm x vào sau điểm y.
1.4.2.2 Các phương thức performTwoOptMove1(Point x, Point y);
performTwoOptMove2(Point x, Point y); performTwoOptMove3(Point x, Point y);
performTwoOptMove4(Point x, Point y)
Trong đó: điểm x, y nằm trên các tuyến đường khác nhau; x, y không phải là
điểm đầu hay điểm kết thúc; next[x], next[y] là điểm tiếp theo lần lượt của x, y trên
tuyến đường.

Trang 13


Thực hiện: Xóa bỏ đường nối giữa điểm x và next[x], điểm y và next[y]. Tạo
mới đường nối cạnh (x, y) và cạnh (next[x], next[y]) đối với mỗi phương thức sẽ xác
định tuyến đường khác nhau (do đổi chiều đường đi).
Ví dụ: Cho 2 tuyến đường router[1] và router [2] với 1, 2, 3, 4, 5, 6, 7 là các điểm,
S1, S2 là điểm xuất phát và E1, E2 là điểm kết thúc tuyến đường.
router[1]

router[2]


S1

1

2

3

4

S2

5

6

7

E2

E1

Hình 1.1: Ví dụ 2 tuyến đường khác nhau
Nếu thực hiện: performTwoOptMove1(2,6)
+ Xóa bỏ kết nối cạnh (2,3); (6,7)
+ Bổ sung kết nối (2,6); (3,7)
+ Đổi chiều tuyến đường
S1

E1


1

2

3

5

6

7

4

S2

E2

Hình 1.2: Minh họa thuật tốn performTwoOptMove1(2,6)
Kết quả

route[1] = S11265E1
route[2] = S2437E2

Nếu thực hiện: performTwoOptMove2(2,6)
+ Xóa bỏ kết nối cạnh (2,3); (6,7)
+ Bổ sung kết nối (2,6); (3,7)
+ Đổi chiều tuyến đường
E1


S1

1

2

3

5

6

7

4

S2

E2

Hình 1.3: Minh họa thuật tốn performTwoOptMove1(2,6)
Trang 14


route[1] = S15621E1

Kết quả

route[2] = S2437E2

Nếu thực hiện: performTwoOptMove3(2,6)
+ Xóa bỏ kết nối cạnh (2,3); (6,7)
+ Bổ sung kết nối (2,6); (3,7)
+ Đổi chiều tuyến đường
S1

E1

1

2

3

5

6

7

E2

4

S2

Hình 1.4: Minh họa thuật toán performTwoOptMove3(2,6)
route[1] = S11265E1

Kết quả


route[2] = S2 734E2
Nếu thực hiện: performTwoOptMove4(2,6)
+ Xóa bỏ kết nối cạnh (2,3); (6,7)
+ Bổ sung kết nối (2,6); (3,7)
+ Đổi chiều tuyến đường
E1

S1

1

2

3

5

6

7

4

E2

S2

Hình 1.5: Minh họa thuật toán performTwoOptMove4(2,6)
Kết quả


route[1] = S15621E1
route[2] = S2 734E2

1.4.2.3 Các phương thức: performTwoOptMove5(Point x, Point y);
performTwoOptMove6(Point x, Point y); performTwoOptMove7(Point x, Point y);
performTwoOptMove8(Point x, Point y).
Trong đó: điểm x,y nằm trên các tuyến đường khác nhau; x,y không phải là
điểm đầu hay điểm kết thúc; next[x], next[y] là điểm tiếp theo lần lượt của x,y trên
tuyến đường.
Trang 15


Thực hiện: Xóa bỏ đường nối giữa điểm x và next[x], điểm y và next[y]. Tạo mới
đường nối cạnh (x, next[x]) và cạnh (y, next[x]) đối với mỗi phương thức sẽ xác
định tuyến đường khác nhau (do đổi chiều đường đi).
Ví dụ: Có 2 tuyến đường router[1] và router [2] với 1, 2, 3, 4, 5, 6, 7 là các điểm,
S1, S2 là điểm xuất phát và E1, E2 là điểm kết thúc tuyến đường
router[1]

S1

1

2

3

4


router[2]

S1

5

6

7

E1

E1

Hình 1.6: Ví dụ 2 tuyến đường khác nhau router[1], router[2]
Nếu thực hiện: performTwoOptMove5(2,6)
+ Xóa bỏ kết nối cạnh (2,3); (6,7)
+ Bổ sung kết nối (2,7); (6,3)
+ Đổi chiều tuyến đường
S1

S2

1

2

3

5


6

7

4

E2

E1

Hình 1.7: Minh họa thuật tốn performTwoOptMove5(2,6)

Kết quả

route[1] = S1127E1
route[2] = S25634E2

Nếu thực hiện: performTwoOptMove6(2,6)
+ Xóa bỏ kết nối cạnh (2,3); (6,7)
+ Bổ sung kết nối (2,7); (6,3)
+ Đổi chiều tuyến đường
E1

S2

1

2


3

5

6

7

4

E2

S1

Hình 1.8: Minh họa thuật toán performTwoOptMove6(2,6)
Trang 16


Kết quả

route[1] = S1721E1
route[2] = S2 5634E2

Nếu thực hiện: performTwoOptMove7(2,6)
+ Xóa bỏ kết nối cạnh (2,3); (6,7)
+ Bổ sung kết nối (2,7); (6,3)
+ Đổi chiều tuyến đường
S1

E2


1

2

3

5

6

7

4

S2

E1

Hình 1.9: Minh họa thuật toán performTwoOptMove7(2,6)
Kết quả

route[1] = S1127E1
route[2] = S2 4365 E2

Nếu thực hiện: performTwoOptMove8(2,6)
+ Xóa bỏ kết nối cạnh (2,3); (6,7)
+ Bổ sung kết nối (2,7); (6,3)
+ Đổi chiều tuyến đường
E1


E2

1

2

3

5

6

7

4

S2

S1

Hình 1.10: Minh họa thuật toán performTwoOptMove8(2,6)
Kết quả

route[1] = S1721E1
route[2] = S24365E2

1.4.2.4 Các phương thức: performOrOptMove1(Point x1, Point x2, Point y);
performOrOptMove1(Point x1, Point x2, Point y).
Trong đó: x1, x2 là các điểm cùng nằm trên 1 tuyến đường, y là điểm nằm

trên tuyến đường cịn lại; x1, x2, y khơng phải là điểm đầu, cuối trên tuyến đường
prev [x1], prev [x2], prev [y] là các điểm lần lượt đứng trước x1, x2, y
next [x1], next [x2], next [y] là các điểm lần lượt đứng sau x1, x2, y
Thực hiện di chuyển x1, x2 đến tuyến đường chứa y
Trang 17


Xóa bỏ kết nối: (prev[x1], x1); (x2, next[x2]); (y, next[y])
Bổ sung kết nối (y, x1); (x2, next[y]); (prev[x1], next[x2])
Ví dụ: Có 2 tuyến đường router[1] và router [2] với 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 là các
điểm, S1, S2 là điểm xuất phát và E1, E2 là điểm kết thúc tuyến đường
S1

1

2

3

4

5

E1

S2

6

7


8

9

10

E2

Hình 1.11: Ví dụ 2 tuyến đường với 5 điểm
Nếu thực hiện: performOrOptMove1(2,4,6)
+ Xóa bỏ kết nối cạnh (1,2); (4,5); (8,9)
+ Bổ sung kết nối (8,2); (4,9); (1,5)
+ Cập nhật lại tuyến đường
S1

1

2

3

4

5

E1

S2


6

7

8

9

10

E2

Hình 1.12: Minh họa thuật toán performOrOptMove1(2,4,6)
route[1] = S115E1

Kết quả

route[2] = S2678234910E2
Nếu thực hiện: performOrOptMove2(2,4,6)
+ Xóa bỏ kết nối cạnh (1,2); (4,5); (8,9)
+ Bổ sung kết nối (8,4); (2,9); (1,5)
+ Cập nhật lại tuyến đường
S1

1

2

3


4

5

E1

S2

6

7

8

9

10

E2

Hình 1.13: Minh họa thuật tốn performOrOptMove2(2,4,6)
Kết quả

route[1] = S115E1
route[2] = S2678432910E2
Trang 18


+ Phương thức:performThreeOptMove1(Point x, Point y, Point z)
Trong đó: x, y, z là 2 điểm thuộc cùng 1 tuyến đường (x trước y, y trước z)

Xóa bỏ kết nối cạnh (x, next[x]); (y, next[y]); (z, next[z])
Bổ sung kết nối (x, z); (next[y], next[x]; (y, next[z])
Ví dụ: Tuyến đường router[1] với 1, 2, 3, 4, 5, 6, 7, 8 là các điểm, S1 là điểm xuất
phát và E1 là điểm kết thúc tuyến đường
S1

1

2

3

4

5

7

8

E1

7

8

E1

6


Hình 1.14: Ví dụ tuyến đường với 8 điểm
Nếu thực hiện: performThreeOptMove1(2,4,6)
+ Xóa bỏ kết nối cạnh (2,3); (4,5); (6,7)
+ Bổ sung kết nối (2,6); (5,3); (4,7)
+ Cập nhật lại tuyến đường

S1

1

2

3

4

5

6

Hình 1.15: Minh họa thuật tốn performThreeOptMove1(2,4,6)
Kết quả
route[1] = S112653478E1
1.4.2.5 Phương thức: performCrossExchangeMove(Point x1, Point y1, Point x2, Point y2)
Trong đó: x1 và y1 là điểm cùng 1 tuyến đường, x1 đứng trước y1
x2 và y2 là điểm cùng 1 tuyến đường, x2 đứng trước y2.
Thực hện: Xóa bỏ (x1, next[x1]), (y1, next[y1]), (x2, next[x2]), (y2, next[y2])
và bổ sung (x1, next[x2]), (y2, next[y1]), (x2, next[x1]), (y1, next[y2])
Ví dụ: Có 2 tuyến đường router[1] và router [2] với 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 là các
điểm S1, S2 là điểm xuất phát và E1, E2 là điểm kết thúc tuyến đường

S1

1

2

3

4

5

E1

S2

6

7

8

9

10

E2

Trang 19



Hình 1.16: Ví dụ 2 tuyến đường router[1] và router [2] với các điểm khác nhau
Nếu thực hiện: performCrossExchangeMove(2,4,7,9)
+ Xóa bỏ kết nối cạnh (2,3); (4,5); (7,8); (9,10)
+ Bổ sung kết nối (2,5); (9,8); (1,5); (4,3); (7,5)
+ Cập nhật lại tuyến đường
S1

1

2

3

4

5

E1

S2

6

7

8

9


10

E2

Hình 1.17: Minh họa giải thuật performCrossExchangeMove(2,4,7,9)
Kết quả

route[1] = S112895E2
route[2] = S2673410E2

1.4.3 Các lớp API
Với kiến trúc CBLS khi một số biến thay dổi giá trị thì các bất biến, hàm và
ràng buộc được xây dựng trên các biến cũng sẽ thay đổi theo. Nên trong thư viện
CBLSVR có đối tượng VRManager để thực hiện quản lý và cập nhật các thay đổi
của biến, bất biến, hàm, ràng buộc.
1.4.3.1 Biến lộ trình
Biến lộ trình là biến thể hiện lời giải của bài toán đã cho. VarRoutersVR
trong thư viện CBLSVR là biến lộ trình, Biến này sẽ mơ hình hóa lời giải cho bài
tốn. Trong bài tốn vận tải có tập K là tập tuyến đường, trong đó mỗi tuyến đường
ứng với một xe và sẽ có điểm đầu và điểm kết thúc; ngồi ra cịn tập các khách hàng
mỗi khách hàng chỉ có duy nhất 1 tuyến đường đi qua. Một số phương thức của biến
lộ trình:
Ký hiệu: ⊥ là null point
Các hàm khởi tạo lời giải trình bày trong bảng 1.1
Mục đích

Hàm
addRoute(Point Sp,Point Ep)
addClientPoint(Point p)


Tạo thêm một tuyến đường mới có điểm bắt đầu là
Sp và điểm kết thúc là Ep
Bổ sung thêm điểm p vào tập các điểm khách hàng.
Trang 20


Sắp xếp các điểm khách hàng vào ngẫu nhiên các

initRandom()

tuyến đường.
Bảng 1.1: Nhóm hàm khởi tạo lời giải

Các hàm truy vấn về trạng thái của lời giải trình bày trong bảng 1.2
Mục đích

Hàm

Trả về điểm ngay sau x trong tuyến đường nếu x là
Point next(Point x)

điểm cuối hoặc x không thuộc tuyến đường nào thì
trả về ⊥
Trả về điểm ngay trước x trong tuyến đường nếu x

Point prev(Point x)

là điểm đầu hoặc x khơng thuộc tuyến đường nào
thì trả về ⊥


int route(Point x)

int index(Point x)
Point oldNext(Point x)
Point oldPrev(Point x)

int oldRoute(Point x)

int oldIndex(Point x)

Trả về chỉ số tuyến đường đi qua điểm x nếu khơng
có tuyến đường nào đi qua x thì trả về ⊥
Trả về chỉ số của điểm x trong tuyến đường x
khơng thuộc tuyến đường nào thì trả về ⊥
Trả về điểm có vị trí ngay sau x trong lời giải trước
Trả về điểm có vị trí ngay trước x trong lời giải
trước
Trả về chỉ số tuyến đường đi qua x trong lời giải
trước
Trả về chỉ số của x trong tuyến đườngcủa lời giải
trước đó

Bảng 1.2: Nhóm hàm truy vấn về trạng thái của lời giải
1.4.3.2 Bất biến
Bất biến là đối tượng biểu diễn đặc trưng của lời giải. Khi lời giải thay đổi
thì các bất biến cũng cần được cập nhật để chúng có thể biểu diễn đúng thuộc tính
của lời giải mới.
Các hàm propagate chính là các hàm cập nhật bất biến khi lời giải thay đổi
như đã nói ở trên, cịn hàm initPropagte là hàm khởi tạo các biến và cấu trúc dữ liệu
hàm sẽ được tự động gọi bởi VRManager khi việc lên mô hình bài tốn kết thúc.

Trang 21


Thư viện CBLSVR có cung cấp các bất biến hay gặp trong các bài tốn VRP sau:
+ AccumulatedWeightEdges tính tổng trọng số tích lũy theo cạnh. Bất biến
này có thể được dùng để tính tổng quãng đường di chuyển theo mỗi điểm.
+ AccumulatedWeightNodes tính tổng trọng số tích lũy theo đỉnh. Bất biến
này có thể được dùng để biểu diễn điều kiện tổng số yêu cầu trên một tuyến không
được vượt quá khả năng của xe trong bài toán CVRP.
2.4.3.3 Hàm, ràng buộc
Một số hàm và ràng buộc cơ bản được thiết kế trong thư viện CBLSVR được
trình bày trong bảng 1.3
Tên hàm, ràng buộc

Tác dụng
Hàm tính tổng tích lũy trọng số của cạnh từ
điểm xuất phát đến điểm bất kỳ. Hàm này

AccumulatedEdgeWeightsOnPathVR được sử dụng cho các bài toán có ràng
buộc về độ dài đường đi hoặc tính chi phí
cho tuyến đường nào đó
Tính tổng tích lũy trọng số theo điểm .
AccumulatedNodeWeightsOnPathVR Thường được sử dụng với bài toán ràng
buộc về trọng tải của xe
TotalCostVR

IndexOnRoute
RouteIndex

Tính tổng các chi phí của tất cả các tuyến

đường
Chỉ số của điểm v trong tuyến đường đi
qua nó
Chỉ số của tuyến đường đi qua một điểm v
Đưa thời gian đến sớm nhất của các điểm

EarliestArrivalTimeVR

trong bài toán VRP với ràng buộc về thời
gian

Plus, Minus, Mult, Div, Mod

Các phép toán số học

Leq, Eq, Neq, Implicate, AND, OR

Các phép toán logic
Trang 22


Hàm cho biết giá trị vi phạm của một ràng

ConstraintViolations

buộc nào đó
Hàm ràng buộc cho biết giá trị vi phạm về

Capacity


ràng buộc sức chứa trên xe

ConstraintSystemVR

Đối tượng quản lý các ràng buộc

Sum

Hàm tính tổng

Min, Max

Hàm trả về giá trị lớn nhất hoặc nhỏ nhất

Bảng 1.3: Một số hàm và ràng buộc cơ bản được thiết kế trong thư viện CBLSVR
1.4.3.4 Tìm kiếm
Trong thư viện có lớp GenericLocalSearch hỗ trợ người dùng cài đặt thuật
tốn tìm kiếm một cách ngắn gọn như sau
1 publicclass GenericLocalSearch implements ISearch {
2

public GenericLocalSearch ( VRManager mgr , LexMultiFunctions F,

3

ArrayList <INeighborhoodExplorer >neighborhoodExplorer ) {

4

}


5

publicvoid search ( int maxIter , int timeLimit ) {

6

bestSolution = new ValueRoutesVR (XR);

7

currentIter = 0;

8

XR.setRandom();

9

Neighborhood N = new Neighborhood(mgr);

10

bestValue = new LexMultiValues (F.getValues());

11

while( currentIter < maxIter ) {

12


N.clear();

13

LexMultiValues bestEval = new LexMultiValues();

14

bestEval.fill(F.size(), CBLSVR.MAX_INT);

15

for( INeighborhoodExplorer NI : neighborhoodExplorer ) {

16

NI.exploreNeighborhood (N,bestEval);

17

}

18

if(N.hasMove()) {
Trang 23



×