Các chức năng chính của chương trình

Một phần của tài liệu Báo cáo thực tập cơ sở thuật toán Floyd (Trang 25)

Công cụ vẽ đồ thị:

+ Di chuyển: Dùng để di chuyển các đỉnh của đồ thị để chỉnh trọng số của các đỉnh.

Hình 3.2 Công cụ vẽ

+ Vẽ đỉnh: Tạo các đỉnh cho đồ thị, chương trình sẽ tự động tạo đỉnh với tên theo thứ thự alphabet. Do vậy ta không cần phải đặt tên cho từng đỉnh.

+ Vẽ cạnh: Tạo các cạnh cho đồ thị.

+ Xóa: Xóa 1 đỉnh nào đó nếu ta nháy chuột vào.

Công cụ chỉnh sửa và hỗ trợ vẽ đồ thị: + Xóa cạnh mới nhất: Xóa cạnh vừa mới tạo.

+ Xóa cạnh: Xóa toàn bộ cạnh của đồ thị. + Xóa tất cả: Xóa toàn bộ đồ thị.

+ Đồ thị vô hướng: Khi ta tích vào thì đồ thị chuyển thành đồ thị vô hướng. Các cạnh của đồ thị hiện bên cạnh sẽ không còn mũi tên chỉ chiều nữa.

+ Xóa đỉnh: Xóa đỉnh hiện tại đang được chọn.

+ Đổi màu: Đổi màu cho đỉnh đang được chọn. Đổi màu để đánh dấu các đỉnh, tùy vào mục đích của người dùng chương trình.

Hình 3.3 Truy xuất kết quả:

+ Từ: Đỉnh ban đầu. + Đến: Đỉnh kết thúc.

+ Bắt đầu: Chương trình sẽ thực hiện tìm đường đi ngắn nhất giữa đỉnh ban đầu và đỉnh kết thúc, sau đó đưa ra kết quả.

Sau khi chạy thì ta được kết quả hiện đường đi ngắn nhất giữa cặp đỉnh đã chọn :

Hình 3.5 3.4 Cài đặt – thử nghiệm

Chương trình được cài đặt bằng Visual studio C#. Ta sử dụng ma trận kề với giá trị

data[i,j] = -1 để biểu diễn không có đường đi giữa hai đỉnh ij. Sau đó tạo thêm một mảng 2 chiều FloydData để lưu kết quả sau quá trình thực hiện thuật toán Floyd.

public void Floyd() {

if (Data == null) return;

int n = Data.GetLength(0);

FloydData = new MatrixCell[n, n]; for (int i = 0; i < n; i++)

for (int j = 0; j < n; j++)

FloydData[i, j] = new FloydCell(Data[i, j]); for (int i = 0; i < n; i++)

{ for (int j = 0; j < n; j++) { if (FloydData[j, i].Value > 0) { for (int k = 0; k < n; k++)

{

if (FloydData[i, k].Value > 0) { if (FloydData[j, k].Value < 0 || FloydData[j, i].Value + FloydData[i, k].Value < FloydData[j, k].Value) {

FloydData[j, k].Value = FloydData[j, i].Value + FloydData[i, k].Value; FloydData[j, k].Previous = i; } } } } } } } FloydCell là một cấu trúc được định nghĩa để lưu trữ giá trị trọng số của cạnh và đỉnh trung gian: struct FloydCell { public int Previous; public int Value; public FloydCell(int value) : this(-1, value) { }

public FloydCell(int previous, int value) {

this.Previous = previous; this.Value = value; }

} Lý do ta cần phải lưu lại đỉnh trung gian là để lấy được đường đi qua các đỉnh từ đỉnh bắt đầu đến kết thúc. Lấy đường đi ngắn nhất giữa hai đỉnh: List<Point> _path = new List<Point>(); // […] void GetPath(int x,int y) { if(_matrix.FloydData[x,y].Value== -1) return; int i=_matrix.FloydData[x,y].Previous; if(i== -1) {

_path.Add(new Point(x+1,y+1)); return; } else { GetPath(x,i); _path.Add(new Point(_preNodeIndex+1,i+1)); _preNodeIndex=i; GetPath(i,y); } }

Phương thức GetPath() trên sẽ tạo ra đường đi giữa hai đỉnh x, y và lưu vào trong danh sách _path. Giá trị của FloydData[x,y].Previous sẽ trả về đỉnh trung gian giữa hai đỉnh

x,y và nếu giá trị này bằng -1 tức là có một cạnh nối trực tiếp giữa hai đỉnh này. Ngược lại ta chia đường đi thành hai phần và thực hiện đệ quy để lấy đường đi của từng phần này.

Chạy thử nghiệm:

Chạy thử nghiệm chương trình với bài toán như sau:

Hình 3.6 Bài toán thử nghiệm

Với bài toán này, ta có ma trận trọng số như sau:

- Tìm đường đi ngắn nhất từ đỉnh A đến đỉnh F: Kết quả chạy chương trình:

Hình 3.7 Kết quả chạy chương trình

Ta thấy kết quả là: A -> C -> D -> B -> F

Ma trận trọng số được tính lại và hiện lên như hình trên.

- Nếu ta thực hiện tìm đường đi ngắn nhất từ một đỉnh đến một đỉnh khác mà không có đường đi nào đến đỉnh đó thì chương trình sẽ hiển thị lên thông báo. VD: Đỉnh ban đầu là F, đỉnh đến là C thì chương trình sẽ đưa ra dòng thông báo:

Hình 3.8 Dòng thông báoKẾT LUẬN

Qua đề tài đã thực hiện trong thời gian qua, em đã nắm bắt được cơ bản kiến thức về lý thuyết đồ thị, các thuật toán để giải quyết các vấn đề về tìm đường đi ngắn nhất. Nghiêm cứu về nguyên lý và cách mà thuật toán thực hiện, em hiểu thêm về tầm quan trọng của lý thuyết đồ thị đến việc áp dụng giải quyết các vấn đề thực tiễn.

Do hạn chế về thời gian nên kiến thức mà em tìm hiểu được còn thiết sót, cần được bổ sung và em mới tìm hiểu về đồ họa trong ngôn ngữ C# nên chưa thể thành thạo, chưa có kiến thức chuyên sâu được. Em rất mong nhận được sự góp ý, hướng dẫn của Thầy Cô để em có kiến thức hoàn thiện hơn.

Một lần nữa em xin chân thành cảm ơn cô DƯƠNG THỊ MAI THƯƠNG đã tận tình chỉ bảo em để em hoàn thành đề tài này.

Em xin chân thành cảm ơn!

Thái Nguyên, tháng 04, năm 2013

Sinh viên thực hiện

TÀI LIỆU THAM KHẢO

1. Toán rời rạc, tác giả: Nguyễn Đức Nghĩa, Nguyễn Tô Thành, NXB Giáo Dục 2. Toán ứng dụng, Trường cao đẳng nghề CNTT iSPACE

3. http://www. yinyangit.wordpress.com/ 2013/03/21/y2–visual-graph–minh-họa-việc- biểu-diễn-dồ-thị-bằng-gdi/

NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN ……… ……… ……….. ……… ……… ……….. ……… ……… ……… ……… ……… ……….. ……… ……… ……….. ……… ……… ……….. ……… ……… ………..

Một phần của tài liệu Báo cáo thực tập cơ sở thuật toán Floyd (Trang 25)