1. Trang chủ
  2. » Luận Văn - Báo Cáo

báo cáo bài tập lớn trí tuệ nhân tạo

19 2 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Phương pháp tìm kiếm lời giải trong không gian trạng thái
Tác giả Ngô Duy Anh
Trường học Học viện Quản lý Giáo dục, Khoa Công nghệ Thông tin
Chuyên ngành Trí Tuệ Nhân Tạo
Thể loại bài tập lớn
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 19
Dung lượng 637 KB

Nội dung

Đường đi của lời giải solution path là một con đường đi qua đồ thị này từ một nút thuộc S đến một nút thuộc GD.Quá trình tìm kiếm lời giải của bài toán được biểu diễn trong không gian tr

Trang 1

HỌC VIỆN QUẢN LÝ GIÁO DỤC

KHOA CÔNG NGHỆ THÔNG TIN

************************

BÁO CÁO BÀI TẬP LỚN

Học phần môn: Trí Tuệ Nhân Tạo

Ngô Duy Anh - 2074802010126

Lớp tín chỉ: K14C – CNTT

Hà Nội – 2023

1

Trang 2

MỤC LỤC

MỤC LỤC 2

PHẦN NỘI DUNG 4

CHƯƠNG 1 PHƯƠNG PHÁP TÌM KIẾM LỜI GIẢI TRONG KHÔNG GIAN TRẠNG THÁI 4 1.1 Tìm kiếm theo chiều rộng 4

1.1.1 Phương pháp 4

1.1.2 Giải thuật 5

1.1.3 Ưu và nhược điểm 6

1.2 Tìm kiếm theo chiều sâu (Depth – First Search) 6

1.2.1 Phương pháp 6

1.2.2 Giải thuật 7

1.2.3 Ưu và nhược điểm 8

1.3 Tìm kiếm sâu dần (Depthwise Search) 8

1.3.1 Phương pháp 8

1.3.2 Giải thuật 8

1.3.3 Nhận xét 9

1.4 Tìm kiếm đường đi có giá thành cực tiểu – thuật toán A 10

1.5 Giải thuật Heuristic – thuật toán A* 11

CHƯƠNG 2 VẬN DỤNG 12

Trang 3

2.1 Áp dụng thủ tục tìm kiếm theo chiều rộng (BFS) 12

2.1.1 Thủ tục tìm kiếm theo chiều rộng (BFS) 12

2.1.2 Áp dụng 13

2.2 Áp dụng thủ tục tìm kiếm Heuristic A* 17

2.2.1 Thủ tục tìm kiếm Heuristic A* 17

2.2.2 Áp dụng 18

Trang 4

PHẦN NỘI DUNG CHƯƠNG 1 PHƯƠNG PHÁP TÌM KIẾM LỜI GIẢI TRONG

KHÔNG GIAN TRẠNG THÁI

Một không gian trạng thái (state space) là một bộ [N, A, S, GD] trong đó:

N (node) là các nút hay trạng thái của đồ thị

A (arc) là tập các cung (hay các liên kết) giữa các nút

S (start) là một tập chứa các trạng thái ban đầu (S ⊂ N ∧ S ≠ ⊘)

GD (Goal Description) chứa các trạng thái đích (S ⊂ N ∧ S ≠ ⊘)

Đường đi của lời giải (solution path) là một con đường đi qua đồ thị này

từ một nút thuộc S đến một nút thuộc GD

Quá trình tìm kiếm lời giải của bài toán được biểu diễn trong không gian trạng thái được xem như quá trình dò tìm trên đồ thị, xuất phát từ trạng ban đầu, thông qua các toán tử chuyển trạng thái, lần lượt đến các trạng thái tiếp theo cho đến khi gặp được trạng thái đích hoặc không còn trạng thái nào có thể tiếp tục được nữa Tuy nhiên, không phải các phương pháp này có thể áp dụng cho tất cả các bài toán Việc chọn phương pháp tìm kiếm cho bài toán cụ thể phụ thuộc nhiều vào đặc trưng của bài toán

Các thủ tục tìm kiếm điển hình bao gồm:

- Tìm kiếm theo chiều rộng (Breadth – First Search - BFS)

- Tìm kiếm theo chiều sâu (Depth – First Search)

