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

Luận văn thạc sĩ bài toán cấu trúc chuỗi nguồn

55 33 0

Đ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

Định dạng
Số trang 55
Dung lượng 1,61 MB
File đính kèm Bài toán cấu trúc chuỗi nguồn.rar (2 MB)

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Tin sinh học là một lĩnh vực khoa học liên ngành, trong đó sinh học phân tử và tin học đóng vai trò chủ đạo. Sinh học làm môi trường dữ liệu cơ sở, trên đó xây dựng và hoàn thiện các chương trình xử lý dữ liệu ứng dụng làm công cụ hỗ trợ hiệu quả cho việc nghiên cứu, thu nhận và sản xuất ra các sản phẩm sinh học mong muốn khác nhau phục vụ đời sống con người…Về cơ bản, tin sinh học tập trung vào nghiên cứu và áp dụng các phương pháp cũng như các kĩ thuật trong tin học để giải quyết các bài toán trong sinh học phân tử. Tin sinh học có tính ứng dụng cao trong cuộc sống, đặc biệt trong lĩnh vực ydược và trong lĩnh lực di truyền. Di truyền là hiện tượng chuyển những tính trạng của cha mẹ cho con cái thông qua gen của bố mẹ. Trong sinh học, di truyền chuyển những đặc trưng sinh học từ một sinh vật cha mẹ đến con cái và nó đồng nghĩa với di chuyển, gen thừa nhận mang thông tin sinh học. Chính vì vậy mà ngày nay khi xã hội càng ngày càng phát triển, con người càng có nhu cầu tìm hiểu về nguồn gốc của mình và tổ tiên xa xưa của chúng ta. Bài toán cấu trúc chuỗi nguồn là một bài toán cho các thông tin ở dạng một chuỗi của các nhiễm sắc thể hiện tại, và tìm ra được các thông tin về nhiễm sắc thể của tổ tiên. Đó là một bài toán lớn trong sinh học, hiện nay đang được rất nhiều người quan tâm và nghiên cứu. Đã có nhiều thuật toán nghiên cứu và công bố giải quyết bài toán cấu trúc chuỗi nguồn để tìm ra được các thông tin di truyền. Trong luận văn này, tôi sẽ trình bày khảo cứu lại các phương pháp giải quyết bài toán cấu trúc chuỗi nguồn. Tôi khảo cứu và cài đặt lại thuật toán RecBlock được Andrea Roli and Christian Blum đề xuất năm 2009 là một thuật toán hoàn chỉnh nhất để giải bài toán cấu trúc chuỗi nguồn. Sử dụng ý tưởng xây dựng lời giải của RecBlock, trong luận văn chúng tôi đã đề xuất một thuật toán mới đó là thuật toán tối ưu đàn kiến Ant colony optimization (ACO) để giải quyết bài toán cấu trúc chuỗi nguồn mục đích để tìm ra được chuỗi nhiễm sắc thể của tổ tiên dựa trên số lần lai ghép là ít nhất. Đây là thuật toán mới và lần đầu tiên được đưa vào để giải bài toán cấu trúc chuỗi nguồn. Luận văn còn cài đặt với các thuật toán cập nhật mùi khác nhau trong thuật toán ACO. Tuy nhiên vì không gian tìm kiếm rộng nên kết quả chưa tối ưu bằng thuật toán RecBlock, nhưng trong thực nghiệm đã chỉ ra được với ACO giải quyết được với những bài toán có bộ dữ liệu lớn, còn RecBlock chỉ giải được với những bài toán có bộ dữ liệu nhỏ.

Trang 1

LỜI CẢM ƠN

Trước hết, tôi xin gửi lời biết ơn sâu sắc đến hai người thầy TS Đỗ Đức Đông vàthầy PGS.TS Hoàng Xuân Huấn, hai thầy đã dành rất nhiều thời gian và tâm huyếthướng dẫn nghiên cứu và giúp tôi hoàn thành tốt luận văn tốt nghiệp này Thầy đã mở

ra cho tôi những vấn đề khoa học rất lý thú, định hướng nghiên cứu các lĩnh vực hếtsức thiết thực và vô cùng bổ ích, đồng thời tạo điều kiện thuận lợi tốt nhất cho tôi họctập và nghiên cứu

Tôi cũng xin được bày tỏ lòng biết ơn tới các thầy cô trường Đại học Công nghệ

đã tham gia giảng dạy và chia sẻ những kinh nghiệm quý báu cho tập thể và cá nhântôi nói riêng Tôi xin cảm ơn tới các thầy và các anh chị đã thường xuyên giúp đỡ, traođổi, góp ý về những vấn đề khoa học liên quan tới luận văn

Cuối cùng tôi cũng bày tỏ lòng biết ơn về sự giúp đỡ của các anh, chị em đồngnghiệp trong Bộ môn Tin học trường Đại học Công Đoàn, cơ quan nơi tôi công tác đãtạo điệu kiện tốt nhất cho tôi về thời gian cũng như động viên tôi sớm hoàn thành bàiluận văn

Một lần nữa, tôi xin chân thành cảm ơn!

Hà Nội, tháng 6 năm 2019.

Học viên

Lê Thị Hào

Trang 2

LỜI CAM ĐOAN

Những kiến thức trình bày trong luận văn là do tôi tìm hiểu, nghiên cứu và trìnhbày lại theo cách hiểu Trong quá trình làm luận văn tôi có tham khảo các tài liệu cóliên quan và đã ghi rõ nguồn tài liệu tham khảo đó Tôi xin cam đoan đây là công trìnhnghiên cứu của tôi và không sao chép của bất kỳ ai

Hà Nội, tháng 6 năm 2019.

Học viên

Lê Thị Hào

Trang 3

MỤC LỤC

Trang 4

STT Từ viết tắt Từ hoặc cụm từ

1

(Tối ưu hóa đàn kiến)2

(Hệ kiến AS)3

(Hệ kiến ACS)4

5

(Hệ kiến MMAS)6

(Hệ kiến MMAS trơn)7

(Hệ kiến đa mức 3-LAS)8

TSP Travelling Salesman Problem

(Bài toán người chào hàng)9

Trang 5

DANH MỤC CÁC BẢNG BIỂU

Trang 6

và áp dụng các phương pháp cũng như các kĩ thuật trong tin học để giải quyết các bàitoán trong sinh học phân tử Tin sinh học có tính ứng dụng cao trong cuộc sống, đặcbiệt trong lĩnh vực y-dược và trong lĩnh lực di truyền.

