7 DANH SÁCH HÌNH VẼ ĐƢỢC SỬ DỤNG Hình 2-1: Ví dụ về bài toán thỏa mãn ràng buộc Hình 2-2: Thuật toán AC3 Hình 2-3: Cây tìm kiếm Hình 2-4: Các kiểu phân nhánh Hình 2-5: Phương pháp first
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
-
NGUYỄN QUỲNH TRANG
HƯỚNG TIẾP CẬN QUY HOẠCH RÀNG BUỘC TRONG VIỆC GIẢI CÁC BÀI TOÁN TỐI ƯU TỔ HỢP: LÝ THUYẾT VÀ CÁC CÔNG CỤ
LUẬN VĂN THẠC SĨ KỸ THUẬT
…
Chuyên ngành: Kỹ thuật máy tính và Truyền thông
Hà Nội – Năm 2015
Trang 2BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
-
NGUYỄN QUỲNH TRANG
HƯỚNG TIẾP CẬN QUY HOẠCH RÀNG BUỘC TRONG VIỆC GIẢI CÁC BÀI TOÁN TỐI ƯU TỔ HỢP: LÝ THUYẾT VÀ CÁC CÔNG CỤ
Chuyên ngành : Kỹ thuật máy tính và Truyền thông
LUẬN VĂN THẠC SĨ KỸ THUẬT
…
Kỹ thuật máy tính và truyền thông
NGƯỜI HƯỚNG DẪN KHOA HỌC :
1 TS PHẠM QUANG DŨNG
Hà Nội – Năm 2015
Trang 3Trong khóa luận không thể tránh khỏi những thiếu sót, em rất mong nhận được những đóng góp quý báu của thầy cô và các bạn để luận văn được hoàn thiện hơn
Hà Nội, Ngày 18 tháng 3 năm 2015
Học viên Nguyễn Quỳnh Trang
Trang 42
MỤC LỤC
LỜI CẢM ƠN 1
BẢNG CÁC KÝ HIỆU VIẾT TẮT 6
BẢNG CÁC THUẬT NGỮ CHUYÊN NGÀNH 6
DANH SÁCH HÌNH VẼ ĐƯỢC SỬ DỤNG 7
MỞ ĐẦU 8
CHƯƠNG I: QUY HOẠCH RÀNG BUỘC 11
1.1 Bài toán thỏa mãn ràng buộc (CSP) 11
1.1.1 Định nghĩa: 11
1.1.2 Ví dụ CSP: 11
1.2 Constrains programming: 12
1.2.1 Tổng quan 12
1.2.2 Dùng các ràng buộc để tỉa không gian tìm kiếm 14
1.2.2.1 Một số khái niệm và ký hiệu: 14
1.2.2.2 Các kỹ thuật toàn vẹn (Consistency Techniques) 15
1.2.3 Tìm kiếm quay lui 18
1.2.3.1 Định nghĩa: 18
1.2.3.2 Ví dụ: 19
1.2.3.3 Chiến lược tìm kiếm: 21
CHƯƠNG 2: THƯ VIỆN CHOCO 22
2.1 Giới thiệu về thư viện Choco: 22
2.1.1 Khái niệm: 22
2.1.2 Sơ lược chương trình Choco: 22
2.2 Hoạt động của Choco: 23
2.2.1 Variable 23
2.2.1.1 Các biến đơn giản (Simple Variables) 23
2.2.1.2 Biến hằng (Constants): 23
Trang 53
2.2.1.3 Biến biểu thức (ExpressionVariable) : 23
2.2.1.4 Biến mục tiêu (Objective Variable): 24
2.2.2 Ràng buộc (Constraint): 24
2.2.2.1 Ràng buộc nhị phân (Binary Constraint): 25
2.2.2.2 Ràng buộc cho 3 biến (Ternary Constraint): 25
2.2.2.3 Ràng buộc kênh (Channeling Constraints): 25
2.2.2.4 Ràng buộc cụ thể hóa (Reified Constrants): 25
2.2.2.5 Ràng buộc chung (Global constraint): 26
2.2.3 Lời giải (Solver): 26
2.2.3.1 Phần biến đọc: 26
2.2.3.2 Ràng buộc đọc: 28
2.2.3.3 Chiến lƣợc tìm kiếm: 28
2.3 Các yếu tố của Choco: 29
2.3.1 Biến (Variable) 29
2.3.1.1 IntegerVariable: 29
2.3.1.2 Real Variable: 30
2.3.1.3 Set Variable: 30
2.3.2 Biểu thức (Operators): 31
2.3.2.2 cos (operator): 31
2.3.2.3 div (operator): 31
2.3.2.4 ifThenElse (operator) 32
2.3.2.5 max (operator): 32
2.3.2.6 min (operator): 33
2.3.2.7 minus (operator): 33
2.3.2.8 mod (operator): 34
2.3.2.9 mult (operator): 34
2.3.2.10 neq (operator): 35
Trang 64
2.3.2.11 Plus (operator): 35
2.3.2.12 power (operator): 36
2.3.2.13 scalar (operator): 37
2.3.2.14 sin (operator): 37
2.3.2.15 sum (operator): 37
2.3.3 Constraint 38
2.3.3.1 Abs: 38
2.3.3.2 allDifferent: 39
2.3.3.3 among: 39
2.3.3.4 and 40
2.3.3.5 atMostNValue 41
2.3.3.6 boolChanneling 41
2.3.3.7 distanceEQ: 42
2.3.3.8 eq 42
2.3.3.9 equation 43
2.3.3.10 Geq 44
2.3.3.11 gt 44
2.3.3.12 leq 45
2.4 Ví dụ về các bài toán được giải quyết bằng Choco: 46
2.4.1 Ví dụ 1: Bài toán con hậu N-Queens 46
2.4.2 Ví dụ 2: Bài toán Magic square 48
CHƯƠNG 3: ÁP DỤNG THƯ VIỆN CHOCO VÀO BÀI TOÁN ỨNG DỤNG: “XẾP LỊCH HỌC CHO CÁC LỚP CAO HỌC BÁCH KHOA” 52
3.1 Phát biểu bài toán: 52
3.2 Mô hình hóa với CHOCO 53
3.2.1 Mô hình 1 (stateModel 1) 53
Trang 75
3.2.2 Mô hình 2 (StateModel 2) Error! Bookmark not defined
3.3 Thử nghiệm 55
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 57
TÀI LIỆU THAM KHẢO 58
PHỤ LỤC 61
Trang 8Constraint propagation Lan truyền ràng buộc
Trang 97
DANH SÁCH HÌNH VẼ ĐƢỢC SỬ DỤNG
Hình 2-1: Ví dụ về bài toán thỏa mãn ràng buộc
Hình 2-2: Thuật toán AC3
Hình 2-3: Cây tìm kiếm
Hình 2-4: Các kiểu phân nhánh
Hình 2-5: Phương pháp first-fail trong lập trình Comet
Hình 3-1: Các cách khai báo biến IntegerVariable trong thư viện Choco Hình 3-2: Bài toán khai báo biến RealVariable
Hình 3-3: Bài toán khai báo biến SetVariable
Hình 4-1: Dữ liệu đầu vào của bài toán
Trang 108
MỞ ĐẦU
Ngày nay với sự phát triển mạnh mẽ của Công Nghệ thông tin góp phần mang lại những thành tựu rực rỡ cho các lĩnh vực, hoạt động trong đời sống và trong xã hội Cùng với sự phát triển của CNTT, các thế hệ ngôn ngữ lập trình lần lượt ra đời nhằm đáp ứng các yêu cầu công nghệ Đóng góp quan trọng vào sự phát triển và ứng dụng CNTT, ngôn ngữ lập trình ràng buộc trong thư viện Choco thật sự mang lại tiện ích lớn trong việc giải quyết các bài toán tối ưu tổ hợp như lập lịch, lập kế hoạch
I Lý do chọn đề tài
Trong lĩnh vực nghiên cứu khoa học máy tính, các bài toán về tối ưu tổ hợp được đánh giá là các bài toán khó NP[1, 6], đặc trưng bởi bộ dữ liệu lớn, các ràng buộc phức tạp Để giải quyết vấn đề này hiệu quả đòi hỏi phải có kinh nghiệm và kỹ năng Trên thế giới có rất nhiều những công trình nghiên cứu, các thuật toán được ứng dụng và phát triển để giải quyết vấn đề này: các thuật toán quay lui, vét cạn, các thuật toán về quy hoạch động Tuy nhiên, trong lập trình truyền thống chưa có giải thuật hiệu quả nhất, đáp ứng được thời gian xử lý là đa thức Do đó, đây vẫn là bài toán khó chưa có lời giải tối ưu nhất
Trong những năm gần đây, Quy hoạch ràng buộc nổi (Constraint Programming - CP) nổi lên như một công nghệ quan trọng, giải quyết hiệu quả các bài toán tối ưu tổ hợp, ứng dụng thành công trong nhiều lĩnh vực: hàng không, khoa học máy tính, công nghệ sản xuất … CP thực sự là một giải pháp tối ưu, được giới chuyên môn đánh giá cao về khả năng giải quyết các vấn đề phức tạp trong cuộc sống thực tế
II Mục đích nghiên cứu của luận văn, đối tƣợng, phạm vi nghiên cứu
Mục đích: Tìm hiểu cơ sở lý thuyết và các công cụ hướng tiếp cận quy hoạch ràng buộc để giải các bài toán tối ưu tổ hợp
Trang 119
Đối tượng: Tìm hiểu một thư viện (Choco) hỗ trợ việc mô hình hóa và giải các bài toán tối ưu tổ hợp bằng quy hoạch ràng buộc
Phạm vi: nghiên cứu lý thuyết và xây dựng chương trình áp dụng
III Tóm tắt nội dung chính
Cấu trúc luận văn gồm 3 chương:
Chương 1: Tìm hiểu về bài toán tối ưu tổ hợp (CSP) với hướng tiếp
cận quy hoạch ràng buộc (CP) Trong chương này chúng tôi trình bày định nghĩa về bài toán tối ưu tổ hợp và quy hoạch ràng buộc, đưa ra các ví dụ minh họa về bài toán này Chúng tôi nêu ra cách thức để giải
bài toán tối ưu tổ hợp hướng tiếp cận quy hoạch ràng buộc
Chương 2: Ở chương 2 chúng tôi tập trung vào tìm hiểu công cụ để
giải bài toán thỏa mãn ràng buộc Trong luận văn này chúng tôi tìm hiểu về thư viện Choco
Chương 3:Từ những kiến thức tìm hiểu về thư viện Choco, trong
chương này chúng tôi tập trung áp dụng để giải bài toán trong thực tế
Ở đây chúng tôi xây dựng bài toán ứng dụng: “ Xếp lịch học cho các
lớp cao học Bách Khoa” Qua việc xây dựng chương trình, em đã
nắm bắt được: cách thức để giải quyết các ràng buộc trong bài toán tối
ưu tổ hợp và cách viết một chương trình để thực thi công việc trên thư viện Choco
IV Phương pháp nghiên cứu
Tìm hiểu lý thuyết qua các bài báo, công trình nghiên cứu trong và ngoài nước
Trang 1210
Sử dụng phần mềm Eclipse, thư viện Choco áp dụng giải một bài toán tối ưu tổ hợp cụ thể: Bài toán xếp lịch học cho các lớp cao học Bách Khoa
V Nội dung:
Chương 1: Quy hoạch ràng buộc
Chương 2: Thư viện Choco
Chương 3: Áp dụng thư viện Choco vào bài toán ứng dụng:“ Xếp
lịch học cho các lớp cao học Bách Khoa”
Trang 1311
CHƯƠNG I: QUY HOẠCH RÀNG BUỘC
1.1 Bài toán thỏa mãn ràng buộc (CSP)
1.1.2 Ví dụ CSP:
- Ví dụ 1: Bài toán con hậu N-Queens
Cho bàn cờ kích thước n*n có n con hậu Cách sắp xếp n con hậu trên bàn cờ sao cho không có con nào có thể ăn lẫn nhau
Variables: X = {Xi | i [1,n]} một biến là đại diện cho một cột và ràng buộc mỗi con hậu phải trên một cột khác nhau
Domains: cho tất cả các biến Xi X, D(xi) = {1,2,…,n}
Trang 1412
- Ví dụ 2: Bài toán Magic Square
Cho các số nguyên dương từ 1 đến 2n Hãy xếp các số trên vào ô vuông có kích thước n*n sao cho tổng các hang, các cột, các đường chéo chính đều bằng nhau
CP đã được áp dụng trong việc giải nhiều bài toán tối ưu kinh điển như lập lịch (Scheduling) [1], lập thời khóa biểu (TimeTabling) [8], lập tuyến điều hành xe (Vehicle Routing) [9], phân công ca trực (Nurse Rostering) [10] ,… CP là sự kết hợp giữa hai thành phần cơ bản là tỉa không gian tìm kiếm (Constraint Propagation) và phân nhánh (Branching) Tỉa không gian tìm kiếm là cơ chế sử dụng các ràng buộc của bài toán để loại bỏ bớt các giá trị không phù hợp trong miền giá trị của các biến mô hình bài toán Sử dụng các ràng buộc để tỉa không gian tìm kiếm không đảm bảo tìm ra được lời giải thỏa mãn tất cả các ràng buộc bởi lẽ các ràng buộc được xem xét một cách độc lập với nhau và không có sự tương trợ nhau
Trang 1513
trong quá trình tỉa miền giá trị của các biến Khi đó, chúng ta phải sử dụng các chiến lược phân nhánh để tìm kiếm lời giải Việc phân nhánh thông thường là thử lần lượt từng giá trị còn lại trong miền giá trị của một
biến nào đó và gán giá trị cho biến đó
Trang 1614
trị 3 vì 3 + 1 = 4 mà giá trị 4 không thuộc miền giá trị của X3 Như vậy ta có miền D(x1) = {1, 2} Tiếp theo ta lại tỉa giá trị 1 của trong miền D(x3) vì không thỏa mãn ràng buộc c2
Vậy ta có miền giá trị mới của bộ biến là:
N D(x1) = {1, 2}; D(x2) = {1, 2,3}; D(x3) = { 2, 3}
Sau khi sử dụng phương pháp tỉa không gian tìm kiếm, ta tiếp tục giải bài toán bằng cách sử dụng các chiến lược phân nhánh Ta xét từng biến của x1 Với x1 =2 thì miền giá trị của x3 rỗng vì không thỏa mãn ràng buộc c3
do đó loại Với x1 = 1 ta loại bỏ được giá trị 3 trong miền D(x2) vì không thỏa mãn ràng buộc c2 Ta có miền giá trị mới của bộ biến là:
N D(x1) = {1}; D(x2) = {1, 2}; D(x3) = { 2, 3}
Với miền giá trị mới này ta tiếp tục tìm kiếm bằng cách xét từng biến của x2 Với x2 = 1 thì miền giá trị D(x3) rỗng vì không thỏa mãn ràng buộc c3 Ta loại miền giá trị này: D(x1) = {1}; D(x2) = {1}; D(x3) = {} Ta xét x2 = 2 khi đó ta tìm được lời giải của bài toán vì các giá trị biến của từng miền đều thỏa mãn cả 3 ràng buộc D(x1) = {1}; D(x2) = {2}; D(x3) = {3} là đáp án của bài toán
1.2.2 Dùng các ràng buộc để tỉa không gian tìm kiếm
1.2.2.1 Một số khái niệm và ký hiệu:
- Một bài toán thỏa mãn ràng buộc gồm 3 thành phần N (X, D,C):
X = (X1, … , Xn) là một bộ biến
D = D(X1) … D(Xn), D(xi) Z là tập các giá trị của xi, = 1,…, n
C = {C1, …, Ce} là tập các ràng buộc, biến X(cj) X, = 1,…,e
- I là một lời giải bộ phận(Instantiation) của bài toán thỏa mãn ràng buộc I là một bộ giá trị của bộ biến Y = (X1,…,Xk) là tập con của bộ biến X Các biến X1 đến Xn của bộ biến X được thay thế bởi các giá trị
Trang 17bộ phận được gọi là toàn vẹn cục bộ (Locally consistent) khi nó có thể trở thành một lời giải cho bài toán
Với một ràng buộc c và chuỗi biến Y, ta gọi y(c) là phép chiếu của c vào Y
Ví dụ:
N = (X, D, C)
X = {x1, x2, x3, x4}
D(x1) = {1,2,3,4}, D(x2) = {1,2,3,4,5,6,7}, D(x3) = {2,3,4,5}
D(x4) = {1,2,3,4,5,6}
C1 (x1 + x2 5), c2 (x4 x1 + x3), c3 (x3 x1 +3)
((x1, 1), (x2, 4)) là một lời giải bộ phận, ((x1, 1), (x2, 4), (x3, 2), (x4, 1)) là lời giải của bài toán
là một bộ giá trị (1,4,2,1) tương đương với (x1, x2, x3, x4) Dùng phép chiếu khi Y = (x4, x2) thì [x3]= 2, [Y]=(1,4)
1.2.2.2 Các kỹ thuật toàn vẹn (Consistency Techniques)
Mục đích là tỉa giá trị không phù hợp trên miền của từng biến dựa vào các ràng buộc bằng cách giảm không gian tìm kiếm, đưa về một bài toán thỏa mãn ràng buộc với miền giá trị nhỏ hơn
Để đạt được ràng buộc tổng thể là rất khó và thời gian tính toán lớn nên người ta cố gắng sử dụng các kỹ thuật tỉa với từng ràng buộc một cách cục bộ
Trang 1816
a Toàn vẹn miền giá trị (Domain Consistency)
Một ràng buộc c được gọi là toàn vẹn miền giá trị nếu mọi giá trị vi
D (xi) thì sẽ tồn tại một bộ vj D (xj) ( {1, …, i – 1, i + 1, k} sao cho (v1,
b Toàn vẹn Forward Checking (Forward Checking Consistency)
Kỹ thuật toàn vẹn FC loại bỏ được ít giá trị không hợp lệ hơn nên kỹ thuật này yếu hơn kỹ thuật DC
Một ràng buộc c C được gọi là toàn vẹn FC khi và chỉ khi hoặc có nhiều hơn 1 biến trong c chưa được gán giá trị hoặc chỉ có duy nhất 1 biến trong c chưa được gán giá và c là toàn vẹn miền giá trị
Trang 19c Sơ đồ tổng quát thuật toán AC3
Thuật toán AC (arc consistency) là một kỹ thuật siết chặt hơn các miền giá trị của các ràng buộc Phần này mô tả sơ đồ thuật toán AC3 để đạt được toàn vẹn miền giá trị
Hình 2-2: Thuật toán AC3
Trang 20cả các cặp (x’, c’) được đặt lại trong hàng đợi Q Khi Q rỗng thuật toán trả về true với đảm bảo rằng tất cả các miền đã được sửa đổi và tất cả các giá trị còn lại của tất
cả các biến thỏa mãn với mọi ràng buộc
Thuật toán ReviseAC3(x,c) là thuật toán tỉa các giá trị không phù hợp của x nhờ vào ràng buộc c Hàm Revise (x, c) lấy lần lượt từng giá trị v trong D(x) và đối chiếu x(c) kiểm tra sự thỏa mãn các ràng buộc của giá trị v Nếu v không thỏa mãn các ràng buộc thì v bị loại khỏi D(x) và miền giá trị D(x) thay đổi Hàm sẽ trả về true nếu miền D(x) thay đổi hay nói cách khác được rút gọn, miền giá trị giảm xuống, còn ngược lại hàm sẽ trả về giá trị false
1.2.3 Tìm kiếm quay lui
Phương pháp tỉa không gian tìm kiếm không đảm bảo tìm ra được lời giải thỏa mãn cho tất cả các ràng buộc Điều cần thiết ở đây là chúng ta cần phải kết hợp phương pháp tỉa không gian tìm kiếm với tìm kiếm quay lui
1.2.3.1 Định nghĩa:
Quay lui (tiếng Anh: backtracking) [6] là một chiến lược tìm kiếm lời giải
cho các bài toán thỏa mãn ràng buộc
Các bài toán thỏa mãn ràng buộc là các bài toán có một lời giải đầy đủ, trong
đó thứ tự của các phần tử không quan trọng Các bài toán này bao gồm một tập các biến mà mỗi biến cần được gán một giá trị tùy theo các ràng buộc cụ thể của bài toán Việc quay lui là để thử tất cả các tổ hợp để tìm được một lời giải Thế mạnh của phương pháp này là nhiều cài đặt tránh được việc phải thử nhiều tổ hợp chưa hoàn chỉnh, và nhờ đó giảm thời gian chạy
Về bản chất, tư tưởng của phương pháp là thử từng khả năng cho đến khi tìm thấy lời giải đúng Đó là một quá trình tìm kiếm theo độ sâu trong một tập hợp các
Trang 2119
lời giải Trong quá trình tìm kiếm, nếu ta gặp một hướng lựa chọn không thỏa mãn,
ta quay lui về điểm lựa chọn nơi có các hướng khác và thử hướng lựa chọn tiếp theo Khi đã thử hết các lựa chọn xuất phát từ điểm lựa chọn đó, ta quay lại điểm lựa chọn trước đó và thử hướng lựa chọn tiếp theo tại đó Quá trình tìm kiếm thất bại khi không còn điểm lựa chọn nào nữa
Quy trình đó thường được cài đặt bằng một hàm đệ quy mà trong đó mỗi thể hiện của hàm lấy thêm một biến và lần lượt gán tất cả các giá trị có thể cho biến đó, với mỗi lần gán trị lại gọi chuỗi đệ quy tiếp theo để thử các biến tiếp theo Chiến lược quay lui tương tự với tìm kiếm theo độ sâu nhưng sử dụng ít không gian bộ nhớ hơn, nó chỉ lưu giữ trạng thái của một lời giải hiện tại và cập nhật nó
Để tăng tốc quá trình tìm kiếm, khi một giá trị được chọn, trước khi thực hiện lời gọi đệ quy, thuật toán thường xóa bỏ giá trị đó khỏi miền xác định của các
biến có mâu thuẫn chưa được gán (kiểm tra tiến - forward checking) và kiểm tra tất
cả các hằng số để tìm các giá trị khác đã bị loại trừ bởi giá trị vừa được gán (lan
truyền ràng buộc - constraint propagation)
1.2.3.2 Ví dụ:
Ta phân nhánh các biến giá trị của bài toán thỏa mãn ràng buộc với nút gốc
là P0 thành một bài toán thỏa mãn ràng buộc khác với các nút từ P1 … Pm Kết quả của hai bài toán là tương đương với nhau Miền giá trị của các biến thuộc Pi không lớn hơn so với P0 Phương pháp phổ biến của tìm kiếm quay lui là ta tìm kiếm theo hình cây hay nói cách khác là cây tìm kiếm (Search tree) Với nút gốc là bài toán CSP ban đầu, tiếp đến là các nút của bài toán CSPs mới Nút lá là lời giải thỏa mãn bài toán (Solutions) nếu tất cả các biến trong miền giá trị đều thỏa mãn ràng buộc Nút lá là Failure nếu một miền giá trị của các biến rỗng
Trang 2220
Hình 2-3: Cây tìm kiếm
Có 2 kiểu phân nhánh (Branching): phân nhánh theo từng biến tức
là ta gán từng giá trị biến trong miền giá trị cho mỗi nhánh cây (x1=1, x2=
2,…, xn= k), kiểu thứ hai là phân nhánh bằng cách chia ra từng miền giá trị
Hình 2-4: Các kiểu phân nhánh
Trang 2321
1.2.3.3 Chiến lƣợc tìm kiếm:
N Chọn biến (Variable Selection): nguyên tắc first-fail là nguyên
tắc thử những biến có khả năng sai nhiều nhất tức là biến đó không thỏa mãn các ràng buộc
Dom heuristic: chọn biến có miền giá trị nhỏ nhất
Deg heuristic: chọn biến tham gia nhiều ràng buộc nhất
Dom+deg heuristic: kết hợp 2 phương pháp trên
Dom/deg heuristic: chọn biến có thương nhỏ nhất
N Chọn giá trị (Value selection):
Best-first principle: Chọn những giá trị có khả năng đúng nhiều nhất tức là giá trị đó là lời giải thỏa mãn bài toán
Possibilities:
Thử những giá trị theo thứ tự tăng dần
Thử những giá trị theo thứ tự giảm dần
Thử những giá trị nằm ở giữa miền giá trị
N Ví dụ:
Hình 2-5: Phương pháp first-fail trong ngôn ngữ Comet [5]
Trang 2422
CHƯƠNG 2: THƯ VIỆN CHOCO
2.1 Giới thiệu về thư viện Choco:
Hiện nay có rất nhiều thư viện cho quy hoạch ràng buộc như Gecode [12], MiniZinc [13], CHOCO [7] … Chúng tôi tập trung vào tìm hiểu một trong
số các thư viện này đó là CHOCO, vì nó được phát triển bằng Java, ngôn ngữ lập trình được dùng rất phổ biến để phát triển các ứng dụng công nghiệp
2.1.1 Khái niệm:
Choco là một thư viện trong Java dùng để giải quyết các bài toán thỏa mãn ràng buộc (CSP) và Constraint programming Choco xây dựng các ràng buộc cho các biến trong bài toán thông qua các thuật toán được cài đặt và đưa ra các nghiệm thỏa mãn yêu cầu hoặc không đưa ra lời giải nếu bài toán không có nghiệm thỏa mãn
2.1.2 Sơ lược chương trình Choco:
Mô hình (model) là một đối tượng trung tâm trong chương trình Choco, nó bao gồm các biến (Variables) và các ràng buộc (Constraint)
Biến (Variables) là cái chưa biết của vấn đề cần giải quyết, nó gồm IntegerVariable, SetVariable và RealVariable trong Choco Các biến
có thể được cho bởi các giá trị, các miền của từng biến, hoặc cận trên, cận dưới của nó
Ràng buộc (Constraint) xác định các quan hệ được thỏa mãn giữa các biến và các hằng số
Lời giải (Solver) dùng để thực hiện mô hình của bài toán và đưa ra một hoặc tất cả lời giải thỏa mãn các ràng buộc của bài toán
Trang 2523
2.2 Hoạt động của Choco:
Model cùng với Solver là một trong hai thành phần chính của chương trình Choco
- Model được khai báo như một đối tượng:
Model model = new CPModel()
- Model = Variable + Expressions + Constraints
2.2.1 Variable
Một biến được xác định bởi một loại: biến nguyên (integer), biến số thực (real), biến tập hợp (set variable), tên và miền giá trị của biến đó Khi tạo một biến đơn giản , lập vài tùy chọn để quy định miền (ví dụ số hoặc ràng buộc) trong Solver Việc lựa chọn miền cần phải được xem xét kỹ càng Hiệu quả của bộ giải toán thường phụ thuộc vào việc chọn kiểu miền đúng đắn
- Các biến được thêm vào trong mô hình:
Model.addVariable(var1);
Model.addVariables(var2,var3);
2.2.1.1 Các biến đơn giản (Simple Variables)
Gồm các biến: IntegerVariable, RealVariable, SetVariable
2.2.1.2 Biến hằng (Constants): là các biến không đổi trong bài toán
Hằng số là một biến có miền cố định Một IntegerVariable được khai báo với một giá trị duy nhất cũng được tự động coi là một hằng số
Ví dụ:
IntegerConstantVariable c10 = Choco.constant(10);
RealConstantVariable c0dot0 = Choco.constant(0.0);
SetConstantVariable c0_12 = Choco.constant(new int[]{0,12}); SetConstantVariable cEmpty = Choco.emptySet();
2.2.1.3 Biến biểu thức (ExpressionVariable):
Biến biểu thức là biến xác định phép toán giữa hai biến gồm:
IntegerExpressionVariable và RealExpressionVariable
Trang 2624
Ví dụ:
IntegerVariable v1 = Choco.makeIntVar(“v1”,1,3);
IntegerVariable v2 = Choco.makeIntVar(“v2”,1,3);
IntegerExpressionVariable v1Andv2 = Choco.plus(v1,v2);
Để xây dựng biểu thức các biến ta sử dụng các lệnh đơn giản Mỗi lần trả về một đối tượng ExpressionVariable:
o Integer: abs, div, ifThenElse, max, min, minus, mod, mult, neg, plus, power, scalar, sum
o Real: cos, minus, mult, plus, power, sin
2.2.1.4 Biến mục tiêu (Objective Variable):
Là biến xác định mục tiêu của nó trong ràng buộc của bài toán Bạn có thể xác định trực tiếp một biến mục tiêu bằng việc sử dụng tùy chọn Options.V_OBJECTIVE
Ví dụ:
Constraint c1 = Choco.neq(v1,v2); // v1,v2 là các biến v1 # v2 Model.addConsstraint(c1); // Thêm ràng buộc c1 vào mô hình đang xét
Hoặc có thể gộp: model.addConstraint(Choco.neq(v1,v2));
Trang 2725
2.2.2.1 Ràng buộc nhị phân (Binary Constraint): ràng buộc bao
gồm 2 biến số nguyên
Ví dụ: eq, geq, gt, leq, lt, neq
2.2.2.2 Ràng buộc cho 3 biến (Ternary Constraint): ràng buộc bao
gồm 3 số nguyên
Ví dụ: distanceEQ, distanceNEQ, distanceGT, distanceLT …
2.2.2.3 Ràng buộc kênh (Channeling Constraints): ràng buộc liên
kết giữa các mô hình với nhau
2.2.2.4 Ràng buộc cụ thể hóa (Reified Constrants):
Giá trị thực của một ràng buộc là một Boolean, nó chỉ đúng nếu ràng buộc đó không đổi Việc cụ thể hóa một ràng buộc nghĩa là đi tìm giá trị thực của nó
Choco cung cấp một ràng buộc chung loại reifiedConstraint để cụ thể hóa mọi ràng buộc trong biến Boolean thể hiện giá trị thực của nó
Constraint reifiedConstraint(IntegerVariable b, Constraint c);
Constraint reifiedConstraint(IntegerVariable b, Constraint c1, Constraint c2);
Để xây dựng cấu trúc phức tạp của một ràng buộc, Choco cung cấp những ràng buộc cụ thể để xây dựng sao cho gọn hơn:
and, or, implies, ifOnlyIf, IfThenElse, not, nand, nor
Ví dụ biểu thức sau: ((x = 10 * |y| (z )) alldifferent(a,b,c)
Trang 2826
Có thể biểu diễn trong Choco là:
Constraint exp = ifOnlyIf(or( eq(x, mult(10, abs(y))), leq(z,9)), alldifferent(new IntegerVariable[]{a,b,c}));
2.2.2.5 Ràng buộc chung (Global constraint): ràng buộc chung cho
nhiều biến trong một ràng buộc
- Ràng buộc nối: ràng buộc liên kết tập hợp các biến (nhiều-nhiều) hoặc lập chỉ mục một trong số các biến (Một – Nhiều)
One-to-many: domainChanneling, max, min
Many-to-many: inverseChanneling, inverseSet, sorting, pack
- Ràng buộc tối ưu: ví dụ ràng buộc lọc chi phí
One cost: among, occurrence, equation, tree
Several costs: globalCardinality, multiCostRegular
- Ràng buộc đóng gói: Các ràng buộc bao gồm các hạng mục cần đóng gói mà không gây chồng chéo
Ví dụ ràng buộc nguồn:
Packing problems: equation, knapsackProblem
Scheduling problems: disjoint (tasks) disjunctive, cumulative
2.2.3 Lời giải (Solver):
Solver đọc model dùng các thuật toán được cài đặt sẵn hoặc kết hợp thêm để đưa ra lời giải thỏa mãn yêu cầu bài toán
Solver solver = new CPSolver(); // Khai báo đối tượng lời giải Solver.read(model); // Đọc mô hình cần giải quyết Solver.Solver(); // Tìm kiếm lời giải và trả về kết quả
Việc đọc được chia làm hai phần: Phần biến đọc và phần ràng buộc đọc
2.2.3.1 Phần biến đọc:
Các biến được khai báo trong một Model theo một loại nhất định như IntegerVariable, SetVariable, RealVariable Khi đọc model, Solver lặp lại trên các biến model sau đó tạo ra các biến Solver tương ứng và các cấu trúc
dữ liệu tên miền theo các loại trên
Trang 2927
Biến Model và biến Solver là các đối tượng riêng biệt Các biến Model sử dụng Varible còn Solver dùng Var Một biến model được xác định bằng một đại diện trừu tượng của miền ban đầu trong khi một biến Solver được tóm gọn là một đại diện rời rạc của tên miền và duy trì trạng thái hiện tại của nó trong tìm kiếm Do đó, chúng ta không thể tiếp cận trực tiếp vào một giá trị biến từ một biến model nhưng chúng ta lại có thể tiếp cận trong trường hợp là biến Solver tương ứng Các biến Solver là ẩn danh nhưng có thể tiếp cận được từ các biến model tương ứng bằng cách sử dụng getVar(Variable v) và getVar (Variable… v)
a IntDomainVar
Đối với các biến số nguyên, solver Intdomain Var là đối ứng với model IntegerVariable Phương pháp getVar (IntegerVariable var) và getVar (IntegerVariable… vars) của Solver trả về đối tượng IntDomainVar và IntDomainVar[] tương ứng với var và vars:
IntegerVariable x = Choco.makeEnumIntVar(“x”, 1, 100); // model variable IntDomainVar xOnSolver = solver.getVar(x); // solver variable
b SetVar
Đối với các biến tập hợp, Solver SetVar là đối ứng với model SetVariable Các phương pháp getVar (SetVariable var) và getVar (SetVariable… vars) của Solver trả về các đối tượng SetVar và SetVar[] tương ứng với var và vars:
SetVariable x = Choco.makeBoundSetVarv(“x”, 1, 40); //model variable SetVar xOnSolver = solver.getVar(x); // Solver Variable
c RealVar;
Đối với các biến thực, Solver RealVar là đối ứng tới model RealVariable
RealVariable x = Choco.makeRealVar(“x”, 1.0, 3.0); // model variable
RealVar xOnSolver = solver.getVar(x); // Solver variable
Trang 3028
2.2.3.2 Ràng buộc đọc:
Một khi các biến solver đã được tạo ra khi đọc model, solver lặp lại trên những ràng buộc của model và tạo ra các đối tượng Sconstraint bằng cách dùng phương pháp gọi makeConstraint của đối tượng ConstraintManager kết hợp với các loại ràng buộc model Ở bước này, có thể tạo ra các biến Solver phụ và các ràng buộc Sau đó, các ràng buộc được tạo
ra được thêm vào mạng ràng buộc bên trong
Mỗi ràng buộc solver tóm lược một thuật toán lọc mà trong quá trình tìm kiếm khi một bước lan truyền xuất hiện hoặc khi một sự kiện bên ngoài (VD xóa giá trị hoặc thay đổi ràng buộc) xảy ra ở một số biến của ràng buộc
Người ta có thể tiếp cận trình bày Solver của một model ràng buộc bằng cách sử dụng Solver: getCstr (Constraint c)
2.2.3.3 Chiến lƣợc tìm kiếm:
Một thành phần quan trọng của bất kỳ phương pháp ràng buộc là một chiến lược tìm kiếm thông minh Trong cách tiếp cận nhánh, ràng buộc hay thụt lùi, tìm kiếm được tổ chức như một cây liệt kê trong đó mỗi nút tương ứng với một không gian con của tìm kiếm và mỗi nút con là một nhánh của không gian nút lớn Cây được xây dựng dần dần bằng cách áp dụng một loạt các chiến lược phân nhánh mà xác định việc chia không gian tại mỗi nút như thế nào cũng như các nút con được tạo ra sao Chiến lược phân nhánh đóng vai trò của việc đạt được các mục tiêu trung gian trong lập trình logic Phần này trình bày cách xác định chiến lược tìm kiếm riêng của bạn trong Choco
Các phương pháp tiếp cận ràng buộc, nhánh hay quay lui, trong lập trình ràng buộc phát triển theo dạng cây liệt kê trong một thể thức DFS (Tìm kiếm ưu tiên theo chiều sâu):
1 Đánh giá 1 nút: chạy lan truyền
2 Nếu thất bại xảy ra hoặc nếu không gian tìm kiếm không thể tách rời sau đó Backtrack: đánh giá các nút đang chờ tiếp theo
Trang 31Ngoài ra, các phổ biến để chia không gian tìm kiếm trong thuật toán dựa trên CP/ B&B đó là gán một biến cho một giá trị hoặc ngăn cấm việc gán này.Choco cung cấp một chiến lược phân nhánh và các công cụ để dễ dàng tùy chỉnh biến và giá trị lựa chọn trong chiến lược Tuy nhiên, Choco
có khả năng thực hiện nhiều chiến lược phân nhánh phức tạp hơn (ví dụ như phân nhánh ràng buộc hoặc phân nhánh lưỡng phân)
2.3 Các yếu tố của Choco:
2.3.1 Biến (Variable)
2.3.1.1 IntegerVariable: là biến mang giá trị nguyên
Hình 3-1: Cách khai báo biến IntegerVariable trong thư viện Choco
Trang 3230
Options:
Options V_ENUM: Solver tạo ra miền liệt kê cho biến
Options V_BOUND: Solver tạo ra miền bị chặn cho biến
Options V_LINK: Solver tạo ra miền liên kết danh sách các biến
Options V_OBJECTIVE: xác định các biến để tối ưu hóa
Ví dụ:
IntegerVariable ivar1 = makeIntVar(“ivar1”, -10, 10);
IntegerVariable ivar2 = makeIntVar(“ivar2”, 0, 10000, Options V_BOUND,
Options V_NO_DECITION);
IntegerVariable bool = makeBooleanVar(“bool”);
2.3.1.2 Real Variable: là biến số thực
Cấu trúc:
makeRealVar (String name, double lowB, double uppB, String… options );
Hình 3-2: Bài toán khai báo biến RealVariable
2.3.1.3 Set Variable: biến tập hợp:
Cấu trúc:
Ví dụ:
Hình 3-3: Bài toán khai báo biến SetVariable