- Tìm kiếm sâu dần (Depthwise Search)

- Tìm kiếm cực tiểu hóa giá thành (Cost Minimization Search)

- Tìm kiếm với tri thức bổ sung (Heuristic Search)

1.1 Tìm kiếm theo chiều rộng

Thuật toán duyệt đồ thị ưu tiên chiều rộng (Breadth - First Search - BFS) là một trong những thuật toán tìm kiếm cơ bản và thiết yếu trên đồ thị Mà trong đó, những đỉnh nào gần đỉnh xuất phát hơn sẽ được duyệt trước

Trang 5

Ứng dụng của BFS có thể giúp ta giải quyết tốt một số bài toán trong thời gian và không gian tối thiểu Đặc biệt là bài toán tìm kiếm đường đi ngắn nhất từ một đỉnh gốc tới tất cả các đỉnh khác Trong đồ thị không có trọng số hoặc tất cả trọng số bằng nhau, thuật toán sẽ luôn trả ra đường đi ngắn nhất có thể Ngoài ra, thuật toán này còn được dùng để tìm các thành phần liên thông của đồ thị, hoặc kiểm tra đồ thị hai phía,… Thuật toán tìm kiếm theo chiều rộng sử dụng một danh sách để chứa những đỉnh đang “chờ” thăm Tại mỗi bước, ta thăm một đỉnh đầu danh sách, loại nó ra khỏi danh sách và cho những đỉnh kề với nó chưa được thăm xếp hàng vào cuối danh sách Thuật toán sẽ kết thúc khi danh sách rỗng

1.1.2 Giải thuật

Input:

Cây/Đồ thị G = (V,E) với đỉnh gốc là n0 (trạng thái đầu)

Tập đích DICH

Output:

Một đường đi p từ n0 đến một đỉnh n* DICH ∈

Method:

Sử dụng hai danh sách hoạt động theo nguyên tắc FIFO (queue) MO và DONG

Procedure BrFS; (Breadth First Search)

Begin

Append(MO, no)

DONG = null;

While MO ≠ null do

Begin

n := Take(MO);

If n DICH then exit; ∈ Append(DONG, n);

For m T(n) and m DONG + MO do ∈ ∉ Append(MO, m);

End;

Write (‘Không có lời giải’);

End;

Trang 6

Thủ tục Append(MO,n0) bổ sung một phần tử vào queue MO

Chú ý:

Hàm Take(MO) lấy một phần tử trong queue MO

Nếu G là cây thì không cần dùng danh sách DONG

1.1.3 Ưu và nhược điểm

Ưu điểm

Kỹ thuật tìm kiếm rộng là kỹ thuật vét cạn không gian trạng thái bài toán vì vậy

sẽ tìm được lời giải nếu có

Đường đi tìm được đi qua ít đỉnh nhất

Nhược điểm

Tìm kiếm lời giải theo thuật toán đã định trước, do vậy tìm kiếm một cách máy móc; khi không có thông tin hổ trợ cho quá trình tìm kiếm, không nhận ra ngay lời giải

Không phù hợp với không gian bài oán kích thước lớn Đối với loại bài toán này, phương pháp tìm rộng đối mặt với các nhu cầu:

Cần nhiều bộ nhớ theo số nút cần lưu trữ

Cần nhiều công sức xử lý các nút, nhất là khi các nhánh cây dài, số nút tăng

Dễ thực hiện các thao tác không thích hợp, thừa, đưa đến việc tăng đáng kể số nút phải xử lý

Không hiệu quả nếu lời giải ở sâu Phương pháp này không phù hợp cho trường hợp có nhiều đường dẫn đến kết quả nhưng đều sâu

Giao tiếp với người dùng không thân thiện Do duyệt qua tất cả các nút, việc tìm kiếm không tập trung vào một chủ đề

1.2 Tìm kiếm theo chiều sâu (Depth – First Search)

Tìm kiếm sâu trong không gian bài toán được bắt đầu từ một nút rồi tiếp tục cho đến khi hoặc đến ngõ cụt hoặc đến đích Tại mỗi nút có luật trong tài, chẳng hạn, “đi theo nút cực trái”, hướng dẫn việc tìm Nếu không đi tiếp được, gọi là đến ngõ cụt, hệ

Trang 7