Di truyền là hiện tượng chuyển những tính trạng của cha mẹ cho con cái thôngqua gen của bố mẹ Trong sinh học, di truyền chuyển những đặc trưng sinh học từ mộtsinh vật cha mẹ đến con cái và nó đồng nghĩa với di chuyển, gen thừa nhận mangthông tin sinh học

Chính vì vậy mà ngày nay khi xã hội càng ngày càng phát triển, con người càng

có nhu cầu tìm hiểu về nguồn gốc của mình và tổ tiên xa xưa của chúng ta Bài toáncấu trúc chuỗi nguồn là một bài toán cho các thông tin ở dạng một chuỗi của cácnhiễm sắc thể hiện tại, và tìm ra được các thông tin về nhiễm sắc thể của tổ tiên Đó làmột bài toán lớn trong sinh học, hiện nay đang được rất nhiều người quan tâm vànghiên cứu

Đã có nhiều thuật toán nghiên cứu và công bố giải quyết bài toán cấu trúc chuỗinguồn để tìm ra được các thông tin di truyền

Trong luận văn này, tôi sẽ trình bày khảo cứu lại các phương pháp giải quyết bàitoán cấu trúc chuỗi nguồn Tôi khảo cứu và cài đặt lại thuật toán RecBlock đượcAndrea Roli and Christian Blum đề xuất năm 2009 là một thuật toán hoàn chỉnh nhất

để giải bài toán cấu trúc chuỗi nguồn Sử dụng ý tưởng xây dựng lời giải củaRecBlock, trong luận văn chúng tôi đã đề xuất một thuật toán mới đó là thuật toán tối

ưu đàn kiến Ant colony optimization (ACO) để giải quyết bài toán cấu trúc chuỗinguồn mục đích để tìm ra được chuỗi nhiễm sắc thể của tổ tiên dựa trên số lần lai ghép

là ít nhất Đây là thuật toán mới và lần đầu tiên được đưa vào để giải bài toán cấu trúcchuỗi nguồn Luận văn còn cài đặt với các thuật toán cập nhật mùi khác nhau trongthuật toán ACO Tuy nhiên vì không gian tìm kiếm rộng nên kết quả chưa tối ưu bằngthuật toán RecBlock, nhưng trong thực nghiệm đã chỉ ra được với ACO giải quyếtđược với những bài toán có bộ dữ liệu lớn, còn RecBlock chỉ giải được với những bàitoán có bộ dữ liệu nhỏ

Trang 7

Ngoài phần kết luận, cấu trúc nội dung của luận văn bao gồm:

Chương 1: Trình bày sơ lược các khái niệm sinh học, phát biểu bài toán cấu trúcchuỗi nguồn Giới thiệu một vài thuật toán giải quyết bài toán, trình bày lại thuật toánRecBlock và thuật toán Back-and-Forth Iterated Greedy

Chương 2: Giới thiệu thuật toán Ant colony optimization (ACO) và một vài thuậttoán cập nhật mùi khác nhau trong ACO Ví dụ về bài toán người chào hàng giải quyếtbằng thuật toán ACO

Chương 3: Đề xuất thuật toán mới, đó là thuật toán ACO để giải quyết bài toáncấu trúc chuỗi nguồn Đưa ba quy tắc cập nhật mùi khác nhau đó là ACS, MMAS,SMMAS để giải quyết bài toán

Chương 4: Đưa ra kết quả thực nghiệm của luận văn, so sánh kết quả của thuậttoán ACO với các quy tắc cập nhật mùi khác nhau, so sánh kết quả thực nghiệm với sốvòng lặp khác nhau và so sánh kết quả của thuật toán ACO với thuật toán RecBlock,đưa ra kết quả thực nghiệm với bộ dữ liệu lớn hơn

Trang 8

CHƯƠNG I BÀI TOÁN CẤU TRÚC CHUỖI NGUỒN (FOUNDER SEQUENCES RECONSTRUCTION PROBLEM)1.1. Một số khái niệm trong di truyền học

1.1.1. Một số khái niệm về di truyền

Di truyền: là hiện tượng chuyển những tính trạng của cha mẹ cho con cái thông

qua gen của bố mẹ Trong sinh học, di truyền chuyển những đặc trưng sinh học từ mộtsinh vật cha mẹ đến con cái và nó đồng nghĩa với di chuyển gen, gen thừa nhận mangthông tin sinh học (hay thông tin di truyền)

Thông tin di truyền: là các thông tin được mã hóa trong các bộ nucleotide, được

di truyền từ thế hệ này sang thế hệ khác ở cấp độ phân tử thông qua các hoạt độngnhân đôi DNA

Phép lai tạo: là quá trình hình thành NST mới trên cơ sở NST cha mẹ bằng cách

ghép một hay nhiều đoạn gen của hai hay nhiều NST cha mẹ với nhau

Alen: các dạng khác nhau của một gen (không cùng xảy ra) nằm tại cùng một vị

trí xác định trên một nhiễm sắc thể cụ thể

Tương tác giữa các gen alen là tương tác giữa trạng thái khác nhau của cùng một

gen tồn tại trên một vị trí nhất định của cặp nhiễm sắc thể tương đồng

Ví dụ 1: Lai giữa hai giống hoa (màu sắc hoa)

Quy ước: A- màu đỏ, a- màu trắng (A là trội hoàn toàn so với a)

Ptc: Hoa đỏ (AA) x Hoa trắng (aa)

F1: Hoa hồng (Aa)

Tương tác giữa các gen không alen là tương tác giữa các trạng thái khác nhau

của cặp gen, mỗi gen nằm trên các vị trí khác nhau, có thể nằm trên cùng một nhiễmsắc thể hoặc trên các cặp nhiễm sắc thể tương đồng khác nhau

Ví dụ 2: Ví dụ: Lai giữa hai giống hoa (màu sắc hoa)

Quy ước: A-B-: Màu đỏ; A- bb-, aaB-, aabb: Màu trắng

Ptc: Hoa đỏ (AABB) x Hoa trắng (aabb)

Trang 9

DNA tái tổ hợp: là phân tử DNA được tạo thành từ hai hay nhiều trình tự DNA

