Báo cáo thực hành trí tuệ nhân tạo
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA CÔNG NGHỆ THÔNG TIN
- -BÁO CÁO THỰC HÀNH TRÍ TUỆ NHÂN TẠO
Giáo viên hướng dẫn : Võ Đức Hoàng
Đà Nẵng, 11/2014
Trang 21 Bài 1 3
2 Bài 2 5
3 Bài 3 6
4 Bài 4 8
5 Bài 5 9
6 Bài 6 10
7 Bài 7 13
8 Bài 8 14
9 Bài 9 16
10 Bài 10 18
II Nội dung buổi 3 19
1 Đề tài và giới thiệu 19
2 Chữ kí tự động 20
a Thu thâp dữ liệu về tiến trình 20
b Trích chọn đặt trưng 21
c Đăng kí chữ ký mẫu 21
d So khớp 22
3 Thuật toán DTW 22
a) Mô tả kí kiệu 22
b) Xây dựng ma trận DTW 23
4 Tìm warp-path nhỏ nhất 23
Trang 3I Nội dung buổi 2
1 Bài 1
Đề bài: Trò chơi 8 quân cờ (Cờ ta canh)
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 8quâ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
Thuật toán
- Dùng thuật toán A* để giải quyết bài toán 8 quân cờ nêu trên.Thuật toán A* sẽ đảm bảo lời giải phát hiện ra có chi phí thấp nhất nếu ước lượng các đỉnh đang xét đến đích nhỏ hơn khoảng cách thực
- Thuật toán A* sẽ sử dụng khoảng cách từ đỉnh xuất phát đến đỉnh x đang xét: g(x) và khoảng cách ước lượng từ đỉnh x đang xét đến đích: h’(X)
- Các bước của thuật toán A* như sau:
1 Cho đỉnh xuất phát vào open
2 Nếu open rỗng thì tìm kiếm thất bại, kết thúc việc tìm kiếm
3 Lấy đỉnh đầu trong open ra và gọi đó là O Cho O vào closed
4 Nếu O là đỉnh đích thì tìm kiếm thành công, keeys thúc việc tìm kiếm
5 Tìm tất cả các đỉnh con của O không thuộc open và closed cho vào open theo thứ tự tăng dần đối với hàm f(x)=g(x)+ h’(x)
6 Trở lại bước 2
- Để áp dụng được thuật toán A* vào bài toán 8 quân cờ, ta cần xác định hàm heuristic để ước lượng giá trị của mỗi trạng thái ở bảng số.Ta sử dụng thuật toán Manhattan để xây dựng hàm đánh giá chi phí, khi đó giá trị của hàm heuristic sẽ bằng tổng số ô chênh lệch của ô số ở trạng thái hiện tại so với trạng thái đích của nó Manhattan đo khoảng cách chênh lệch bằng cách đếm các hướng ngang học sao cho đường đi từ vị trí đangxét với vị trí đúng là ngắn nhất Tọa độ đúng của ô có địa chỉ ID trên ma trận vuông kích thước nxn ta sử dụng công thức sau: RowID=ID/n, ColID=ID%n
1 2 3
4 5 6
7 8
Trang 4- Khi đó chi phí từ vị trí hiện tại có tọa độ (x2,y2) đến vị trí đích có tọa độ
Trang 5
Bước 4 Bước 5
2 Bài 2
Đề bài: Trò chơi viết số
Hai 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ìnhchơ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ượtqua số nguyên dương N cho trước Với số bắt đầu là 1, ai viết được số N trướcthì 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
Thuật toán
- Dùng thuật toán MiniMax để giải quyết bài toán nêu trên
- 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
- Với N không quá lớn thì có thể lập 1 bảng các trạng thái của trò chơi
này
- Thuật toán như sau:
Mảng A[] với A[i] sẽ có các giá trị là 0 hoặc 1 để biểu diễn các trạng thái của bài toán, với A[i]=0 là trạng thái chắc chắn thua và A[i]=1 là trạng thái chắc chắn thắng
Khởi tạo A[n]=1 : thắng
Tại một điểm i nào đó với x=2*i hoặc x=i+1, và nếu A[x]=1 thì A[i]=0 , ngược lại thì A[i]=1 Vì nếu người đi hiện tại để người đisau mình cộng 1 hoặc nhân 2 đụng tới điểm chắc chắn thắng thì người đó sẽ thua
Sau khi có được bảng các trạng thái thì có thể áp dụng thuật toán MiniMax để tìm kiếm để khả năng thắng của máy là cao nhất
- Giả sử như với n=10, ta sẽ có bảng trạng thái như sau:
Trang 6Nếu Bấm +1 tiếp tục thì máy sẽ thắng
- Trường hợp nhìn bảng trạng thái ở trên, có thể biết mình thắng hay thua
3 Bài 3
Đề bài: Bài toán phân việc
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ờigian 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ônglần lượt theo thứ tự trên máy A máy B máy C
Trang 7Trì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ônghoà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
n //số chi tiết cần gia công
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 CKết quả xuất ra là thứ tự các công việc
Thuật toán
- Sử dụng thuật toán Johnson để giải quyết bài toán trên.
- Thuật toán lập lịch Johnson đối với 2 máy A,B như sau:
Chia các chi tiết thành 2 nhóm: nhóm N1: gồm các chi tiết Di thoảmãn a1< b1, tức là min(ai,bi) = ai và nhóm N2 gồm các chi tiết Dithoả mãn ai>bi tức là min(ai,bi)=bi Các chi tiết Di thoả mãn ai
=bi xếp vào nhóm nào cũng được
Sắp xếp các chi tiết trong N1 theo chiều tăng của các ai và sắp xếpcác chi tiết trong N2 theo chiều giảm của cá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
- Thuật toán lập lịch Johnson đối với 3 chi tiết máy theo thứ tự A,B,C phải có điều kiện ràng buộc max bi ≤ min ai hoặc max bi ≤ min ci
- Lịch gia công tối ưu trên 3 máy sẽ trùng với lịch gia công tối ưu trên 2 máy: máy thứ nhất với thời gian ai + bi và máy thứ hai với thời gian
Trang 8Mộ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à haichiều và được cho bởi ma trận A[i,j] trong đó A[i,j]=1 nếu có đường đi từ thànhphố 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)
Chu trình Hamilton là chu trình xuất phát từ một đỉnh, đi thăm tất
cả những đỉnh còn lại, mỗi đỉnh đúng một lần, cuối cùng quay lại đỉnh xuất phát
Đường đi Hamilton là đường đi qua tất cả các đỉnh của đồ thị, mỗiđỉnh đúng một lần
Một đồ thị đầy đủ có nhiều hơn hai đỉnh là đồ thị Hamilton Mọi
đồ thị vòng là Hamilton Đồ thị khối ba chiều là đồ thị Haminton
- Thuật toán như sau tìm chu trình như sau:
Gán đỉnh đầu tiên bằng 1
Thử các cách chọn đỉnh thứ i trong hành trình với i>=2 và i<=n
Chọn tất cả các đỉnh j để tìm đỉnh thứ i X[i] kề với X[i-1] và chưa bị đi qua
o Nếu tìm thấy đỉnh j thỏa mãn điều kiện trên thì gán X[i] = j
o Nếu i < n thì:
Đánh dấu đỉnh j là đã đi qua để cho các bước tiếp theo không chọn j nữa
Sau đó chọn đỉnh thứ i+1 trong hành trình
Thử phương án khác cho X[i] nên sẽ bỏ đánh dấu đỉnh vừa thử
o Ngược lại , nếu đã thử chọn đến X[n] thì kiểm tra nếu X[n] lại kề với X[1] thì ta có chu trình Hamilton
Demo
Trang 95 Bài 5
Đề bài: Bài toán hệ thống dây điện
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ậnA[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
Thuật toán
- Sử dụng thuật toán Prim để giải quyết bài toán trên.
- Thuật toán Prim như sau:
Dữ liệu vào: Một đồ thị có trọng số liên thông với tập hợp đỉnh V
Trang 10 Chọn cạnh (u, v) có trọng số nhỏ nhất thỏa mãn u thuộc Vmới và v không thuộc Vmới (nếu có nhiều cạnh như vậy thì chọn một cạnh bất kì trong chúng)
Thêm v vào Vmới, và thêm cạnh (u, v) vào Emới
Dữ liệu ra: Vmới và Emới là tập hợp đỉnh và tập hợp cạnh của một cây bao trùm nhỏ nhất
- Coi mỗi phòng là một đỉnh của đồ thị Chiều dài dây điện cần để nối giữaphòng i và phòng j chính là trọng số cạnh (i , j)
- A[i,j] chính là độ dài đoạn dây điện nối giữa hai phòng i và j Nếu không thể nối dây thì A[i,j]=∞
- Độ dài đường dây dẫn cần nối sao cho tất cả các phòng đều có điện và sốlượng là ít nhất chính là độ dài cây khung nhỏ nhất của đồ thị A
Demo
6 Bài 6
Đề bài: Trò chơi đoán số
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ỗichữ 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ệncủ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 11Ví dụ: Số cần tìm là 5436
1234
Đúng số - Đúng vị trí : 1 Đúng số - Sai vị trí : 1
2156
Đúng số - Đúng vị trí : 1 Đúng số - Sai vị trí : 1
1416
Đúng số - Đúng vị trí : 2 Đúng số - Sai vị trí : 0
5436
Đúng số - Đúng vị trí : 4 Đúng số - Sai vị trí : 0
If các chữ số còn lại có b1 số giống nhau hoặc b2 số giống nhau
Lưu i vào save
EndIf Endif
EndFor While số lần đoán < 7
Chọn ngẫu nhiên 1 số k trong save và đưa ta cho người chơi chọn lưu kếtquả vào a1, b1
If đúng số thì dừng For i trong tập Save
If (i và k không có a1 số chung vị trí)
If các số chữ số còn lại có không có b1 số giống nhau
Loại i khỏi save
Trang 12EndIf Endif
EndFor EndWhile
Demo
- Ví dụ số nghĩ là : 2514 Quá trình đoán số như sau:
Đưa ra số dự đoán đầu tiên
Trang 13Đưa ra số dự đoán thứ 4 và chính xác
7 Bài 7
Đề bài : Chia quà
Trong 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ệmbả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 chiatrá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
Thuật toán:
- Sử dụng thuật toán tham lam để giải quyết bài toán trên
- Ý tưởng của thuật toán:
Đọc tất cả các dữ liệu đầu vào trong mảng 1 chiều
Sắp xếp mảng đó theo giá trị giảm dần của giá trị các quà
Lần lượt đưa các phần quà vào cho Tom và Jerry sao cho hiệu củatổng các giá trị phần quà của Tom và Jerry nhỏ nhất
Công việc tiếp tục quá trình trên cho đến khi nào các phần quà được chia hết cho Tom và Jerry
- Các thuộc tính cần thiết phục vụ cho chương trình: soqua: chứa số phần
quà, giatien[] là mảng 1 chiều chứa các giá trị của các phần quà, tom[] là mảng sẽ chứa các phần quà chia cho Tom, tongtom: tổng các phần quà
mà Tom được chia, jerry[] là mảng chứa các phần quà của jerry,
tongjerry: chứa tổng các phần quà mà jerry được chia.
- Để cài đặt cho bài toán trên, ta xây dựng các các phương thức cần thiết
để giải quyết bài toán:
Phương thức docfile() để đọc dữ liệu đầu vào của bài toán: bao
gồm số phần quà và 1 mảng các giá trị của phần quà
Các phương thức docso() và isnumber() sẽ hỗ trợ cho phương thức docfile() trong việc đọc các dữ liệu đầu vào
Phương thức sapxep() có nhiệm vụ sắp xếp mảng các giá trị của
phần quà theo thứ tự giảm dần
Trang 14 Phương thức show() để in kết quả chia quà ra màn hình
Phương thức chia_qua() là hàm xử lý chính của chương trình, có
nhiệm vụ chia quà cho Tom và Jerrry Hàm sẽ xử lý như sau: ban đầu cho tongtom=0 và tongjerry=0 Cho vòng lặp thực thiện : nếu
tongtom<= tongjerry thì chia phần quà đó cho Tom, ngược lại sẽ
chia cho jerry Thực hiện tương tự cho đến khi hết quà
Demo
8 Bài 8
Đề bài : Tô màu bản đồ
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 15- Sử dụng thuật toán tham lam để giải quyết bài toán nêu trên
- Ý tưởng của thuật toán là:
Cho vòng lặp đi từ nước đầu tiên đến nước cuối cùng
Với mỗi nước ta sẽ tô cùng một màu cho các nước không liền kề với nước đang xét, không được tô màu cho các nước liền kề
Lặp lại quá trình cho đến khi tất cả các nước được tô màu xong
- Các thuộc tính cần thiết cho bài toán bao gồm: sodinh: số đỉnh, socanh:
số cạnh, matrix[][] : mảng 2 chiều lưu trữ dữ liệu đầu vào.
- Để giải quyết bài toán trên, ta sẽ xây dựng các phương thức phục vụ cho
bài toán
Phương thức docfile() dùng để đọc dữ liệu đầu vào của bài toán từ
file, lưu lại số đỉnh, số cạnh và ma trận, với quy ước: matrix[u][v]=1 nếu hai đỉnh u và v liền kề với nhau, ngược lại matrix[u][v]=0
Phương thức ghifile() dùng để ghi kết quả của bài toán ra file trên
đĩa cứng
Phương thức docso() và isnumber() là 2 phương thức phụ hỗ trợ
cho việc đọc dữ liệu từ file
Phương thức color() là phương thức xử lý chính của chương trình,
áp dụng giải thuật tham lam để giải quyết bài toán Bắt đầu từ đỉnh 1, và color=1 để gán cho đỉnh 1 và các đỉnh không liền kề
Trang 16với đỉnh 1, tiếp theo tăng color lên và sẽ tiếp tục tô cho các đỉnh còn lại, cho đến khi nào hết thì dừng lại
Demo
9 Bài 9
Đề bài: Người lá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ằngtạ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
Thuật toán
- Sử dụng thuật toán tìm kiếm sâu để giải quyết bài toán nếu trên Tìm
kiếm sâu là phương pháp tìm kếm mà ưu tiên tìm kiếm những đỉnh xa với đỉnh xuất phát
- Thuật toán tìm kiếm sâu:
1.Cho đỉnh xuất phát vào open
2.Nếu open rỗng thì tìm kiếm thất bại, kết thúc việc tìm kiếm.
3.Lấy đỉnh đầu trong open ra và gọi nó là O Cho O vào closed.
Trang 17 4.Nếu O là đỉnh đích thì tìm kiếm thành công, kết thúc việc tìm
kiếm
5 Tìm tất cả đỉnh con của O không thuộc open và closed cho vào
đầu của open
6.Trở lại bước 2
- Áp dụng cho bài toán trên, ta sẽ xây dựng các lớp để lưu trữ dữ liệu của
bài toán
Lớp State lưu trữ các đối tượng trong bài toán Các đối tượng
trong bài toán gồm có: sói, dê, bắp cải, bác lái đò, thuyền Hàm
construct của lớp sẽ bao gồm tất cả các đối tượng trên: State(bắp
cải, sói, dê, lái đò, thuyền ) Lớp State xây dựng phương thức
getChildren() để lưu tất cả các trạng thái con có thể có của trạng
thái hiện tại, phương thức checkOk() để kiếm tra xem trạng thái
có phù hợp với bài toán hay không?
Lớp Operator bao gồm các trường hợp di chuyển các đối tượng
trong bài toán sao cho phù hợp với yêu cầu của bài toán Có 4 trường hợp có thể có khi di chuyển các đối tượng trong bài toán: bắp cải và bác lái đò qua sông, sói và bác lái đó qua sông, dê và bác lái đò qua sông, bác lái đò qua sông ứng với mỗi trường hợp
sẽ trả về trạng thái mới phù hợp
Lớp nguoilaido là lớp xử lý chính của bài toán, bao gồm 2
List<State> là open và closed để phù hợp với thuật toán tìm kiếm sâu Xác định trạng thái bắt đầu và trạng thái kết thúc của bài
toán Trạng thái bắt đầu sẽ là State(1,1,1,1,0) tương ứng với 1 bắp
cải, 1 sói, 1 dê, 1 bác lái đò và thuyền đang ở bờ bên trái Trạng
thái kết thúc sẽ là State(1,1,1,1,1) tương ứng với 1 bắp cải, 1
sói ,1 dê, 1 bác lái đò và thuyền đang ở bờ bên phải
Cuối cùng áp dụng chính xác các bước trong giải thuật tìm kiếm sâu để giải quyết bài toán trên, kết quả in ra các bước di chuyển đối tượng
Demo