thống quay lại một mức trên đồ thị và tìm theo hướng khác, chẳng hạn, đến nút “sát nút cực trái” Hành động này gọi là quay lui

Thuật toán tìm kiếm theo chiều sâu được hình dung như việc khảo sát một cây bắt đầu từ gốc đi theo mọi cành có thể được, khi gặp cành cụt thì quay lại xét cành chưa đi qua

Ở bước tổng quát, giả sử đang xét đỉnh i, khi đó các đỉnh kề với i có các trường hợp:

Nếu tồn tại đỉnh j kề i chưa được xét thì xét đỉnh này (nó trở thành đỉnh

đã xét) và bắt đầu từ đó tiếp tục quá trình tìm ki ếm với đỉnh này Nếu với mọi đỉnh kề với i đều đã được xét thì i coi nh ư duyệt xong và quay trở lại tìm kiếm từ đỉnh mà từ đó ta đi đến được i

1.2.2 Giải thuật

Input:

Cây/Đồ thị G = (V, E) với đỉnh gốc là n0 (trạng thái đầu)

Tập đích DICH

Output:

Một đường đi p từ n0 đến một đỉnh n* DICH∈

Method:

Sử dụng hai danh sách hoạt động theo nguyên tắc LIFO (Stack) MO và DONG

Procedure DFS; (Depth First Search)

Begin

Push (MO, n0)

DONG = null;

While MO ≠ null do

Begin

n := pop (MO);

If n DICH then exit; ∈ Push (DONG, n);

For m T(n) and m DONG + MO do ∈ ∉ Push (MO, m);

Trang 8

End;

Write (‘Không có lời giải’);

End;

Chú ý: Thủ tục Push(MO, n0) thực hiện việc bổ sung n0 vào stack MO

Hàm Pop(MO) lấy phần tử đầu tiên trong Stack MO

Ưu điểm

Nếu bài toán có lời giải, phương pháp tìm kiếm sâu bảo đảm tìm ra lời giải

Kỹ thuật tìm kiếm sâu tập trung vào đích, con người cảm thấy hài lòng khi các câu hỏi tập trung vào vấn đề chính

Do cách tìm của kỹ thuật này, nếu lời giải ở rất sâu, kỹ thuật tìm sâu s ẽ tiết kiệm thời gian

Nhược điểm

Tìm sâu khai thác không gian bài toán để tìm lời giải theo thu ật toán đơn giản một cách cứng nhắc Trong quá trình tìm nó không có thông tin nào hổ trợ để phát hiện lời giải Nếu chọn nút ban đầu không thích hợp có thể không dẫn đến đích của bài toán

Không phù hợp với không gian bài toán lớn, kỹ thuật tìm kiếm sâu có th ể không đến lời giải trong khoảng thời gian vừa phải

1.3 Tìm kiếm sâu dần (Depthwise Search)

Kỹ thuật tìm kiếm sâu dần là thực hiện việc tìm kiếm với độ sâu ở mức giới hạn

d nào đó Nếu không tìm ra nghiệm ta tăng độ sâu lên d + 1 và lại tìm kiếm theo độ sâu tới mức d + 1 Quá trình trên được lặp lại với d lần lượt là 1, 2, đến độ sâu max nào

đó

Kỹ thuật tìm kiếm sâu dần thường được thực hiện khi cây tìm kiếm chứa nhánh

vô hạn, và nếu sử dụng tìm kiếm theo độ sâu ta có thể mắc kẹt ở một nhánh nào đó (thuật toán không dừng) và không tìm ra nghiệm

Trang 9

1.3.2 Giải thuật

Thuật toán tìm kiếm sâu dần sử dụng thuật toán tìm kiếm sâu hạn chế như thủ tục con Đó là thủ tục tìm kiếm theo chiều sâu nhưng chỉ tới độ sâu d nào đó rồi quay lên

Thủ tục tìm kiếm sâu hạn chế (depth_limitedsearch) {d là tham số độ sâu} Procedure Depth_limited_search(d);

Begin

Push (MO, n0);

Depth(n0) = 0; {hàm depth ghi lại độ sâu mỗi đỉnh}

DONG = null;

While MO ≠ null do

Begin

n := pop (MO);

If n DICH then exit; ∈ Push (DONG, n);

