3. Bố cục của luận văn
3.2. Thử nghiệm áp dụng và cài đặt thuật toán leo đồi cơ bản
3.2.1. Ý tưởng
Đầu vào: dựa vào biểu đồ luồng dữ liệu của bài toán đã cho, xác định một tập hợp các nút subgoal mà bộ dữ liệu tạo ra sẽ phải đi qua
Bắt đầu vòng lặp sẽ tạo ra 3 số ngẫu nhiên, tìm đƣờng đi cho 3 số ngẫu nhiên đó. Nếu nó đi qua danh sách subgoal thì xóa nút đó trong danh sách subgoal và thêm vào danh sách SAVE.
Sau đó tạo hàng xóm cho 3 số ngẫu nhiên đó, sẽ đƣợc 12 hàng xóm.
Duyệt xem có hàng xóm nào có giá trị hàm cost nhỏ hơn giá trị cost của 3 số đầu tiên thì lại tính đƣờng đi xem có đi qua subgoal không, nếu đi qua subgoal thì xóa nút đó khỏi subgoal, và thêm vào danh sách SAVE.
Thoát khỏi vòng lặp khi danh sách subgoal hết hoặc chạy hết số lần lặp đặt trƣớc.
Đầu ra cuối cùng sẽ là danh sách SAVE (chứa các bộ 3 số có thể là sinh ngẫu nhiên hoặc hàng xóm của các số ngẫu nhiên đó sao cho các số đó có đƣờng đi qua các nhánh của biểu đồ luồng dữ liệu của bài toán).
3.3.Thử nghiệm áp dụng và cài đặt thuật toán leo đồi dốc đứng
3.3.1. Ý tưởng
Đầu vào: dựa vào biểu đồ luồng dữ liệu của bài toán đã cho, xác định một tập hợp các nút subgoal mà bộ dữ liệu tạo ra sẽ phải đi qua
Bắt đầu vòng lặp sẽ tạo ra 3 số ngẫu nhiên, tìm đƣờng đi cho 3 số ngẫu nhiên đó nếu nó đi qua danh sách subgoal thì xóa nút đó trong danh sách subgoal và thêm vào danh sách SAVE.
Sau đó tạo hàng xóm cho 3 số ngẫu nhiên đó, sẽ đƣợc 12 hàng xóm.
Duyệt xem có hàng xóm nào có giá trị hàm cost nhỏ hơn giá trị cost của 3 số đầu tiên thì lƣu vào mảng CFG.
Tiếp theo duyệt mảng CFG để lấy ra giá trị cost nhỏ nhất rồitính đƣờng đi xem có đi qua subgoal không, nếu đi qua subgoal thì xóa nút đó khỏi subgoal, và thêm vào danh sách SAVE.
Thoát khỏi vòng lặp khi danh sách subgoal hết hoặc chạy hết số lần lặp đặt trƣớc.
Đầu ra cuối cùng sẽ là danh sách SAVE (chứa các bộ 3 số có thể là sinh ngẫu nhiên hoặc hàng xóm của các số ngẫu nhiên đó sao cho các số đó có đƣờng đi qua các nhánh của biểu đồ luồng dữ liệu của bài toán).
3.4.Thử nghiệm áp dụng và cài đặt thuật toán Tabu-search
3.4.1. Ý tưởng
Đầu vào: dựa vào biểu đồ luồng dữ liệu của bài toán đã cho, xác định một tập hợp các nút subgoal mà bộ dữ liệu tạo ra sẽ phải đi qua
Bắt đầu vòng lặp sẽ tạo ra 3 số ngẫu nhiên, tìm đƣờng đi cho 3 số ngẫu nhiên đó nếu nó đi qua danh sách subgoal thì xóa nút đó trong danh sách subgoal và thêm vào danh sách SAVE.
Sau đó tạo hàng xóm cho 3 số ngẫu nhiên đó, sẽ đƣợc 12 hàng xóm.
Duyệt xem có hàng xóm nào có giá trị hàm cost nhỏ hơn giá trị cost của 3 số đầu tiên thì lƣu vào mảng CFG.
Tiếp theo duyệt mảng CFG để xem các thành phần có trong danh sách ST và danh sách LT hay không, nếu không có trong ST hoặc LT thì xem có đi qua subgoal không, nếu đi qua subgoal thì xóa nút đó khỏi subgoal và thêm vào danh sách SAVE.
Thoát khỏi vòng lặp khi danh sách subgoal hết hoặc chạy hết số lần lặp đặt trƣớc.
Đầu ra cuối cùng sẽ là danh sách SAVE (chứa các bộ 3 số có thể là sinh ngẫu nhiên hoặc hàng xóm của các số ngẫu nhiên đó sao cho các số đó có đƣờng đi qua các nhánh của biểu đồ luồng dữ liệu của bài toán).
3.4.2. Thuật toán
Khởi tạo:
Phƣơng án hiện tại (CurrentSolution CS) Tính giá trị hàm cost tại vị trí ban đầu Lƣu CS vào CFG
Add CS tới Tabu list Short term (ST) Chọn một nút tiếp theo để đến. Vòng lặp
Do:
Tính hàm giá của các ứng cử viên lân cận (không nằm trong ST) For (Mỗi ứng cử viên lân cận)
Nếu hàm giá của nó < hàm cost tại node hiện tại của CFG thì lƣu nó vào CFG
Nếu subgoal nút chƣa đƣợc phủ thì add CS vào tabu list ST Ngoài ra thì delete ST
Chọn một nút subgoal Chọn CS trong CFG Nếu (CS đã hết) add CS vào tabulist LT
ứng dụng thuật toán quay lui để tìm CS mới
while (tất cả các nút đã đc phủ và số vòng lặp < MAXIT)
Trong đó:
CS: Phƣơng án hiện tại (Trong lần chạy đầu tiên, phƣơng án hiện tại là một tập các dữ liệu ngẫu nhiên, là khởi tạo ban đầu của bài toán). CFG: Danh sách các phƣơng án có khả năng làm data test
ST: Danh sách Tabu ngắn, lƣu các phƣơng án không khả thi tại một thời điểm.
LT: Danh sách Tabu dài, lƣu các phƣơng án không khả thi trong suốt bài toán.
MAXIT: Số vòng lặp tối đa của thuật toán khi các nút chƣa đƣợc phủ hết.
3.5.Thực nghiệm và đánh giá
3.5.1. Mô tả kết quả thực nghiệm
Sau khi chạy thử nghiệm các thuật toán với các số lấy ngẫu nhiên từ 0 đến 50 kết quả thu đƣợc là:
+ Với thuật toán leo đồi cơ bản:
SAVE size:7 - data: {14.0,15.0,18.0}-1.0 ;{-16.0,15.0,18.0}-1.0 ; {29.0,46.0,9.0}-2.0 ; {16.0,16.0,13.0}-17.0 ; {34.0,10.0,34.0}-22.0 ; {2.0,9.0,9.0}-42.0 ; {5.0,5.0,5.0}-233.0 ;
+ Với thuật toán leo đồi dốc đứng:
SAVE size:7 – data: {14.0,15.0,18.0}-1.0; {-16.0,15.0,18.0}-1.0 ; {29.0,46.0,9.0}-2.0 ; {16.0,16.0,13.0}-17.0 ; {34.0,10.0,34.0}-22.0 ; {2.0,9.0,9.0}-42.0 ; {5.0,5.0,5.0}-233.0 ;
+ Với thuật toán Tabu-search:
SAVE size:7 – data: {33.0,2.0,30.0}-1.0 ; {-7.0,2.0,30.0}-1.0 ; {48.0,48.0,7.0}-2.0 ; {18.0,48.0,37.0}-2.0 ; {43.0,22.0,43.0}-4.0 ; {3.0,2.0,2.0}-26.0 ; {5.0,5.0,5.0}-380.0 ;
3.5.2. Kết quả thực nghiệm
Thuật toán leo đồi cơ bản:
Lần 1 Lần 2 Lần 3 Kết quả Số vòng lặp Kết quả Số vòng lặp Kết quả Số vòng lặp {14.0,15.0,18.0} 1 {19.0,42.0,8.0} 1 {27.0,37.0,45.0} 1 {-16.0,15.0,18.0} 1 {-11.0,42.0,8.0} 1 {-3.0,37.0,45.0} 1 {29.0,46.0,9.0} 2 {19.0,12.0,8.0} 1 {27.0,7.0,45.0} 1 {16.0,16.0,13.0} 17 {19.0,19.0,7.0} 22 {46.0,46.0,44.0} 25 {34.0,10.0,34.0} 22 {34.0,40.0,40.0} 27 {46.0,43.0,46.0} 36 {2.0,9.0,9.0} 42 {38.0,3.0,38.0} 67 {22.0,40.0,40.0} 50 {5.0,5.0,5.0} 233 {43.0,43.0,43.0} 197 {38.0,38.0,38.0} 172
Bảng 3.1. Bảng kết quả thực nghiệm thuật toán leo đồi cơ bản
Thuật toán leo đồi dốc đứng:
Lần 1 Lần 2 Lần 3 Kết quả Số vòng lặp Kết quả Số vòng lặp Kết quả Số vòng lặp {23.0,42.0,39.0} 1 {16.0,21.0,44.0} 1 {6.0,30.0,3.0} 1 {-7.0,42.0,39.0} 1 {-14.0,21.0,44.0} 1 {-24.0,30.0,3.0} 1 {38.0,20.0,2.0} 4 {23.0,9.0,23.0} 2 {15.0,34.0,33.0} 4 {21.0,17.0,17.0} 38 {47.0,38.0,29.0} 3 {23.0,50.0,50.0} 50 {35.0,39.0,35.0} 66 {4.0,37.0,37.0} 33 {28.0,18.0,28.0} 115 {31.0,31.0,50.0} 69 {44.0,44.0,10.0} 87 {31.0,31.0,12.0} 167 {12.0,12.0,12.0} 1295 {8.0,8.0,8.0} 1484 {5.0,5.0,5.0} 1678
Thuật toán Tabu-search: Lần 1 Lần 2 Lần 3 Kết quả Số vòng lặp Kết quả Số vòng lặp Kết quả Số vòng lặp {33.0,2.0,30.0} 1 {9.0,14.0,33.0} 1 {21.0,36.0,18.0} 1 {-7.0,2.0,30.0} 1 {-21.0,14.0,33.0} 1 {-9.0,36.0,18.0} 1 {48.0,48.0,7.0} 2 {40.0,10.0,47.0} 2 {61.0,36.0,18.0} 1 {18.0,48.0,37.0} 2 {10.0,10.0,17.0} 2 {48.0,48.0,5.0} 6 {43.0,22.0,43.0} 4 {44.0,32.0,44.0} 16 {50.0,32.0,50.0} 23 {3.0,2.0,2.0} 26 {4.0,46.0,46.0} 24 {25.0,45.0,45.0} 29 {5.0,5.0,5.0} 380 {9.0,9.0,9.0} 180 {25.0,25.0,25.0} 238
Bảng 3.3. Bảng kết quả thực nghiệm thuật toán Tabu-search
3.5.3. Nhận xét đánh giá
Qua thực nghiệm với các thuật toán ta thấy:
Leo đồi dốc đứng đi mỗi bƣớc sẽ lâu hơn leo đồi đơn giản, nhƣng sẽ đến kết quả nhanh hơn (vì theo kết quả ở phần trên, trong mỗi vòng lặp của leo đồi dốc đứng đều chọn ra 1 nút có chi phí nhỏ nhất trong các chi phí nhỏ hơn giá trị ban đầu, còn vòng lặp của leo đồi cơ bản chỉ cần chọn ra những nút có chi phí nhỏ hơn chi phí của nút ban đầu. Nhƣ vậy bƣớc chọn 1 nút sẽ mất nhiều thời gian hơn nhƣng về sau chỉ cần duyệt riêng nút đó nên sẽ nhanh hơn duyệt nhiều nút).
Điểm mạnh của thuật toán leo đồi là đơn giản, dễ lập trình, không tốn bộ nhớ do không phải lƣu bất kỳ thứ gì, chỉ lƣu trạng thái tạm thời và các hàng xóm (theo nhƣ kết quả thì thuật toán leo đồi cơ bản không hề có các danh sách nhƣ CFG, ST,
LT nhƣ thuật toán Tabu-search). Nhƣng chính đặc điểm này cũng dẫn đến trƣờng hợp thuật toán leo đồi có thể gặp phải trƣờng hợp lặp vô hạn. Trong khi đó thuật toán Tabu-search thì có danh sách lƣu những điểm đã đi qua nên tiết kiệm thời gian hơn.
Tabu-search là một trong những Meta-Heuristic đƣợc áp dụng nhiều nhất cho các bài toán tối ƣu tổ hợp khó. Tabu-search sẽ tìm kiếm và chỉ lựa ra một lời giải duy nhất để làm cơ sở cho bƣớc lặp tiếp theo - đây chính là điểm khác biệt cơ bản nhất giữa thuật giải Tabu-search so với nhóm các thuật giải tiến hoá (như thuật giải di truyền, lập trình tiến hoá, v.v.). Ở nhóm các thuật giải tiến hoá, sau mỗi bƣớc lặp, kết quả thu đƣợc là cả một tập các lời giải, trong khi ở Tabu-search, chỉ thu đƣợc một lời giải duy nhất.
Cả ba thuật toán đều có thể gặp khả năng thất bại trong việc tìm lời giải.
3.6.Kết chƣơng
Chƣơng 3 đã trình bày đƣợc:
Mô tả bài toán phân loại tam giác với biểu đồ luồng dữ liệu cho trƣớc. Trình bày đƣợc ý tƣởng và cài đặt thuật toán leo đồi cơ bản.
Trình bày đƣợc ý tƣởng và cài đặt thuật toán leo đồi dốc đứng. Trình bày đƣợc ý tƣởng và cài đặt thuật toán Tabu-search.
Đƣa ra kết quả thực nghiệm của ba thuật toán và đánh giá kết quả của ba thuật toán (thuật toán leo đồi cơ bản, thuật toán leo đồi dốc đứng và thuật toán Tabu-search).
KẾT LUẬN VÀ KIẾN NGHỊ A. Kết luận:
Qua thời gian làm việc, với sự nỗ lực của bản thân và đƣợc sự hƣớng dẫn tận tình của PGS.TS. Huỳnh Quyết Thắng, tôi đã cơ bản hoàn thành Luận văn "Các kỹ thuật kiểm thử cấu trúc chƣơng trình theo hƣớng tiếp cận kiểm thử dựa tìm kiếm" của mình.
Đề tài đã giải quyết đƣợc các vấn đề sau:
1. Trình bày các kỹ thuật trong kiểm thử phần mềm, trong đó tập trung vào phân tích ba kỹ thuật chính là: kiểm thử hộp đen, kiểm thử hộp trắng và kiểm thử hộp xám.
2. Phân tích kỹ thuật kiểm thử cấu trúc, đƣa ra các phƣơng pháp trong kiểm thử cấu trúc nhƣ: kiểm thử theo câu lệnh, kiểm thử theo đƣờng dẫn, …
3. Giới thiệu về phƣơng pháp kiểm thử dựa trên tìm kiếm.
4. Đi sâu vào phân tích ba thuật toán: thuật toán leo đồi cơ bản (Hill climbing), thuật toán leo đồi dốc đứng và thuật toán Tabu-search.
Các kết quả chính đạt đƣợc trong đề tài:
1. Nghiên cứu về các kỹ thuật kiểm thử cấu trúc chƣơng trình.
2. Ứng dụng phƣơng pháp kiểm thử dựa tìm kiếm để kiểm thử cấu trúc chƣơng trình.
3. Tác giả đã cài đặt và sử dụng ba thuật toán: thuật toán leo đồi cơ bản, thuật toán leo đồi dốc đứng và thuật toán Tabu-search để thử nghiệm kiểm thử cấu trúc đối với bài toán phân loại tam giác và đã đánh giá kết quả cụ thể.
Những khó khăn gặp phải trong quá trình thực hiện đề tài:
Việc phân tích và kiểm thử phần mềm ở Việt Nam hiện nay còn chƣa đƣợc chú trọng.
Việc tìm hiểu và ứng dụng các phƣơng pháp kiểm thử dựa trên tìm kiếm là một hƣớng đi đã đƣợc đề xuất từ những năm 1976 nhƣng mãi đến những năm 1990 mới thực sự đƣợc các nhà nghiên cứu trên thế giới quan tâm.Tuy nhiên ở Việt Nam việc tìm hiểu và ứng dụng các phƣơng pháp kiểm thử dựa trên tìm kiếm còn chƣa thu hút đƣợc giới nghiên cứu và chƣa phổ biến.
Hƣớng giải quyết:
Cần phải chú trọng hơn nữa việc phân tích và kiểm thử phần mềm vì kiểm thử là một giai đoạn quan trọng của quá trình kiểm soát chất lƣợng trong quy trình phát triển phần mềm.
Cần phải tiếp tục tìm hiểu sâu hơn nữa và phân tích rõ đƣợc ƣu điểm của các phƣơng pháp kiểm thử dựa trên tìm kiếm, từ đó sẽ thu hút đƣợc đông đảo các nhà nghiên cứu tham gia phát triển các phƣơng pháp dựa trên tìm kiếm để kiểm thử cấu trúc chƣơng trình, góp phần đảm bảo hiệu quả hoạt động tối ƣu của phần mềm.
B. Kiến nghị:
Trong quá trình nghiên cứu và hoàn thành luận văn tác giả nhận thấy: hiện nay vấn đề kiểm thử phần mềm vẫn chƣa thực sự đƣợc đầu tƣ và quan tâm đúng mức. Nƣớc tahiện nay đang trong quá trình xây dựng và phát triển ngành công nghiệp phần mềm do đóviệc ứng dụng công cụ kiểm thử phần mềm tự động chắc chắn sẽ giúp giảm công sức của cán bộ kiểm thử đồng thời làm tăng chất lƣợng phần mềm. Trong điều kiện Việt Nam hiện nay, với tỷ trọng gia công phần mềm ngày càng lớn tại các công ty phần mềm, để nâng cao chất lƣợng của các sản phẩm phần mềm thì cần phải có những chính sách đầu tƣ và sự quan tâm sâu sắc cho quá trình kiểm thử phần mềm.
C. Hƣớng phát triển của đề tài:
Do điều kiện cá nhân còn những hạn chế, nên vấn đề nghiên cứu về "Các kỹ thuật kiểm thử cấu trúc chƣơng trình theo hƣớng tiếp cận kiểm thử dựa tìm kiếm" trong khuôn khổ của luận văn mới dừng lại ở những nghiên cứu ban đầu. Vì vậy, những nghiên cứu tiếp theo về vấn đề này có thể tập trung triển khai theo hƣớng phân tích và tìm hiểu sâu hơn nữa về các kỹ thuật kiểm thử cấu trúc chƣơng trình cũng nhƣ các thuật toán áp dụng theo phƣơng pháp kiểm thử dựa tìm kiếm, phát huy kết quả nghiên cứu đó để áp dụng thực tế cho các đề tài và dự án phát triển phần mềm, đồng thời cũng có thể làm tài liệu tham khảo cho các cơ sở đang tiến tới đƣa quy trình kiểm thử phần mềm thành một quy trình bắt buộc trong dự án phát triển phần mềm của họ.
TÀI LIỆU THAM KHẢO
1. Cem Kaner, Jack Falk, Nguyen Quoc Hung. (1999), "Testing Computer Software", John Wiley & Sons, Inc., p.27-141.
2. Chayanika Sharma, Sangeeta Sabharwal, Ritu Sibal. (January 2013),"A Survey on Software Testing Techniques using Genetic Algorithm, IJCSI
International Journal of Computer Science Issues, Vol. 10, Issue 1, No 1.
3. Copeland Lee. (2003),"A practitioner’s guide to software test design",
Artech House, Inc., Norwood, MA, USA.
4. Ernest Wallmuller. (1994), "Software Qulity Assurance - A Practical Approach", Prentice Hall Internetional (UK) Ltd.
5. Eugenia Diaz, Javier Tuya, Raquel Blanco, Jose Javier Dolado.(2008), "A tabu search algorithm for structural software testing", Computers and
Operations Research, Vol. 14, No. 3, pp. 38-69.
6. George F. Luger, William A. (1997),Stubblefield - Albuquerque - Artificial
Intelligence - Wesley Publishing Company, Inc., (Chapter 4).
7. M. S. Geetha Devasena, M. L. Valarmathi.(February 2012), "Search based Software Testing Technique for Structural Test Case Generation",
International Journal of Applied Information Systems (IJAIS) Foundation of
Computer Science FCS, New York, USA, Volume 1–
No.6,http://www.ijais.org.
8. Phil McMinn, "Search-Based Software Testing: Past, Present and Future". 9. Ron Patton.(2005), Software Testing, 2nd Edition, SAMS.
10. Steve Cornett. (1996-2007),"Code Coverage Analysis", Bullseye Testing
Technology, http://www.bullseye.com/coverage.html.
11. GS.TSKH Hoàng Kiếm, Chƣơng III, mục 3.1 Leo đồi đơn giản, Giáo trình "Thuật Toán Thuật Giải".
12. GS.TSKH Hoàng Kiếm, Chƣơng III, mục 3.2 Leo đồi dốc đứng, Giáo trình "Thuật Toán Thuật Giải".
13. PGS.TS Từ Minh Phƣơng, Chƣơng II, mục 2.5.1 Đặc điểm của leo đồi, Bài giảng "Nhập môn trí tuệ nhân tạo".
PHỤ LỤC
1. Mã nguồn chung của ba thuật toán:
Để thực hiện chung ba thuật toán là: thuật toán leo đồi, thuật toán leo đồi dốc đứng và thuật toán Tabu-search ta sử dụng ba class chung.
Lớp Node: để định nghĩa các giá trị của node và node cha của nó.
package com.search.algorithm;
import java.util.ArrayList;
publicclass Node {
int nodeId; }
Lớp Triangle: định nghĩa mảng lƣu của các số ngẫu nhiên và giá của của các số ngẫu nhiên đó.
package com.search.algorithm;
publicclass Triangle {
publicdouble cost;
publicdouble[] arr;
public Triangle(double cost, double [] arr) {
this.cost = cost;
this.arr = arr; }
public Triangle() {
// TODO Auto-generated constructor stub }
public Triangle(double [] arr) {
this.arr = arr; }
Class Library: định nghĩa các hàm dùng chung.
package com.search.algorithm;
import java.util.LinkedList;
publicclass Library {
finalfloatTEMP = 1;
finalfloatNB_A = 30; // s(namda)
finalfloatNB_B = 40;// s(nuy)
finalintMAX = 90000; // so dedungvong lap neusaubaonhieuvong lap van