của các loài sinh vật khác nhau Trong kỹ thuật di truyền, DNA tái tổ hợp thường làđược tạo thành từ việc gắn những đoạn DNA có nguồn gốc khác nhau vào trong vectơtách dòng Những vectơ tách dòng mang DNA tái tổ hợp này có thể biểu hiện thànhcác protein tái tổ hợp trong các sinh vật

Hình 1.1 Hình ảnh về tái tổ hợp1.1.2. Nhiễm sắc thể và gien

Nhiễm sắc thể là một cấu trúc có tổ chức trong tế bào chứa hai loại thông tintrình tự DNA và các protein histone có nhiệm vụ kết hợp/đóng gói và điều khiển cácchức năng của trình tự DNA

Tập hợp tất cả các nhiễm sắc thể của một sinh vật được gọi là hệ gien của sinhvật Hệ gien sẽ mang toàn bộ thông tin di truyền quyết định đến chức năng và đặcđiểm của sinh vật Một hệ gien có thể chứa nhiều gien khác nhau Ví dụ hệ gien ngườichứa khoảng 25 nghìn gien khác nhau Hai hệ gien của hai cá thể của cùng một loàithường rất giống nhau Sự khác nhau giữa hệ gien của hai cá thể sẽ tạo ra sự khác nhaugiữa hai cá thể đó

Trang 10

Hình 1.2 Hệ gien người gồm 23 cặp nhiễm sắc thể1.1.3. Quá trình đột biến DNA

Theo thuyết tiến hóa của Darwin thì các loài sinh vật đều tiến hóa từ một tổ tiênchung (Hình 1.5) Hệ gien của các sinh vật bị biến đổi theo thời gian trong quá trìnhtiến hóa dưới tác động của nhiều yếu tố khác nhau và có thể dẫn đến việc tạo ra cácloài sinh vật mới

Hình 1.3 Minh họa quá trình tiến hóa của các loài từ một tổ tiên chung

Hai trình tự tương đồng:

Trang 11

Hai trình tự DNA của hai sinh vật khác nhau gọi là tương đồng nếu như chúngcùng tiến hóa từ một trình tự DNA tổ tiên chung

Quá trình đột biến của các trình tự DNA: Trong quá trình tiến hóa, các nucleotittrên trình tự DNA có thể bị đột biến Ba phép đột biến là: đột biến thay thế, đột biếnmất, đột biến thêm

Hình 1.4 Quá trình đột biến giữa hai trình tự DNA

Hình 1.6 minh họa quá trình đột biến của hai trình tự X = “AGGTGGT” và Y =

“ACGGTGG” từ một trình tự DNA tổ tiên chung XY = “ACGGTGGT”

Các phép đột biến trên trình tự DNA trong quá trình tiến hóa sẽ làm cho hệ giencủa các loài sinh vật khác nhau cả về nội dung cũng như độ dài Các cá thể của cùngmột loài (ví dụ hai người) cũng có hệ gien khác nhau Tuy nhiên, sự khác biệt giữa hệgien của hai người vào khoảng 0.1% Chính sự khác biệt 0.1% này tạo ra sự khác biệtgiữa hai người khác nhau

1.1.4. Khái quát về các Haplotype được tạo từ các tái tổ hợp

Một haplotype của n vị trí là một chuỗi các nucleotide kích thước m Nó mô hìnhmột đoạn nhiễm sắc thể với sự đa hình do sự thay thế nucleotide, được gọi là đa hìnhđơn nucleotide (SNP) SNPs trong một quần thể chỉ có hai nucleotide được quan sátthấy ở mỗi vị trí: các alen của tổ tiên và alen mới (nguồn gốc)

Sự đa dạng của một Haplotype đại diện giống như một chuỗi các vị trí đa hìnhđơn trong trình tự DNA [12] Trong quá trình tái tổ hợp các vị trí tăng lên theo cấp sốnhân Để tìm ra nguyên nhân của việc tái tổ hợp thì nó được so sánh với các vị trí đahình và là vô cùng khó Tuy nhiên trong bộ gen của người mỗi Haplotype đều đa dạng

và có những Haplotype chiếm ưu thế dùng để đại diện cho việc tìm ra những

Trang 12

Haplotype tổ tiên Khoảng cách giữa các thể hệ có thể giảm vì có thể tiến hành thựchiện xây dựng.