If depth(n) <= d then For m T(n) and m DONG do∈ ∉ begin

Push (MO, m);

depth(m) = depth(n)+1;

End;

End;

Write(‘Không có lời giải’);

End

Thuật toán tìm kiếm sâu dần (Deep_deepening_search) sẽ sử dụng thủ tục tìm kiếm sâu hạn chế như thủ tục con:

Procedure Depth_deepening_search;

Begin

For d := 0 to max do

Depth_limited_search(d);

If thành công then exit;

End;

Trang 10

1.3.3 Nhận xét

- Luôn tìm ra nghiệm (nếu bài toán có nghiệm), miễn là chọn max đủ lớn (giống như tìm kiếm theo chiều rộng)

- Có độ phức tạp thời gian là O(kd) (giống tìm kiếm rộng)

- Có độ phức tạp không gian là O(k*d) (giống tìm kiếm sâu)

- Giải thuật tìm kiếm sâu dần thương áp dụng cho các bài toán có không gian trạng thái lớn và độ sâu của nghiệm không biết trước

1.4 Tìm kiếm đường đi có giá thành cực tiểu – thuật toán A

Tìm đường đi từ đỉnh n0 > nk DICH sao cho g(nk) = min{g(n) | n DICH}lúc ∈ ∈

đó ta có:

g(n0) = 0

g(m) = min {g(n) + c(n,m)}

Dùng 2 danh sách MO, DONG như trên Tại mỗi thời điểm chọn đỉnh n trong

MO ra xét là đỉnh thoả

Thuật toán AT

Input:

Đồ thị G = (V,E), Đỉnh xuất phát n0

Hàm chi phí c: E → R+

c(i,j): xác định chi phí chuyển từ đỉnh i sang đỉnh j với (i,j) E ∈ Tập các đỉnh đích DICH

Output:

Đường đi từ đỉnh n0 đến đỉnh n* DICH sao cho g(n*) = c(p) = ∈ min{g(n)| n DICH} ∈

Procedure AT;

{ Dùng g0(n) là chi phí cực tiểu của đường đi từ đỉnh xuất phát đến đỉnh n tại thời điểm đang xét và xem như hàm g}

Begin

g(n0) := 0;

Push(MO, n0);

While MO ≠ null do

Trang 11

Begin

g(n) := min g(m) m MO ∈

If n DICH then∈ exit {xay dung duong di cuc tieu}

Push(DONG, n);

If T(n) ≠ null then For m T(n) do ∈

If m MO + DONG then ∉ Begin

Push(MO, m);

g(m) := g(n) + c(n, m); cha(m):=n;

End else if g(m) >g(n)+c(n,m) then Begin

g(m) := g(n) + c(n, m); cha(m) := n;

End;

End;

Writeln(‘Khong co duong di’);

End;

1.5 Giải thuật Heuristic – thuật toán A*

Input:

- Đồ thị G = (V, E) với đỉnh gốc no

- Hàm chi phí c: E → R*

- c(i, j): xác định chi phí chuyển từ đỉnh i sang đỉnh j với (i, j) E ∊

- h: V → R*; h(n) xác định dự đoán chi phí tối ưu của đường đi từ đỉnh n đến đích

- Tập các đỉnh đích DICH

Trang 12

Ouput:

- Đường đi từ đỉnh no đến đỉnh nk DICH ∊

Thủ tục:

{

push (MO, no);

g(no):= 0;

while MO ≠ null do

{

f(n):= min f(m);

if n DICH then exit (‘Xay duong di cuc tieu’); ∊

push (DONG, n);

if T(n) <> null then

for m T(n) do ∊

if m MO + DONG then ∉

push (MO, m);

tính f(m);

cha(m):= n;

else

if fmới(m) > fcũ(n) then fmới(m) = fcũ(m);

cha(m):= n;

}

Write (‘Khong thanh cong’);

}

CHƯƠNG 2 VẬN DỤNG

2.1 Áp dụng thủ tục tìm kiếm theo chiều rộng (BFS)

2.1.1 Thủ tục tìm kiếm theo chiều rộng (BFS)

Thủ tục BrFS; (Breadth First Search)

Trang 13

Begin

Append(MO, no)

DONG = null;

While MO ≠ null do

Begin

n:= Take(MO);

If n DICH then exit; ∈ Append(DONG, n);

