Thực hành trí tuệ nhân tạo
Trang 1PHẦN I: THUẬT TOÁN
I Cờ ta canh
1 Đề bài.
Tám (8) quân cờ được chỉ ra trong hình, gồm một bảng kích thước 3x3 với 8
quân cờ dược đánh số từ 1 đến 8 và một ô trống Một quân cờ đứng cạnh ô trống có
thể đi vào ô trống Mục tiêu là luôn luôn tiến tới vị trí các quân cờ như ở trong hình
bên phải (trạng thái đích)
Trạng thái đầu Trạng thái đích
Hãy trình bày thuật toán và viết chương trình demo để di chuyển các quân cờ
sao cho số bước di chuyển là thấp nhất (tối ưu) Dữ liệu được đọc từ file là ma trận
vuông 3x3
2 Thuật toán A* giải quyết bài toán
Trò chơi 8 số ở mức độ khó vừa phải nên là một trò chơi rất thú vị một giải
pháp điển hình gồm khoảng 20 bước, mặc dù con số này biến đổi phụ thuộc vào
trạng thái đầu Hệ số rẽ nhánh khoảng bằng 3 (khi ô trống ở giữa, có bốn khả năng
Một ví dụ khác để minh họa cho sự mềm dẻo của Logic mờ là việc xác định
Trang 2di chuyển; khi nó ở góc có hai khả năng di chuyển; và khi nó ở trên các cạnh, có ba
khả năng đi) Để giải bài toán này ta cần tìm một hàm Heuristic tốt Ta có hai hàm
ước lượng:
- H1 = số lượng các số sai vị trí
- H2 = tổng số khoảng cách của các số so với vị trí mục tiêu, là tổng
khoảng cách theo chiều ngang và theo chiều dọc
Bài toán tacanh khi được giải bằng thuật toán A* sẽ thực hiện theo các bước sau:
Từ trạng thái ban đầu ta xác định được trạng thái đích
- Gọi G là số bước đã di chuyển ô trống
- H là hàm heuristic, ước tính số hao tổn để tới trạng thái đích, tính bằng tổng
các quãng đường của các ô ở vị trí sai để về tới vị trí đúng F=G+H
Có hai danh sách Open và Close,
- Open chứa các trạng thái chưa xét,
- Close chứa các trạng thái đã xét
Ban đầu ta thêm trạng thái khởi đầu vào Open, sau đó chọn trạng thái có f
= g + h nhỏ nhất, lúc này danh sách Open chứa duy nhất trạng thái khởi đầu nên ta
lấy trạng thái khởi đầu khỏi Open, và đưa vào danh sách Close các trạng thái đã xét
Từ trạng thái đang xét ta xác định được trạng thái tiếp theo, dựa vào các hướng di
chuyển của ô trống Đưa tất cả các trạng thái mới mà chưa có trong Close và Open
vào danh sách Open Ta tiếp tục chọn trạng thái có f = g + h nhỏ nhất khỏi Open
như bước đầu tiên cho đến khi tìm ra trạng thái đích thì dừng lại Từ trạng thái đích
vừa tìm được đi ngược lại danh sách ta sẽ tìm được đường đi từ trạng thái khởi đầu
đến trạng thái đích
Ví dụ: cho hình sau:
Một ví dụ khác để minh họa cho sự mềm dẻo của Logic mờ là việc xác định
Trang 3N= 1+6+1+2+1=11 nên trạng thái đích là
• Các bước giải bài toán như sau:
Đầu tiên ta xác định trạng thái tiếp theo của bài toán trên:
Có ba trường hợp xảy ra:
Đối với trường hợp 1 có g= 1, h= 4,f= h+g=5
Đối với trường hợp 2 có g= 1, h= 5,f= h+g=6
Đối với trường hợp 2 có g= 1, h= 6,f= h+g=7
So sánh các f với nhau ta thấy f của trường hợp 1 nhỏ nhất nên trạng thái tiếp theo
là trạng thái 1
Từ 1 ta có ba trạng thái:
Một ví dụ khác để minh họa cho sự mềm dẻo của Logic mờ là việc xác định
Trang 4
Đối với trường hợp 1.1 có g= 2, h= 3,f= h+g=5
Đối với trường hợp 1.2 có g= 2, h= 5,f= h+g=7
Đối với trường hợp 1.3 có g= 2, h= 5,f= h+g=7
So sánh các f với nhau ta thấy f của trường hợp 1 nhỏ nhất nên trạng thái tiếp theo
là trạng thái 1.1
Từ 1.1 có hai trạng thái:
Đối với trường hợp 1.1.1 có g= 3, h= 2,f= h+g=5
Đối với trường hợp 1.1.2 có g= 3, h= 4,f= h+g=7
So sánh các f với nhau ta thấy f của trường hợp 1 nhỏ nhất nên trạng thái tiếp theo
là trạng thái 1.1.1
Từ 1.1.1 có một trạng thái:
Một ví dụ khác để minh họa cho sự mềm dẻo của Logic mờ là việc xác định
Trang 5Hai người chơi với nhau trò chơi như sau: với 1 số a đang có sẵn, đến lượt mình
chơi, người đó sẽ viết số a+1 hay 2a với điều kiện số mới viết này không vượt qua
số nguyên dương N cho trước Với số bắt đầu là 1, ai viết được số N trước thì xem
như thắng
Xem như máy là người đi sau Trình bày thuật toán và viết chương trình mô tả
trò chơi sao cho khả năng thắng của máy cao Dữ liệu được đọc từ bàn phím
2 Thuật toán giải quyết(Mimax).
Giả sử cả các người chơi đều lựa chọn chiến thuật chơi tối ưu, thì khi một người
viết số x, ta có thể biết người đó sẽ chắc chắn thắng hay thua
Một ví dụ khác để minh họa cho sự mềm dẻo của Logic mờ là việc xác định
Trang 6Với n không quá lớn, và bạn là một trong hai người chơi, bạn có thể lập bảng
trạng thái cho trò chơi này
Trong bài này, bảng trạng thái thực chất là mảng A[] với A[i] = 0 hoặc 1, tương ứng
với khả năng thắng chắc hoặc thua chắc
Khởi tạo : A[n] = 1 (thắng)
Bạn sẽ phải suy nghĩ tiếp công thức để điền được đầy đủ trạng thái cho bảng
Sau đó, khi chơi ta chỉ việc cố gắng viết một số có khả năng thắng chắc đã được chỉ
ra trong bảng trạng thái, tất nhiên nếu đối thủ đi trước, luôn chọn một chiến lược đi
tối ưu, và A[1] == 1, thì ta vẫn không thể thắng được
3 Cài đặt thuật toán
4 Kết quả Demo
III Bài toán phân việc
1 Đề bài:
Có n chi tiết máy J1, J2, , Jn cần gia công lần lượt trên 3 máy A, B, Cvới thời
gian hoàn thành tương ứng của 1 chi tiết là TA, TB, TC Các chi tiết từ J1, J2, , Jn có
thể gia công theo thứ tự bất kỳ tuy nhiên một chi tiết Ji phải được gia công lần lượt
theo thứ tự trên máy A máy B máy C
Trình bày thuật toán và viết chương trình mô tả sao cho tổng thời gian gia công
hoàn thành n chi tiết là thấp nhất (tối ưu) Dữ liệu được đọc từ file có dạng như sau:
DULIEU.INP
J1A, J2A, , JnA //thời gian gia công các chi tiết trên máy A
J1B, J2B, , JnB //thời gian gia công các chi tiết trên máy B
J1C, J2C, , JnC //thời gian gia công các chi tiết trên máy C
Kết quả xuất ra là thứ tự các công việc
2 Thuật toán giải quyết bài toán
Một thuật toán hết sức nổi tiếngđể giải bài toán trên đó là thuật toán Johnson
Thuật toán gồm các bước nhưsau:
Chia các chi tiết thành 2 nhóm: Nhóm N1 gồm các chitiết Di thoả mãn ai < bi và
nhóm N2gồm các chi tiết Di thoả mãn ai > bi Cácchi tiết Di thoả mãn ai = bi xếp vào
nhóm nàocũng được
Sắp xếp các chi tiết trong N1 theo chiều tăng của cácai và sắp xếp các chi tiết
trong N2 theo chiều giảm củacác bi
Nối N2 vào đuôi N1 Dãy thu được (đọc từtrái sang phải) sẽ là lịch gia công tối
ưu
Một ví dụ khác để minh họa cho sự mềm dẻo của Logic mờ là việc xác định
Trang 7Như vậy với ví dụ sau:
Bước 1: Ta có:N1 = {3, 5}; N2 = {1, 2, 4}
Bước 2: Sau khisắp xếp thì N1 = {3, 5}; N2= {2, 4, 1};
Bước 3: Lịchgia công là: 3 -> 5 -> 2 -> 4 ->1
Thuật toán Johnson đã được chứng minhvà cách làm trên sẽ cho ta được lịch
gia công tối ưu thoả mãn yêu cầu đề bài.Tuy nhiên, ở đây tôi muốn giới thiệu với
các bạn một thuật toán tham ăn kháccũng có độ chính xác cao (gần như tuyệt đối)
mà có phần đơn giản hơn và ứngdụng của nó cũng khá rộng rãi Thuật toán như sau:
Bước 1: Lập mảng Cvới Ci = ai / bi (i = 1, 2, , n)
Bước 2: Sắp xếp mảng Ctăng dần theo giá trị các phần tử cùng với sự thay
đổi thứ tự các chi tiết máy.Thứ tự các chi tiết mấy cuối cùng chính là thứ tự gia
công cần tìm
Như vậy với ví dụ trước ta có vớithuật toán trên thì:
Bước 1: Mảng C = [2,7/6, 1/9, 7/3, 2/5].
Thứ tựcác chi tiết giữ nguyên là: D1 -> D2 -> D3 -> D4 -> D5
Bước 2: Sau khi sắp xếptăng dần thì
C = [1/9, 2/5, 7/6, 2, 7/3]
Thứ tự cácchi tiết là: D3 -> D5 -> D2 -> D4 -> D1
Thứ tự trên chính là thứ tự giacông phải tìm Chúng ta có thể dễ dàng thấy
được lịch trình gia công ở đây hoàntoàn giống với lịch trình gia công nếu như
chúng ta giải quyết bài toán vớithuật toán Johnson Các bạn có thể kiểm tra độ đúng đắn của thuật toán vớinhiều bộ test khác, tôi xin đưa ra một ví dụ nữa:
Thứtự gia công sẽ là: D1 -> D4 -> D2-> D5-> D3
Hoặc:D4 -> D1 -> D5 -> D2 -> D3
Thuật toán lập tỉ số như trên cònđược ứng dụng khá rộng rãi ở một số bài
toán có chủ đề tương tự Chúng ta hãyxét bài toán sau: Bắt đầu từ thời điểm 0, một
người làm n công việc đánh sốhiệu từ 1 -> n(n ≤ 200) Với 1 ≤ i ≤ N, việc i cần làm
trong T[i] đơn vị thời gian.Từ thời điểm 0 đến lúc bắt đầu làm công việc nào đó,
người đó bị phạt một lượngtiền C[i] cho mỗi đơn vị thời gian Khi đã làm một việc
nào thì phải làm xongviệc ấy sau đó mới được chuyển sang làm việc khác Hãy thu
xếp trình tự làmviệc sao cho tổng số tiền phạt là ít nhất Giả sử dữ liệu cho trong tệp
có dạngnhư ví dụ sau:
Một ví dụ khác để minh họa cho sự mềm dẻo của Logic mờ là việc xác định
Trang 83 1 1 6 4 7
4 3 4 2 1 3
Với dòng đầu đó là số lượng công việc (ở đâyn=6), dòng thứ 2 ghi thứ tự số
lượng thời gian cần thiết cho từng công việc.Dòng thứ 3 ghi số tiền phạt cho mỗi
đơn vị thời gian ở các công việc tương ứng
Để giải quyết bài toán trên ta có thể sử dụng thuậttoán lập dãy tỉ số như trên
Giả sử mảng A gồm các phần tử A[i] = T[i] / C[i] (i =1, 2, , n) Khi đóta có các
bước giải như sau:
Bước 1: mảng A là 3/4 ; 1/3 ; 1/4 ; 6/2 ;4/1 ; 7/3.
Thứ tự công việc vẫn giữ nguyên
Bước 2: Sắp xếp mảng Atăng dần: 1/4 ; 1/3 ; 3/4 ; 7/3 ; 6/2 ; 4/1 Thứ tự công
Một người khách du lịch muốn đi thăm n thành phố được đánh số từ 1 n và quay
lại thành phố xuất phát Mạng lưới giao thông giữa n thành phố này là hai chiều và
được cho bởi ma trận A[i,j] trong đó A[i,j]=1 nếu có đường đi từ thành phố i đến
thành phố j, A[i,j]=0 trong trường hợp ngược lại
Hãy thiết lập lộ trình cho người khách hay thông báo không tồn tại lời giải Dữ liệu
được đọc từ file có dạng như sau:
DULIEU.INP
Dòng 1: Ghi số nguyên n (n<=20)
Dòng i+1 (1<=i<=n) ghi n số nguyên không âm (0 hoặc 1)
Kết quả xuất ra chu trình đường đi (Chu trình HAMILTON)
Một ví dụ khác để minh họa cho sự mềm dẻo của Logic mờ là việc xác định
Trang 92 Thuật toán giải quyết bài toán.
Thuật toán đàn kiến giải bài toán người du lịch
Để bắt chước hành vi của các con kiến thực, Dorigo xây dựng các con kiến
nhân tạo (artificial ants) cũng có đặc trưng sản sinh ra vết mùi để lại trên đường đi
và khả năng lần vết theo nồng độ mùi để lựa chọn con đường có nồng độ mùi cao
hơn để đi Với bài toán Người du lịch trên đồ thị trong không gian hai chiều với
trọng số là khoảng cách Euclide giữa hai đỉnh bất kỳ, Dorigo gắn với mỗi cạnh (i, j) ngoài trọng số d(i, j) trên là nồng độ vết mùi trên cạnh đó, đặt là Ban đầu, các
nồng độ mùi trên mỗi cạnh được khởi tạo bằng một hằng số c nào đó
Phương pháp tìm đường đi mô phỏng hành vi con kiến
Các con kiến sẽ tiến hành tìm đường đi từ đỉnh xuất phát qua một loạt các
đỉnh và quay trở về đỉnh ban đầu, tại đỉnh u một con kiến sẽ chọn đỉnh v
chưa được đi qua trong tập láng giềng của u theo xác suất sau:
trong đó
.- UV(u) là tập các đỉnh láng giềng của u chưa được con kiến hiện tại đi qua
gọi là thông tin heurtistic giúp đánh giá chính xác hơn sự lựa chọn của
con kiến khi quyết định đi từ đỉnh u qua đỉnh v
Ta có thể hiểu công thức trên đơn giản như sau: quyết định lựa chọn đỉnh tiếp theo
để đi của con kiến được lựa chọn ngẫu nhiên theo xác suất (tức là đỉnh nào có xác
suất cao hơn sẽ có khả năng được chọn cao hơn, nhưng không có nghĩa là các đỉnh
có xác suất thấp hơn không được chọn mà nó được chọn với cơ hội thấp hơn mà
thôi) Ý tưởng này được thể hiện qua kỹ thuật Bánh xe xố số (Lottery Wheel) sẽ
Một ví dụ khác để minh họa cho sự mềm dẻo của Logic mờ là việc xác định
Trang 10được trình bày sau Và xác suất này (hay khả năng chọn đỉnh tiếp theo của con kiến)
tỷ lệ thuận với nồng độ vết mùi trên cạnh được chọn (theo đặc tính của con kiến tự
nhiên) và tỷ lệ nghịch với độ dài cạnh, là những hệ số điểu khiển việc lựa chọn
của con kiến nghiêng về phía nào
Kỹ thuật bánh xe xổ số
Đây là kỹ thuật phổ biến hay sử dụng trong các phương pháp tìm kiếm dựa vào xác
suất, đặc biệt trong phép toán Chọn lọc (Selection) của thuật toán di truyền (Genetic Algorithm) Cụ thể kỹ thuật như sau:
Giả sử V={v1,v2, …, vn} là tập các láng giềng của u, p1, p2, …, pn là xác suất lựa
chọn đỉnh tiếp theo từ u của tương ứng v1,v2, …, vn, tức là chắc
chắn chọn 1 trong các đỉnh trên để đi tiếp Để đảm bảo ưu thế của những đỉnh có
xác suất lớn, nhưng vẫn đảm bảo cơ hội của các đỉnh có xác suất thấp hơn người ta
sinh ra một số ngẫu nhiên k thuộc (0, sum] rồi chọn i nhỏ nhất sao cho
Cách làm này mô phỏng hoạt động của một vòng quay xổ số (vòng được
chia làm nhiều phần không bằng nhau), rõ ràng khi quay ta không biết kim của bánh quay sẽ chỉ vào phần nào nhưng ta cũng có thể nhận thấy ngay là phần lớn hơn sẽ
nhiều khả năng kim rơi vào đó hơn Chính vì vậy kỹ thuật này được gọi là Bánh xe
xổ số
Như vậy, các con kiến từ một đỉnh xuất phát, lần lượt tới thăm các đỉnh tiếp
theo theo quy tắc trên (thăm xong đánh dấu chúng lại) cho đến thăm tới đỉnh cuối
cùng và quay về đỉnh ban đầu, kết thúc một hành trình Quá trình này được lặp đi
lặp lại, hành trình tốt hơn (có chiều dài ngắn hơn) sẽ được cập nhật cho đến một
khoảng thời gian đủ tốt (thông thường tính toán theo số vòng lặp, với các trường
hợp nhỏ (số đỉnh <=200) số vòng lặp bằng 500 là đủ tìm ra kết quả tối ưu, còn với
các trường hợp lớn hơn ta phải thử với số lần lặp lớn hơn nhiều, tùy thuộc vào từng
bộ dữ liệu cụ thể
Sau khi và trong quá trình các con kiến tìm đường đi các vết mùi ( ) được
cập nhật lại, vì chúng bị biến đổi do quá trình bay hơi và do quá trình tích lũy của
các con kiến trên cạnh đó Có rất nhiều cách cập nhật mùi, mỗi cách có ảnh hưởn
nhất định đến chất lượng của thuật toán Trong phạm vi kiến thức phổ thông, chúng
tôi giới thiệu cách cập nhật mùi đơn giản nhất như sau:
Sau mỗi vòng lặp (các con kiến đều tìm được hành trình riêng của mình), vết mùi trên mỗi cạnh được cập nhật lại theo công thức sau:
Một ví dụ khác để minh họa cho sự mềm dẻo của Logic mờ là việc xác định
Trang 11trong đó gọi là tham số bay hơi (sở dĩ gọi như vậy vì sau mỗi lần cập nhật
lượng mùi trên cạnh (i,j) sẽ mất đi một lượng là , thường được chọn là
0,8 trong cài đặt và chạy chương trình Ngoài lượng bay hơi mất đi đó mỗi cạnh (i,
j) còn được tích tụ thêm một lượng mùi nhất định tùy thuộc vào từng con kiến
đi qua, cụ thể được tính như sau:
trong đó Q là một hằng số, Lk là độ dài hành trình của con kiến thứ k
Nhờ việc cập nhật mùi này, sau mỗi vòng lặp (hay sau mỗi lần các con kiến đi
hết hành trình), nồng độ vết mùi trên các cạnh sẽ thay đổi (hoặc giảm hoặc tăng
dần) ảnh hưởng đến quyết định chọn của các con kiến, có thể ở bước lặp này chọn
một cạnh để đi nhưng đến bước lặp khác vẫn con kiến đó lại không đi qua cạnh đó
nữa Nhờ vậy thuật toán có khả năng tìm được lời giải tốt trong những trường hợp
Một công ty cần thay toàn bộ hệ thống dây điện cho N phòng làm việc Cho biết
sơ đồ mạng lưới điện hiện có của n căn phòng được biểu diễn bằng ma trận A[i,j]
trong đó A[i,j] chính là độ dài của dây điện nối giữa 2 phòng i và j (A[i,j]=A[j,i],
A[i,j]=0 nếu không có (không thể) dây nối giữa phòng i và j) Hãy lập trình tính độ
dài của dây dẫn cần sử dụng sao cho cả N phòng dều có điện và số lượng này là ít
nhất
Dữ liệu được đọc từ file có N+1 dòng dạng như sau: DULIEU.INP
Dòng 1: Ghi số nguyên N
Dòng i+1 (1<=i<=N) ghi N số nguyên A[i,1] A[i,2] A[i,N]
Các số ghi trên 1 dòng cách nhau ít nhất 1 dấu cách
Kết quả xuất ra màn hình cách nối và tổng độ dài nhỏ nhất
Một ví dụ khác để minh họa cho sự mềm dẻo của Logic mờ là việc xác định
Trang 122 Thuật toán Prim tìm cây phủ tối tiểu.
Bước 1: Xuất phát từ đỉnh k bất kỳ (thông thường chọn đỉnh đầu tiên) chọn
một cạnh có trọng số nhỏ nhất liền kề với đỉnh k (min{A[k][j]}j=1 n) ta
đánh dấu 2 đỉnh đi qua cạnh đó
và số cạnh tìm được là 1 Chuyển sang bước 2
Bước 2: Tìm cạnh nhỏ nhất của đồ thị với điều kiện cạnh tìm được phải có 1
đỉnh chưa đánh dấu và 1 đỉnh đã đánh dấu (min{A[i][j]}j=1 n, i=1 n sao
cho i đánh đấu và j chưa đánh dấu) để tránh trường hợp tạo thành chu trình
Ta tăng số cạnh tìm được lên 1 và chuyển sang bước 3
Bước 3: Nếu số cạnh tìm được bằng n-1 kết thúc thuật toán, ngược lại quay
về bước 2
3 Cài đặt thuật toán.
Ta tổ chức mảng 1 chiều D để đánh dấu Nếu D[i]=1 đỉnh i được đánh dấu và D[i]=0 nếu i chưa được đánh dấu
Bước 1: Tìm min{A[1][j]}j=1 n Sau đó gán D[1]=D[j]=1 (đánh dấu 2 đỉnh
1,j) và cho số cạnh tìm được bằng 1 (Dem=1)
Bước 2: Tìm min{A[i][j]}j=1 n, i=1 n với điều kiện D[i]=1 và D[j]=0 Sau
đó gán D[j]=1 (đánh dấu đỉnh j vừa tìm được) và tăng số cạnh lên 1 (Dem+
Cậu bé nghĩ ra 1 số (Gọi là S) gồm bỗn chữ số (không nhất thiết khác nhau)
trong sáu chữ số từu 1 đến 6 Để tìm số đó máy lần lượt đưa ra các số dự đoán (gọi
là M), mỗi số gồm 4 chữ số không nhất thiết khác nhau Với mỗi lần dự đoán, máy
nhận được 2 câu trả lời của cậ bé cho 2 câu hỏi sau
Có bao nhiêu chữ số trong M là chữ số trong S nhưng vị trí xuất hiện của
mỗi chữ số đó là sai?
Có bao nhiêu chữ số trong M là chữ số trong S và đồng thời vị trí xuất hiện
của mỗi chữ số đều đúng?
Yêu cầu: Hãy hiện lên màn hình các số máy dự đoán và nói mỗi số đó nhận 2 câu
trả lời từ bàn phím của cậu bé cho đến khi được số đúng như cậu bé nghĩ (Số lần
dự đoán không quá 6 lần)
Trang 13Trong ngày sinh nhật Tom và Jerry nhận được N đồ chơi (N<=40) Trên đồ chơi
i có giá tiền là Xi Hai anh em quyết định mỗi người phải có trách nhiệm bảo quản 1 phần số quà và phân chia sao cho chênh lệch tổng giá trị tiền đồ chơi mà mỗi người
phải bảo quản là ít nhất Hãy giúp Tom bà Jerry phân chia trách nhiệm Dữ liệu đọc
từ file text có dạng sau:
Dòng 1 : ghi số nguyên dương N
Dòng 2 : Ghi N số nguyên dương tương ứng với giá trị N đồ vật
2 Thuật toán
Với một số M bất kì, nếu ta biếtđược có tồn tại một cách chọn các gói kẹo để
tổng số kẹo của các gói được chọnbằng đúng M không, thì bài toán được giải sẽ
quyết Vì đơn giản là ta chỉ cầnchọn số M sao cho M gần với Ai/2nhất (với i
=1,2, ,N) Sau đó xếp các gói kẹo để tổng bằng M vào phần một,phần thứ hai sẽ
gồm các gói kẹo còn lại Để kiểm tra được điều trên ta sẽ xâydựng tất cả các tổng có
Một ví dụ khác để minh họa cho sự mềm dẻo của Logic mờ là việc xác định
Trang 14thể có của N gói kẹo bằng cách: ban đầu chưa có tổngnào được sinh ra Làm lần
lượt với các gói kẹo từ 1 đến N, với gói kẹo thứ i,ta kiểm tra xem hiện tại có các
tổng nào đã được sinh ra, giả sử các tổng đó làx1, x2, , xt vậy thì đến bước này sẽ có
thểsinh ra các tổng x1, x2, , xt và Aivà x1+Ai,x2+Ai, ,xt+Ai.Với N gói kẹo, mà mỗi
gói có không quá 100 cái kẹo vậy tổng số kẹo không vượtquá N*100 <= 10000 cái
kẹo Dùng mảng đánh dấu D, nếu có thể sinh được ratổng bằng k thì D[k] = 1
Có 1 bản đồ có N nước Mỗi nước được tô 1 màu để phân biệt Các nước liền kề
nhau không được tô cùng màu với nhau Hãy xác định số màu tối thiểu để tô bản đồ sao cho các miền kề nhau không được tô cùng màu
◊ File dữ liệu đầu vào: GRAPH.INP có cấu trúc
Trang 16Từ đồ thị G bằng cách loại bỏ đỉnh x cùng với tất cả các cạnh nối tới đỉnh x đó
Một đồ thị trống là đồ
thị không chứa một đỉnh hay một cạnh nào Hai đỉnh gọi là kề nhau nếu có cạnh
nối với nhau
Với một đỉnh x bất kỳ, ta xây dựng một tập các bộ 3 như sau:
Trong đó đỉnh thứ nhất kề với đỉnh thứ hai, đỉnh thứ 2 kề với đỉnh thứ 3 Và
không tồn tại một bộ 3 nào mà:
đỉnh thứ nhất kề hoặc trùng với đỉnh thứ 3 Từ tập các bộ 3 đó, ta tìm các đỉnh yi sao cho có:
mi = max(m1, m2, , mn) và đặt yi = x Nếu có nhiều đỉnh y đạt max ta chọn
đỉnh đầu tiên
Ta có thể hình dung: Chọn một đỉnh trong số những đỉnh không kề với đỉnh x,
kề với đỉnh (đỉnh trung gian)
kề với đỉnh x, có số đỉnh trung gian là lớn nhất
Một ví dụ khác để minh họa cho sự mềm dẻo của Logic mờ là việc xác định
Trang 17Các bước của thuật toán (đồ thị G là dữ liệu vào):
Bước 1: Đặt j = 1, H=G
Bước 2: Đặt vj là đỉnh có bậc cao nhất trong H
Bước 3: Từ vj xây dựng tất cả các bộ 3 như trên và tìm đỉnh x Nếu không tìm
được x, trong trường hợp
không tìm được bộ 3 nào, chọn một đỉnh có bậc lớn nhất không kề với vj
Bước 4: Nhập x vào vj và quay lại bước 3 cho tới khi không chọn được một đỉnh nào nữa thì quay lại bước 2
với : H=H-{vj}, j=j+1
Bước 5: Khi không còn một đỉnh nào còn lại trong H, dựng lại và tô màu i cho
tất cả các đỉnh được
3 Cài đặt thuật toán.
4 Kêt quả demo.
IX Người lái đò
1 Đề bài.
Viết chương trình mô phỏng bài toán người lái đò (có thể có giao diện đồ họa) Bài
toán phát biểu như sau:
Tại bến sông nọ có bắp cải, sói và dê muốn bác lái đò chở qua sông Biết rằng tại
một thời điểm thuyền của bác lái đò chỉ chở tối đa được 2 khách Nếu sói và dê
đứng riêng với nhau (không có mặt bác lái đò và bắp cải) thì sói sẽ ăn thịt dê Nếu
dê và bắp cải đứng riêng với nhau (không có mặt bác lái đò và sói) thì dê sẽ ăn bắp
cải
Ký hiệu bờ sông mà sói, dê, bắp cải và bác lái đò đang đứng là 1, bờ sông bên kia là
2 Hãy viết chương trình giải quyết bài toán trên
2 Thuật toán
Với bài toán này , cách biểu diễn tri thức tốt nhất có thể vạch ra các ràng buộc
vốn sẵn có trong bài toán đó là
Xây dựng một biểu đồ với các nút có đánh nhãn biều diễn người lái đò mang
theo thứ mà ông ta cần mang theo trên mỗi chuyến đò
Và các cạnh liên kết giữa các nút biễu diễn bằng các đường mũi tên chỉ các chuyến
đò sang sông
Một ví dụ khác để minh họa cho sự mềm dẻo của Logic mờ là việc xác định
Trang 18Biểu đồ biễu diễn tri thức của bài toán người lái đò được mô tả như hình:
Với người lái đò và ba thứ ông ta muốn mang theo ở bên này sông hay bên kia sông , ta có 21+3 = 16 lần sắp xếp khác nhau , trong đó 6 lần sắp xếp khác qua
lại sông không an toàn đó là :
Sói , dê và bắp cải bên này sông hoặc bên kia sông
Sói và dê bên này sông hoặc bên kia sông
Dê và bắp cải bên này sông hoặc bên kia sông
Và 10 lần sắp xếp qua sông an toàn đó là ( Kí hiệu: Sói :S , Dê : D , Bắp cài : B ,
Trang 19Khi tri thức của bài toán đã được biễu diễn , phương pháp giải bài toán trong
lĩnh vực trí tuệ nhân tạo đó là kỹ thuật tìm kiếm trong miền biểu diễn tri thức của
bài toán đó
Để giải bài toán người lái đò , kỹ thuật tìm kiếm là bằng cách bám dò tìm theo
các đường mũi tên bắt đầu từ nút khởi tạo liên kết qua các nút để đi đến đích
3 Cài đặt thuật toán.
4 Kêt quả demo.
X Qua sông
1 Đề bài.
Viết chương trình mô phỏng bài toán qua sông (có thể có giao diện đồ họa) Bài
toán phát biểu như sau:
Tại bến sông nọ có 3 thầy tu và 3 con quỷ muốn qua sông Biết rằng tại một thời điểm thuyền chỉ chở tối đa được 2 khách Nếu bất cứ ở trên bờ nào, bên này hoặc
bên kia thì số con quỷ phải bé hơn hoặc bằng số thầy tu, ngược lại quỷ sẽ ăn thịt
thầy tu
Hãy viết chương trình giải quyết bài toán trên
2 Thuật toán giải quyết.
Bài toán tập trung vào qui tắc : Nếu ở 1 "nơi" nào đó, số Quỷ(Q) nhiều hơn số
người(N) thì quỷ sẽ ăn người - nói theo ứng xử trò chơi, đây là trạng thái "thua" -
còn nói theo tập trạng thái ta đang muốn xây dựng thì đây là "trạng thái vị phạm",
và nó sẽ không được xem xét trong tập trạng thái của ta ( sẽ gọi là 1 trạng thái sai,
nếu có phát sinh trong quá trình tìm kiếm cũng sẽ bị bỏ qua, không bao giờ xét đến)
Cách thức biến đổi từ trạng thái này đến trạng thái khác là : Từ bờ bên có thuyền chất 1, 2 N/Q gì đó lên thuyền và cho chạy qua bờ bên kia Trạng thái xung đột sẽ
chỉ được
Xem xét sau khi N/Q đã sang được bên kia
Xét về “nơi” có thể xảy ra xung đột thì có tất cả ba nơi
Thuyền, bờ 1, bờ 2
Dễ thấy đối với "thuyền" thì theo mô tả bài toán này, sẽ không có xung đột trên
thuyền Đơn giản vì thuyền phải có ít nhất 1 N/Q ( Người hay quỷ) điều khiển mới
chạy, và trên thuyền cho phép chở nhiều nhất 2 N/Q Xét mọi trường hợp, ko có
xung đột trên thuyền
Một ví dụ khác để minh họa cho sự mềm dẻo của Logic mờ là việc xác định
Trang 20Cho nên ta chỉ quan tâm đến tình trạng N/Q 2 bờ, và vị trí của thuyền ở đâu ( Bờ 1/ Bở 2 ?) 1 nhận xét nữa là nếu đã biết bờ 1 có x người, y quỉ, ta cũng biết luôn
bên bờ 2 có 3-x người, 3-y quỷ Vậy để phân biệt các trạng thái của bài này ta chỉ
Qui tắc xung đột đối với trạng thái [x,y,b] : Trạng thái là xung đột nếu?
Hoặc là (x>0 và y>x) xung đột bên bờ 1
Hoặc là (3-x>0 và 3-y>3-x) xung đột bên bờ 2
Tập các trạng thái có thể đến từ [x,y,true] (tổng quát ): [x-1,y,false], [x-2,y,
false], [x-1,y-1,false], [x,y-1,false], [x,y-2,false]
Tuơng tự, ta có thể xây dựng tập các trạng thái có thể đến từ [x,y,false]
Trạng thái đầu: [3,3,true]
Lý thuyết mờ đã được nhắc đến rất nhiều trong những năm gần đây Trên thế
giới và ở Việt Nam đã có nhiều tác giả nghiên cứu và áp dụng thành công lý thuyết
mờ trong các lĩnh vực điều khiển sản xuất công nghiệp, trong các sản phẩm gia
dụng w Tuy nhiên một bộ điều khiển mờ trong thực tế nó ra sao? Phần này tôi sẽ
trình bày về các vấn đề, thứ nhất là lý thuyết điều khiển mờ, sau đó là giới thiệu về
Một ví dụ khác để minh họa cho sự mềm dẻo của Logic mờ là việc xác định
Trang 21quá trình xây dựng bộ điều khiển mờ trong thực tế và các ứng dụng sử dụng logic
mờ
Lôgic mờ (tiếng Anh: Fuzzy logic) được phát triển từ lý thuyết tập mờ để thực
hiện lập luận một cách xấp xỉ thay vì lập luận chính xác theo logic vị từ cổ điển
Người ta hay nhầm lẫn mức độ đúng với xác suất Tuy nhiên, hai khái niệm này
khác hẳn nhau; độ đúng đắn của lôgic mờ biểu diễn độ liên thuộc với các tập được
định nghĩa không rõ ràng, chứ không phải khả năng xảy ra một biến cố hay điều
kiện nào đó
Đe minh họa sự khác biệt, xét tình huống sau: Bảo đang đứng trong một ngôi
nhà có hai phòng thông nhau: phòng bếp và phòng ăn Trong nhiều trường hợp,
trạng thái của Bảo trong tập hợp gồm những thứ "ở trong bếp" hoàn toàn đơn giản:
hoặc là anh ta "trong bếp" hoặc "không ở trong bếp" Nhưng nếu Bảo đứng tại cửa
nối giữa hai phòng thì sao? Anh ta có thể được coi là "có phần ở trong bếp'1 Việc
định lượng trạng thái "một phần" này cho ra một quan hệ liên thuộc đối với một tập
mờ Chẳng hạn, nếu Bảo chỉ thò một ngón chân cái vào phòng ăn, ta có thể nói rằng Bảo ở "trong bếp" đến 99% và ở trong phòng ăn 1% Một khi anh ta còn đứng ở cửa thì không có một biến cố nào (ví dụ một đồng xu được tung lên) quyết định rằng
Bảo hoàn toàn "ở trong bếp" hay hoàn toàn "không ở trong bếp"
Logic mờ cho phép độ liên thuộc có giá trị trong khoảng đóng 0 và 1, và ở
hình thức ngôn từ, các khái niệm không chính xác như "hơi hơi”, "gần như", "khá
là" và "rất” Cụ thể, nó cho phép quan hệ thành viên không đầy đủ giữa thành viên
và tập họp Tính chất này có liên quan đến tập mờ và lý thuyết xác suất