Một sự tái tổ hợp giữa hai haplotype X và Y có thể được mô hình hóa như mộthoạt động phá vỡ và trao đổi các phần đối diện của X và Y Tức là nó là hoạt động củadạng: X5X3, Y5Y3→ X5Y3, Y5X3 với X = X5X3, Y = Y5Y3 (biểu thị 5 và 3 là các phânđoạn của X và Y và X5, Y5 cũng như Y3, X3 có độ dài là giống nhau

Trong mô hình của con người, chỉ có một trong các haplotype kết quả đượctruyền đi Vì vậy, một sự tái tổ hợp có thể được biểu diễn như X, Y → Z, Z là 1 tái tổhợp

Cho C = {C1 C2, …, Ch} là một tập các Haplotype chung và R là một tái tổ hợpmới Vấn đề là phải tìm một lộ trình tái tổ hợp tối thiểu (tối thiểu của chuỗirecombinations) tạo ra từ một tập hợp con CR của C Một tái tổ hợp X, Y → Z trong 1

lộ trình như sau: X and/or Y trong CR hoặc được tạo từ tái tổ hợp trước đó của cácphần tử CR

R là alen với C nếu và chỉ nếu, cho vị trí bất kỳ i trong R, có tồn tại mộthaplotype Ck của C như vậy mà R [i] = Ck [i] Ở đây, cho bất kỳ haplotype X, X[i]biểu thị phần tử i – th của X Ví dụ, các haplotype:

Như vậy chúng ta thu được một tập các Hapotype như bảng (1.1) Mỗi haplotype là

một xâu độ dài m các ký tự {0, 1} Ký tự 0 biểu thị mã hóa alen dạng tự nhiên và ký tự

1 biểu thị alen dạng biến dị

Trang 13

Bảng 1.1 Tập HAP tương đương với haplotype C

Khái niệm về điểm ngắt:

Haplotype bộ gen của con người từ các cơ chế phân tử của sinh sản hữu tính conngười và lịch sử của một loài

Ngoài tế bào, các nhiễm sắc thể kết hợp trong các tế bào của con người Có mộtNST từ bố, và một trong những NST khác từ phía của người mẹ Nhưng thế hệ củaNST trong quá trình chuyển giao không phải là tĩnh Trong quá trình hình thành trứng

và tinh trùng, NST tái tổ hợp đó là sự tích tụ của các mảnh vỡ NST với nhau và trao

đổi Hai mảnh vỡ liên tiếp nhau không cùng một NST thì được gọi là điểm ngắt.

Sau nhiều thế hệ, thông qua các sự kiện tái tổ hợp lặp đi lặp lại, các mảnh vỡnhiễm sắc thể ban đầu của tổ tiên đã bị phá vỡ Một số mảnh vỡ nhiễm sắc thể của tổtiên trong các chuỗi DNA của nhiều thế hệ con cháu xuất hiện Những phần này làhaplotype, nhà di truyền học có thể sử dụng nó để tìm kiếm bệnh hoặc gen liên quanđến đặc điểm quan trọng về mặt y khoa khác

1.2 Phát biểu bài toán cấu trúc chuỗi nguồn

Trong nghiên cứu về sự tiến hóa, việc xây dựng lại cấu trúc chuỗi nguồn có một

ý nghĩa lớn với lĩnh vực sinh học Mục tiêu của bài toán là tìm ra chuỗi gen di truyềnthích hợp được thiết lập để đạt được chuỗi di truyền của cá thể Việc thiết lập cácchuỗi gen này được xem là mô hình của bài toán cấu trúc chuỗi nguồn, trong đó phảitìm ra bộ chuỗi gen mà mỗi cá thể của nó đều đạt được từ việc tái tạo chuỗi gen vàgiảm thiểu số lượng lai ghép Bài toán mang tên bài toán cấu trúc chuỗi nguồn Tìm ralời giải của bài toán này có thể giúp phần hiểu rõ thêm về nguồn gốc đặc điểm kiểugen cụ thể

Bài toán được phát biểu như sau:

Cho n tập tái tổ hợp C={C 1 ,….,C n } đã cho; mỗi tái tổ hợp C i là một chuỗi chiều dài m trên chữ cái Σ đã cho, nghĩa là C i =ci1c i2c im với c ij∈∑ ,Σ = {0,1} và một số

k cố định Yêu cầu của bài toán là tìm ra k tập nguồn F= {F 1 ,…, F kj } mỗi tập nguồn F i

Trang 14

là chuỗi chiều dài m trên chữ cái Σ: F i = f i1f i2 f im với f ij∈∑∀j sao cho mỗi tập tái tổ hợp được thiết lập từ tập nguồn với số điểm ngắt là ít nhất

Ký hiệu 0 và 1 thể hiện mã alen ở dạng đồng hợp tử, ký tự 0 biểu thị mã hóa Alendạng tự nhiên và ký tự 1 biểu thị alen dạng biến dị (bảng 1.1)

Lời giải F là một lời giải tiềm năng nếu tập tái tổ hợp C có thể được thiết lập từ

F Đây là trường hợp khi mỗi C iC có thể được phân tích thành chuỗi các đoạn pi ≤

m (nghĩa là các chuỗi) Fri1 Fri2… Frip, như vậy mỗi đoạn Fr ij xuất hiện ở cùng vị trítrong ít nhật một tập nguồn Bằng cách trên, việc phân tích liên quan đến lời giải tiềmnăng được gọi là giảm xuống nếu hai đoạn liên tiếp không xuất hiện trong cùng một

tập nguồn Mục tiêu tối ưu hóa trong bài toán nhằm tìm ra một lời giải hợp lý F * , với

số tập nguồn cố định đã cho k j , tối thiếu hóa số điểm ngắt.

1.3. Mô hình bài toán

Để giải quyết bài toán cấu trúc chuỗi nguồn chúng ta tập trung vào hai bài toánchính đó là “bài toán tìm số điểm ngắt nhỏ nhất” (1) và “bài toán tìm ra tập nguồn đểtính tổng số điểm ngắt nhỏ nhất”(2) Bài toán (1) sẽ dùng để tính chi phí cho bài toán(2)

1.3.1. Bài toán 1: tìm số điểm ngắt nhỏ nhất

Bài toán cho các tập tái tổ hợp và cho k tập nguồn, mong muốn xây dựng các tậptái tổ hợp từ các tập nguồn sao cho số lai ghép là ít nhất

Trang 15

Hình 1.5 Ví dụ về bộ gen tái tổ hợp

⇒ Trong ví dụ trên, phía bên trái tập C được trình bày dưới dạng ma trận Giả định sốlượng tập nguồn cố định là 3, lời giải hợp lý đối với ma trận của 3 tập nguồn đượctrình bày ở phần trung tâm Ký hiệu tập nguồn đầu tiên là a, tập nguồn thứ hai là b vàtập nguồn thứ ba là c, việc phân tích ma trận gen tái tổ hợp thành từng đoạn lấy từ tậpnguồn được trình bày ở phía bên phải Điểm ngắt được đánh dấu bằng gạch thẳngđứng Đây là sự phân tích với 8 điểm ngắt, là giá trị nhỏ nhất đối với ví dụ này

1.3.2. Bài toán 2: tìm cấu trúc chuỗi nguồn

Bài toán cho các tập tái tổ hợp và cho một số cố định k Yêu cầu tìm ra đượcđúng k tập nguồn sao cho các tập tái tổ hợp được thiết lập từ tập nguồn mà có số laighép là ít nhất

Trang 16

Ví dụ: Đầu vào của bài toán được biểu diễn dưới dạng ma trận như sau:

Hình 1.6 Minh họa đầu vào của bài toán

 Output

Tìm giải pháp hợp lý F * đưa ra k tập nguồn mà có số điểm ngắt là ít nhất.

Đầu ra của bài toán được biểu diễn dưới dạng sau:

Hình 1.7 Minh họa đầu ra của bài toán1.4. Các phương pháp tiếp cận để giải bài toán cấu trúc chuỗi nguồn

Như ở trên đã phân tích bài toán cấu trúc chuỗi nguồn được chia làm hai bài toánnhỏ Bài toán thứ nhất là tìm ra số điểm ngắt nhỏ nhất, bài toán thứ hai là tìm ra số tậpnguồn sao cho số tái tổ hợp con được tạo ra từ các tập nguồn là nhỏ nhất Bài toán 1dùng để tính chi phí cho bài toán 2 Bài toán 2 là bài toán chính để giải quyết bài toáncấu trúc chuỗi nguồn

Trang 17

1.4.1. Bài toán 1: Bài toán tìm ra số điểm ngắt nhỏ nhất

Bài toán được phát biểu trong mục 1.3.1 Với bài toán này sử dụng thuật toántham lam để giải quyết bài toán

Bước 1: Lấy hàng đầu tiên C1 trong tập tái tổ hợp C đi so sánh với tất cả các hàngcủa tập nguồn F => tìm xem tái tổ hợp C1 được phân tích từ tập nguồn nào là dài nhấtthì tiến hành chọn tập nguồn đó Nếu tồn tại tập nguồn trùng với tái tổ hợp C1 =>chuyển sang bước 3

Bước 2: Xét các vị trí còn lại trong C1: tiến hành xét với vị trí còn lại từ các tập

nguồn còn lại (trừ tập nguồn vừa chọn) và lặp lại bước 1 Cứ tiếp tục cho đến khi hết

Bước 3: Các hàng tiếp theo C2, C3, … làm tương tự như bước 1 và bước 2.

1.4.2. Bài toán 2: Bài toán tìm ra số tập nguồn

Đây là bài toán chính của bài toán cấu trúc chuỗi nguồn Đã có rất nhiều phươngpháp đưa ra để giải quyết bài toán Một thuật toán dựa trên phương pháp quy hoạchđộng lần đầu tiên được đề xuất bởi Ukkonen [9] Tuy nhiên, phương pháp này khônghiệu quả khi số tập nguồn và độ dài của tái tổ hợp lớn Một thuật toán quy hoạch độngkhác được Rastas và Ukkonen đưa ra [17] Lyngso và Song [18] đã đưa ra thuật toán

Trang 18

branch-and-bound (thuật toán cận và nhánh) Mặc dù đầy triển vọng nhưng phươngpháp này chỉ được đánh giá trong mức kiểm tra có giới hạn được thiết lập bởi ít phiênbản nhỏ.

Bài toán cấu trúc chuỗi nguồn được nghiên cứu rộng rãi và nó liên quan đếnnhiều vấn đề khác El-Mabrouk và Labuda [15] đã tập trung vào vấn đề tái cấu trúc dễđiều khiển và đơn giản hơn nhiều: đưa ra bộ gen tập nguồn và gen tái tổ hợp Họ muốntìm kiếm một chất phân hủy tối thiểu cho gen tái tổ hợp Một ma trận gen tái tổ hợpđược đưa ra, việc phân chia các điểm liên tục gọi là khối, được xác định theo một sốquy tắc và mỗi gen tái tổ hợp được chia phù hợp vào các chuỗi con haplotype Mụcđích là để phân chia, với mỗi khối một màu sắc khác nhau đối với các chuỗi conhaplotype riêng biệt trong một khối, như là tổng số màu sắc thay đổi giữa hai chuỗicon haplotype liền kề trong cùng một gen tái tổ hợp là tối thiểu Vấn đề màu sắc củamỗi khối có thể được mã hóa thành một phiên bản của bài toán kết hợp phân chia cóđiều chỉnh Haplotype Colouring có thể được giải quyết tối ưu bằng thuật toán

O(m.n 2 logn).

Trong phần này luận văn trình bày lại phương pháp đó là Heuristic RecBlock vàthuật toán Back-and-Forth Iterated Greedy Mặc dù những kết quả của RecBlock rấttốt cho các phiên bản có số tập nguồn ít, thời gian tính toán của RecBlock tỷ lệ theocấp số nhân với số lượng tập nguồn và khiến cho ứng dụng của nó không khả thi chocác phiên bản kích thước lớn Đây là động cơ để phát triển các phương pháp [8], trướchết là phương pháp Tabu Search, được trang bị cách thức kiến thiết hiệu quả [6]

1.4.3. Thuật toán RecBlock

Tư tưởng thuật toán

Thuật toán RecBlock được Roli và Christian Blum để xuất vào tháng 10 năm

2009 [8]

RecBlock coi lời giải F như một ma trận với k hàng và m cột Bắt đầu từ một matrận trống, từng bước xây dựng để làm đầy các cột bên cạnh Ban đầu xây dựng chocột đầu tiên, bước tiếp theo xây dựng cho cột thứ hai sao cho ít điểm ngắt nhất đếnthời điểm đó, thực hiện cho tới khi xây dựng đủ m cột

Thuật toán

Thuật toán Recblock

1 Input: Cho tập C gồm n các tái tổ hợp có độ dài m

Trang 19

7 end for

8 output: Lời giải F với tổng số điểm ngắt nbp

Hình 1.8 Đặc tả thuật toán Recblock

Xây dựng lời giải

Coi lời giải F như một ma trận F[k * m], hàng i đại diện cho tập nguồn i, i = 1,

…, k

Tập các tái tổ hợp C là 1 ma trận C[n * m]

Khởi tạo F là một ma trận ∅, từng bước xây dựng để làm đầy các cột trống bêncạnh, bắt đầu từ cột đầu tiên

Bước 1: Xây dựng cột đầu tiên của ma trận F

- Gọi p là số các phần từ 0 trong cột đầu tiên của ma trận F

- Sử dụng hai bộ đếm n0: đếm số phần tử 0 và n1: đếm số phần tử 1 trong cột đầu tiên

- Ban đầu khởi tạo n0 = 1 và n1 = 1 để đảm bảo có ít nhật một phần tử 0 và một phần tử

1 trong cột đầu tiên

- Sau k – 2 lần rút ra một số ngẫu nhiên q[0,1] nếu q ≤ p tăng n0 lên một giá trị và ngượclại Như vậy cột đầu tiên được tạo bao gồm n0 phần tử 0 và n1 phần tử 1

- Đối với mỗi hàng i của ma trận C đặt biến cpi lưu trữ vị trí các điểm dừng cuối cùng.Ban đầu khởi tạo cpi = 0 vì chưa có điểm dừng tồn tại cụ thể hơn cpi = 0 (i = 1, 2, …,m) Hơn nữa đặt biến repi lưu trữ các chỉ số của tập nguồn đại diện cho dòng i của cột

C sau điểm ngắt cpi cuối cùng

Bước 2: Xây dựng cho các cột còn lại

- Giả sử cột cần điền là cột j, các vị trí của cột j được điền kế tiếp nhau bắt đầu từ hàng

1 Đối với vị trí fij đếm n0, n1 của hàng i trong ma trận C và kết hợp với phần tử n0, n1của hàng i-1 trong ma trận F

- Trong trường hợp no > n1 thiết lập fij = 0 Trường hợp no < n1 thiết lập fij = 1 Ngược lại

no = n1 chọn fij đồng nhất một cách ngẫu nhiên

- Cứ tiếp tục như vậy cho đến khi xây dựng xong hết các cột của ma trận F Đối vớithuật toán RecBlock đi đến cột nào tìm ra được số điểm ngắt và xây dựng được cộttiếp theo của ma trận F, nên thuật toán RecBlock chỉ cần chạy một lần là cho ra kếtquả

1.4.4. Thuật giải lặp lại Back-and-Forth Iterated Greedy

Back-and-Forth Iterated Greedy là một thuật toán cho bài toán cấu trúc chuỗinguồn do một số tác giả của tài liệu [5] đề xuất dựa trên khuôn khổ Iterated Greedymetaheuristic [22] Khuôn khổ Iterated Greedy metaheuristic nằm ở phần nghiệm tạm

Trang 20

thời và dựng lại phần đó bằng quy trình dựng lại ngẫu nhiên hóa Thuật giải Forth Iterated Greedy (B&F IG) sử dụng phương pháp tìm kiếm xây dựng học tăngcường, dựa trên quy trình tìm kiếm ngẫu nhiên hóa để đưa ra nghiệm riêng cho bàitoán và trong mỗi bước xây dựng, thuật toán mở rộng bằng cách cộng thêm một cột.Phép tìm kiếm này (sau đây gọi tắt là rgreedy) được các tác giả sử dụng để xây dựngnghiệm ban đầu trong thuật toán tìm kiếm Tabu [4] Quy trình này cung cấp thông tin

Back-and-cơ bản về phép tìm kiếm Lookahead Heuristic, được mô tả sau đây

Ký hiệu bằng A|B là phép ghép nối của hai ma trận với số lượng hàng như nhau.Sau đó tìm nghiệm riêng Fi đến vị trí i, phép tìm kiếm Lookahead Heuristic sẽ tìm ranhững nhiệm riêng mới nt {Fi|J1, Fi|J2, ,Fi|Jnt} nếu Jk là ma trận kf x lh thu được do

áp dụng thời gian rgreedy tương đương với min{lh, m – i} nếu giá trị lh là tham số củathuật toán B&F IG Sau đó, sẽ đánh giá từng Fi|Jk và tính toán số lượng điểm ngắt BP(Fi|Jk) Cuối cùng, lấy K = {BP (Fi|Jk)}; cột cộng thêm vào Fi sẽ là cột đầu tiên của

ma trận JK

Phép tìm kiếm Lookahead Heuristic sẽ được bao gồm trong bước xây dựng thuậttoán B&F IG Ý chính của thuật toán này là việc xây dựng có thể được thực hiện từtrái sang phải hoặc từ phải sang trái (sau đây gọi tắt là thuật ngữ Back –and – Forth):đây là đặc tính tự tại (tính đối xứng hóa) của FSRP Do đó, thuật toán kết quả có cáchgiải như sau: thuật toán sẽ lấy nghiệm đầy đủ và xem xét khoảng đối xứng hóa của các

vị trí J = [k, m – k] với k là tham số; hướng thực hiện sẽ lần lượt từ trái sang phải Đối với mỗi j J , sẽ thu được nghiệm riêng F j bằng cách loại bảo các cột j, j+1, , m (hoặc cột 1, 2, , j nếu hướng thực hiện từ phải sang trái) và hoàn thành Fi bằng cách

áp dụng lặp lại phép tìm kiếm Lookahead Heuristic như nêu trên Thuật giải này xen

kẽ giữa việc tỉa cây và xây dựng lại cho đến khi nó hoàn thiện được nghiệm hiện thời

hoặc cho đến khi nó cuộn lại r lần (với r là tham số khác trong thuật toán) qua khoảng

J Tại điểm này, thuật toán sẽ đảo hướng và lặp lại chu trình cho đến khi đến điểm kết

thúc

Trang 21

CHƯƠNG II GIỚI THIỆU VỀ THUẬT TOÁN ANT COLONY

OPTIMIZATION (ACO) 2.1 Giới thiệu về thuật toán ACO

Bài toán tối ưu hóa tổ hợp (Combinatorial Optimization Problems) là bài toánhấp dẫn và thú vị phần lớn chúng đều dễ để hình dung nhưng khó tìm ra lời giải Nhiềubài toán tối ưu hóa tổ hợp là các bài toán NP – khó và chúng không thể giải được trongthời gian đa thức Trên thực tế người ta thường giải quyết các bài toán này bằng cácphương pháp xấp xỉ, chúng có nghiệm gần tối ưu và thời gian chạy khá ngắn Cácthuật toán thuộc loại này thường được gọi là các thuật toán heuristic, chúng được sửdụng để giải quyết các bài toán cụ thể Mở rộng của chúng là các bài toánmetaheuristic có thể giải quyết được cả một lớp các bài toán rộng lớn Phương pháptối ưu hóa đàn kiến (Ant Colony Optimization – ACO) là một phương pháp theohướng tiếp cận như thế

ACO là một mô hình để thiết kế các thuật toán metaheuristic cho việc giải quyếtbài toán tối ưu hóa tổ hợp

ACO – phương pháp tối ưu hóa đàn kiến [1] mô phỏng hành vi của bầy kiếntrong tự nhiên nhằm tìm kiếm đường đi ngắn nhất giữa tổ kiến và nguốn thức ăn dựatrên mật độ mùi (Pheromone) mà các con kiến để lại trên đường đi Thuật toán này lầnđầu tiên được ứng dụng giải bài toán phân loại các trạm làm việc vào năm 1991 Sau

đó, rất nhiều các biến thể của thuật toán dựa trên các nguyên lý cơ bản của nó đượcgiới thiệu Đặc điểm chủ yếu của thuật toán ACO là sự kết hợp của các thông tin vềcấu trúc của lời giải triển vọng với thông tin về cấu trúc của các lời giải tốt trước đó.Hiệu quả nổi trội của thuật toán ACO đã được thể hiện khi so sánh với một sốthuật toán nổi tiếng khác như thuật toán di truyền (GA), Tabu-Search, Local Search, …Người ta đã áp dụng rất thành công các thuật toán kiến trong một số các bài toán tối ưuthường gặp như: bài toán người chào hàng, bài toán người đưa thư, bài toán gán, bàitoán tô màu đồ thị, bài toán lập lịch, …

2.2 Mô hình mô phỏng của thuật toán

Trang 22

Hình 2.1 Một ví dụ về hoạt động của bầy kiến trong thực tế

Ví dụ trên là hành trình của bầy kiến Trong (hình a) cho thấy bầy kiến đi từ tổ Eđến nơi chứa thức ăn A và ngược lại Một cản trở xuất hiện trên đường tại vị trí B hoặc

D, bầy kiến phải quyết định rẽ phải hoặc rẽ trái (hình b) Sự lựa chọn sẽ bị tác độnglớn khi xuất hiện mùi hương thu hút của các con khác để lại trên đường đi

Nếu mùi hương thu hút từ bên phía phải càng lớn sẽ tạo cho bầy kiến một độnglực mạnh mẽ hơn và do đó xác suất rẽ phải sẽ lớn hơn Con kiến đầu đàn đến điểm B(hoặc D) sẽ có xác suất rẽ phải như rẽ trái (vì không có mùi hương thu hút trước đótrên cả hai tuyến) Bởi vì tuyến B – C – D ngắn hơn B – H – D, con kiến đầu đàn sau

đó sẽ đến điểm D trước khi con kiến đầu đàn đi theo tuyến B – H – D (hình c)

Kết quả là một con kiến đi từ E đến D sẽ tìm thấy mùi hương thu hút trên tuyến

D – C – B và làm cho một nửa con kiến còn lại quyết định đi theo hướng D – C – B –

A và do đó bầy kiến đã đi qua D – C – B Do vậy số các con kiến đi theo tuyến D – C– B theo đơn vị thời gian sẽ càng nhiều hơn so với số các con kiến đi theo tuyến B –

H – D

Nếu mùi hương thu hút trên tuyến đi ngắn hơn lớn hơn sẽ thúc đẩy việc dichuyển nhanh hơn so với tuyến dài hơn, do đó xác suất chọn tuyến ngắn hơn là lớnhơn

Trang 23

2.2.2. Kiến nhân tạo

Từ thực nghiệm trên cho thấy đàn kiến tự nhiên có thể sử dụng luật di chuyểntheo xác suất, dựa trên thông tin địa phương để tìm được đường đi ngắn nhất giữa haiđịa điểm Vết mùi của đàn kiến cho phép liên tưởng tới cách học tăng cường(reinforcement learning) trong bài toán chọn tác động tối ưu [1], gợi mở mô hình môphỏng cho bài toán tìm đường đi ngắn nhất giữa hai nút (tương ứng là tổ và nguồnthức ăn) trên đồ thị

Do sử dụng mô hình bầy kiến nhân tạo như là một phương pháp tối ưu, nên hệthống sẽ có một vài điểm khác so với cơ chế hoạt động của bầy kiến trong thực tế

• Bầy kiến nhân tạo có một vài bộ nhớ/ ký ức nhất định

• Chúng không hoàn toàn mù, tức cũng có một vài tri thức nhất định trongviệc quan sát, đánh giá các thay đổi của môi trường

• Chúng sẽ sống trong môi trường mà miền thời gian là rời rạc

Hình 2.2 Một ví dụ về đàn kiến nhân tạo

Một ý tưởng được đưa ra là nếu tại một điểm đó, một con kiến chọn một đường

đi từ tập các đường đi khác nhau, nó sẽ lựa chọn đường đi có khả năng đạt tới đích caonhất Hơn nữa đường đi đó cũng có nghĩa là đường đi ngắn nhất

2.3. Trình bày giải thuật

Khi áp dụng ACO cho các bài toán cụ thể, có bốn yếu tố quyết định hiệu quả của thuật toán:

- Xây dựng đồ thi cấu trúc thích hợp: Tùy thuộc vào đặc thù của bài toán

- Xây dựng lời giải tuần tự: Tùy thuộc vào đặc thù của bài toán

Trang 24

- Chọn thông tin heuristic: Thông tin heuristic tốt sẽ làm tăng hiệu quả của thuật toán.

Tuy nhiên có nhiều bài toán không có thông tin này thì có thể đánh giá chúng nhưnhau

- Chọn quy tắc cập nhật mùi: Quy tắc cập nhật mùi thể hiện chiến lược học của thuật

toán Hai yếu tố đầu: Đồ thị cấu trúc và thông tin heuristic phụ thuộc vào bài toán cụthể, còn quy tắc cập nhật mùi là yếu tố phổ dụng và thường dùng làm tên để phân biệtcho các thuật toán ACO

2.3.1. Đồ thị cấu trúc

Bài toán tối ưu tổ hợp tổng quát

Mỗi bài toán tối ưu tổ hợp tổng quát ứng với một bộ ba trong đó S là tập hữu hạncác trạng thái (lời giải tiềm năng hay phương án), f là hàm mục tiêu xác định trên S,còn Ω là tập các ràng buộc Mỗi phương án thỏa mãn các ràng buộc gọi là phương ánchấp nhận được Mục tiêu của chúng là tìm ra phương án tối ưu hóa toàn cục đối vớihàm mục tiêu , nói cách khác chính là tìm phương án sao cho với mọi Đối với bàitoán này ta có 3 cách giải quyết đó là: vét cạn, kỹ thuật ăn tham hoặc phương pháp tối

ưu trong lĩnh vực NP-khó

Các tập C, S, Ω có đặc tính như sau[1,tr.31-32]:

1) Ký hiệu X là tập các vectơ trong C độ dài không quá h: X = Khi đó, mỗiphương án s trong S được xác định bởi ít nhất một vectơ trong X (như ở điểm2)