For m T(n) and m DONG + MO do ∈ ∉ Append(MO, m);

End;

Write (‘Không có lời giải’);

End;

Bài toán: Có 3 bình Một bình có dung tích 3l, một bình có dung tích 5l, một bình có dung tích 9l Ban đầu 3 bình đều đầy Chỉ được thực hiện các thao tác: đổ nước

từ một bình ra, đổ nước vào 1 bình, đổ nước từ bình nọ sang bình kia Hãy tìm lộ trình

đẻ bình dung tích 9l có 7l nước

Hãy biểu diễn bài toán và áp dụng thỉ tục BFS, tìm kiếm lời giải của bài toán đong nước trên

Giải Trạng thái của bài toán là các bộ ba có dạng (a,b,c)

Trong đó:

a là số lít nước có trong bình a

b là số lít nước có trong bình b

c là số lít nước có trong bình c

Trạng thái đầu: (3,5,9)

Trạng thái đích: (a,b,7)

Trang 14

Các toán tử: đổ nước từ một bình ra; đổ nước vào 1 bình; đổ nước từ bình nọ sang bình kia

(3,5,9)

(0,5,9) (0,0,9) (0,5,0) (3,5,6) (3,2,9) (3,0,9) (3,5,0) (3,5,9) (0,5,9)

(3,0,9) (0,0,9) (0,5,0) (3,5,6) (3,2,9) (3,0,0) (0,3,9)

(3,5,0) (0,0,9) (0,5,0) (3,5,6) (3,2,9) (3,0,0) (0,3,9)

(3,5,4) (0,5,3) (3,0,5) (3,5,9) (0,5,9) (3,0,9) (3,5,0)

(0,0,9) (0,0,0) (3,0,6) (0,5,4) (0,5,0) (3,5,6) (3,2,9)

(3,0,0) (0,3,9) (3,5,4) (0,5,3) (3,0,5) (3,5,9) (0,5,9) (3,0,9) (3,5,0) (0,0,9)

(0,,5,0) (0,0,0) (3,0,6) (0,5,4) (3,2,0) (0,0,5) (3,5,6)

(3,2,9) (3,0,0) (0,3,9) (3,5,4) (0,5,3) (3,0,5)

(3,5,9) (0,5,9) (3,0,9) (3,5,0) (0,0,9)

(0,5,0)

(3,5,6)

(0,0,0) (3,0,6) (0,5,4) (3,2,0) (0,0,5) (0,5,6)

(3,0,6) (3,2,9) (3,0,0) (0,3,9) (3,5,4) (0,5,3)

(3,0,5)

(3,5,9) (0,5,9) (3,0,9) (3,5,0) (0,0,9) (0,5,0) (3,5,6)

(3,2,9)

(0,0,0) (3,0,6) (0,5,4) (3,2,0) (0,0,5) (0,5,6)

(3,0,6) (0,2,9) (3,0,9) (3,0,0) (0,3,9) (3,5,4)

(0,5,3) (3,0,5)

(3,5,9) (0,5,9) (3,0,9) (3,5,0) (0,0,9) (0,5,0) (3,5,6) (3,2,9)

(3,0,0)

(0,0,0) (3,0,6) (0,5,4) (3,2,0) (0,0,5) (0,5,6)

(3,0,6) S(0,2,9) (3,0,9) (0,3,0) (0,0,3) (0,3,9)

(3,5,4) (0,5,3) (3,0,5)

(3,5,9) (0,5,9) (3,0,9) (3,5,0) (0,0,9) (0,5,0) (3,5,6) (3,2,9) (3,0,0)

(0,3,9)

(0,0,0) (3,0,6) (0,5,4) (3,2,0) (0,0,5) (0,5,6)

(3,0,6) (0,2,9) (3,0,9) (0,3,0) (0,0,3) (3,3,9)

(3,3,6) (0,5,7) (3,5,4) (0,5,3) (3,0,5)

(3,5,9) (0,5,9) (3,0,9) (3,5,0) (0,0,9) (0,5,0) (3,5,6) (3,2,9) (3,0,0) (0,3,9)

Trang 15

(0,0,0) (3,0,6) (0,5,4) (3,2,0) (0,0,5) (0,5,6)