2) Tồn tại tập con X* của X và ánh xạ từ X* lên S sao cho không rỗng với S,trong đó tập X* có thể được xây dựng từ tập con C0của C nhờ mở rộng tuần

tự (điểm 3 dưới đây)

3) Từ C0 ta mở rộng tuần tự thành X* như sau:

i) Ta xem x0 = là mở rộng được với

ii) Giả sử là mở rộng được và chưa thuộc vào X* Từ tập ràng buộc Ω, xácđịnh tập con của C, sao cho thì là mở rộng được

iii) Áp dụng thủ tục từ các phần tử cho phép ta xây dựng được mọi phần tửcủa X*

Xây dựng đồ thị cấu trúc

Mỗi bài toán tối ưu tổ hợp được xem như một bài toán tìm kiếm vectơ độ dàikhông quá trên đồ thị đầy đủ có các đỉnh được gán nhãn trong tập Để tìm các lời giảichấp nhận được, ta xây dựng đồ thị đầy đủ với tập đỉnh , mỗi đỉnh của nó tương ứngvới mỗi thành phần củaCác lời giải chấp nhận được sẽ là các vectơ được xác định theothủ tục mở rộng tuần tự hay mở rộng ngẫu nhiên

Thông thường, đối với các bài toán thuộc loại NP-khó, người ta đưa ra cácphương pháp heuristic tìm lời giải đủ tốt cho bài toán Các thuật toán ACO kết hợp

Trang 25

thông tin heuristic này với phương pháp học tăng cường, mô phỏng hành vi của đànkiến, để tìm lời giải tốt hơn

Ta gọi đồ thị là đồ thị cấu trúc của bài toán tối ưu tổ hợp, trong đó V là tập đỉnh,

E là tập cạnh, H là vectơ các trọng số heuristic của cạnh và là vectơ biểu thị các thôngtin học tăng cường Từ các cạnh ta xây dựng tập X* nhờ mở rộng tập theo thủ tục tuần

tự Nếu không có thông tin heuristics thì ta xem H có các thành phần như nhau và bằng1

Trường hợp tổng quát, là đồ thị đầy đủ.Tuy nhiên, tùy theo ràng buộc của bàitoán, các cạnh có thể lược bớt để giảm miền tìm kiếm lời giải theo thủ tục mở rộngtuần tự Chẳng hạn, với bài toán tìm cực trị của hàm giải tích , với thuộc tập giá trị hữuhạn , đồ thị cấu trúc có tầng, tầng chứa các đỉnh thuộc tập , còn tập cạnh chỉ gồm cáccạnh nối các đỉnh thuộc tầng với các đỉnh thuộc tầng như trong hình 2.3 Khi đó tập

là tập , mỗi mở rộng tuần tự của lời giải sẽ được xây dựng từ một đỉnh thuộc tập này