(3,0,6) (0,2,9) (3,0,9) (0,3,0) (0,0,3) (3,3,9)

(3,3,6) (0,5,7) (0,5,3) (3,0,5)

(3,5,9) (0,5,9) (3,0,9) (3,5,0) (0,0,9) (0,5,0) (3,5,6) (3,2,9) (3,0,0) (0,3,9)

(3,5,4)

(0,5,3)

(0,0,0) (3,0,6) (0,5,4) (3,2,0) (0,0,5) (0,5,6)

(3,0,6) (0,2,9) (3,0,9) (0,3,0) (0,0,3) (3,3,9)

(3,3,6) (0,5,7) (3,0,5)

(3,5,9) (0,5,9) (3,0,9) (3,5,0) (0,0,9) (0,5,0) (3,5,6) (3,2,9) (3,0,0) (0,3,9) (3,5,4) (0,5,3)

(3,0,5)

(0,0,0) (3,0,6) (0,5,4) (3,2,0) (0,0,5) (0,5,6)

(3,0,6) (0,2,9) (3,0,9) (0,3,0) (0,0,3) (3,3,9)

(3,3,6) (0,5,7)

(3,5,9) (0,5,9) (3,0,9) (3,5,0) (0,0,9) (0,5,0) (3,5,6) (3,2,9) (3,0,0) (0,3,9) (3,5,4) (0,5,3) (3,0,5)

(0,0,0)

(3,0,6) (0,5,4) (3,2,0) (0,0,5) (0,5,6) (3,0,6)

(0,2,9) (3,0,9) (0,3,0) (0,0,3) (3,3,9) (3,3,6)

(0,5,7)

(3,5,9) (0,5,9) (3,0,9) (3,5,0) (0,0,9) (0,5,0) (3,5,6) (3,2,9) (3,0,0) (0,3,9) (3,5,4) (0,5,3) (3,0,5) (0,0,0)

(3,0,6) (0,5,4) (3,2,0) (0,0,5) (0,5,6) (3,0,6) (0,2,9)

(3,0,9) (0,3,0) (0,0,3) (3,3,9) (3,3,6) (0,5,7)

(3,5,9) (0,5,9) (3,0,9) (3,5,0) (0,0,9) (0,5,0) (3,5,6) (3,2,9) (3,0,0) (0,3,9) (3,5,4) (0,5,3) (3,0,5) (0,0,0) (3,0,6)

(0,5,4) (3,2,0) (0,0,5) (0,5,6) (3,0,6) (0,2,9) (3,0,9)

(0,3,0) (0,0,3) (3,3,9) (3,3,6) (0,5,7)

(3,5,9) (0,5,9) (3,0,9) (3,5,0) (0,0,9) (0,5,0) (3,5,6) (3,2,9) (3,0,0) (0,3,9) (3,5,4) (0,5,3) (3,0,5) (0,0,0) (3,0,6)

(0,5,4)

(3,2,0) (0,0,5) (0,5,6) (3,0,6) (0,2,9) (3,0,9) (0,3,0)

(0,0,3) (3,3,9) (3,3,6) (0,5,7)

(3,5,9) (0,5,9) (3,0,9) (3,5,0) (0,0,9) (0,5,0) (3,5,6) (3,2,9) (3,0,0) (0,3,9) (3,5,4) (0,5,3) (3,0,5) (0,0,0) (3,0,6) (0,5,4) (3,2,0)

(0,0,5) (0,5,6) (3,0,6) (0,2,9) (3,0,9) (0,3,0) (0,0,3)

(3,3,9) (3,3,6) (0,5,7)

(3,5,9) (0,5,9) (3,0,9) (3,5,0) (0,0,9) (0,5,0) (3,5,6) (3,2,9) (3,0,0) (0,3,9) (3,5,4) (0,5,3) (3,0,5) (0,0,0) (3,0,6) (0,5,4) (3,2,0) (0,5,0) (0,5,6) (3,0,6) (0,2,9) (3,0,9) (0,3,0) (0,0,3) (3,3,9)

(3,3,6) (0,5,7)

(3,5,9) (0,5,9) (3,0,9) (3,5,0) (0,0,9) (0,5,0) (3,5,6) (3,2,9) (3,0,0) (0,3,9)

Ngày đăng: 14/05/2024, 21:48

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w