Hình 2.3 Đồ thị cấu trúc tổng quát cho bài toán cực trị hàm

2.3.2. Trình bày về thuật toán ACO cơ bản

Tiến hành sử dụng m con kiến để xây dựng lời giải trên đồ thị cấu trúc Quá trìnhtìm kiếm lời giải trên đồ thị kết thúc theo số bước lặp hoặc giới hạn thời gian chạy

Xây dựng lời giải

Lời giải trên đồ thị cấu trúc như sau: Khởi tạo với m con kiến, tại mỗi lần lặp,kiến sẽ chọn ngẫu nhiên một đỉnh để làm khởi tạo ban đầu x0 = với Sau đó các conkiến sẽ đi xây dựng lời giải theo thủ tục bước ngẫu nhiên

Theo như trình bày ở trên điểm 3 phần iii mục 1.2.1 Từ đỉnh ta tiến hành mởrộng các đỉnh cho đến khi thuộc vào X*, nghĩa là tìm được lời giải chấp nhận được.Giả sử con kiến đang ở đỉnh và có một đỉnh (để mở rộng (hay có thể hiểu con kiến từđỉnh i sẽ lựa chọn đỉnh j) được chọn với xác suất như sau:

Trang 26

(2.1)Trong đó :

, : Giá trị thông tin mùi và thông tin heuristic

: Hai tham số quyết định sự ảnh hưởng tương quan giữa thông tin mùi và thông tinheuristic Nếu không có học tăng cường Nếu chỉ có thông tin học tăng cường biểu thịqua vết mùi được sử dụng, không có thông tin heurisric

: Đỉnh lân cận của đỉnh i mà kiến có thể đi đến

Cập nhật mùi

Dựa trên lời giải tìm được, đàn kiến sẽ thực hiện cập nhật mùi theo cách họctăng cường

(2.2)Trong đó: : hệ số bay hơi (tỷ lệ lượng mùi bị bay hơi), là hằng số thuộc khoảng(0,1)

: lượng mùi do kiến để lại

Các bước thực hiện của thuật toán ACO được mô tả trong hình 2.3:

ProcedureThuật toán ACO;

Until (điều kiện kết thúc);

Đưa ra lời giải tốt nhất;

2.3.3.1. Thuật toán AS

Đây là thuật toán ACO đầu tiên được Dorigo đề xuất năm 1991[13,14] Vết mùikhởi tạo: với m là số lượng kiến, độ dài lời giải tìm được của thuật toán heuristic Ban đầu tất cả các cạnh sẽ bị mất đi một lượng mùi do bay hơi:

(2.3)

Trang 27

Sau đó những cạnh nào có kiến đi qua sẽ được cộng thêm một lượng mùi mà kiến

để lại:

(2.4)Trong đó:

(2.5)Trong đó: là độ dài hành trình do kiến xây dựng

2.3.3.2. Thuật toán ACS

Thuật toán ACS (Ant Colony System) do Dorigo và Gambardella đề xuất năm

1997[12] Trong thuật toán ACS gồm có hai quy tắc cập nhật mùi

Cập nhật mùi toàn cục

(2.6)Trong đó:

(2.7)

Cập nhật mùi cục bộ

(2.8)Trong đó: và = , n là số thành phố, là độ dài hành trình theo thuật toán tham ăn.Thuật toán ACS chỉ có duy nhất một kiến tìm được lời giải được phép để lại mùi saumỗi lần lặp

2.3.3.3. Thuật toán Max-Min

Thuật toán Max- Min (Max _ Min Ant System) được kí hiệu là MMAS đượcStutzle và Hoos đề xuất năm 2000[22], với hàm cập nhật vết mùi như sau:

(2.9)Trong đó: , với

Vết mùi bị giới hạn trong đoạn :

(2.10)Trong MMAS việc sử dụng và ảnh hướng tới hướng tìm kiếm và không xảy rađồng thời mà thay phiên nhau Khi luôn cập nhật bằng thì việc tìm kiếm định hướngxảy ra nhanh chóng Khi cập nhật bằng thì việc tìm kiếm định hướng giảm do sốlượng cạnh được cập nhật mùi nhiều

Giới hạn vết mùi

Ngày đăng: 15/10/2020, 13:45

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w