[Có] [Có]
[Không]
[Không]
Hiển thị đường đi ngắn nhất trên
bản đồ
Thông báo “Không tồn tại đường đi giữa hai
điểm đó” Tìm kiếm ? (C/K) [Nhập trực tiếp] Lựa chọn tìm kiếm Nhập - Điểm xuất phát - Điểm đến Kích chọn - Điểm xuất phát - Điểm đến
Tìm đường đi giữa hai điểm có khoảng
cách ngắn nhất
Liệt kê các đường đi có cùng khoảng
cách ngắn nhất
3.6 Cài đặt và thử nghiệm chương trình
3.6.1 Cài đặt
Chương trình được phát triển bằng cách sử dụng công cụ MapXtreme v6.6 nhúng trong môi trường Visual C# . NET.
Chương trình chạy trên hệ điều hành Window XP. Máy tính tốc độ
1,73 GHz, bộ nhớ 512MB RAM.
3.6.2 Kỹ thuật áp dụng
Hiển thị bản đồ:
- Sử dụng phần mềm hỗ trợ MapXtreme v6.6 để hiển thị bản đồ mạng lưới tuyến xe buýt Hà Nội từ hai bảng cơ sở dữ liệu định dạng MapInfo. Hai bảng dữ liệu này tạo thành hai lớp bản đồ:
+ Tập tin Diem_chuyen.TAB: là lớp Diem_chuyen, hiển thị các hình tròn màu vàng, biểu diễn cho các điểm dừng xe buýt.
+ Tập tin Xe_buyt.TAB: lớp Xe_buyt, hiển thị các đường màu nâu nối các điểm, biểu diễn cho các tuyến xe buýt.
Cách chuyển đổi dữ liệu vào chương trình để xây dựng đồ thị
Từ dữ liệu cho trước theo định dạng MapInfo có thể xây dựng thành đồ
thị như sau:
- Các điểm dừng xe buýt (tương ứng với bảng dữ liệu Diem_chuyen) là tập các điểm của đồ thị. Các điểm này có tọa độ và có các thuộc tính như số thứ
tự và tên của từng điểm dừng xe buýt.
- Để xây dựng các cạnh đồ thị, tức là đường nối hai điểm xe buýt liền kề
thì có thể xây dựng một bảng cơ sở dữ liệu Access (bảng Duong_Xe) trong đó thuộc tính Khoang_cach biểu diễn độ dài khoảng cách hai điểm liền kề trong đồ
thị, tức là khoảng cách hai điểm xe buýt gần kề trong cùng tuyến xe buýt.
Đoạn mã xây dựng đồ thị như sau:
private void khoiTaoDoThi()
{
for(int i =0; i < danhSachDiem.Length;i++) for (int j = 0; j < danhSachDiem.Length; j++) {
if (DoThi[i, j] == null) {
DoThi[i,j]=new clsKhoangCach(danhSachDiem[i],danhSachDiem[j]); }
DoThi[i,j]=khoiTaoKhoangCach(danhSachDiem[i],danhSachDiem[j]); }
}
Trong đó, các biến được khai báo như sau:
clsBenXe[] danhSachDiem;
clsKhoangCach[,] DoThi;// chua khoang cach cac dinh Trong đó, lớp clsKhoangcach được định nghĩa như sau:
class clsKhoangCach
{
public static float MaxValue =float.MaxValue;
clsBenXe diemNguon;
clsBenXe diemDich;
public string tuyenXe;
public float doDai;
public clsKhoangCach(clsBenXe diemDau, clsBenXe diemCuoi) { diemNguon = diemDau; diemDich = diemCuoi; doDai = MaxValue; } }
Lớp clsBenxe được định nghĩa như sau:
class clsBenXe
{
public string ten;// Tên bến xe
public string tuyen;// các tuyến xe đi qua public bool isKiemTra;
public int thuTu; // thu tu cua diem trong danh sach
public int ID; // id cua ben xe trong csdl bang diem_chuyen public clsBenXe diemTruoc;
public clsBenXe() { ID = -1; ten = ""; tuyen = ""; isKiemTra = false; } }
Áp dụng thuật toán tìm đường đi vào đồ thị
Đây là đoạn mã lệnh áp dụng thuật toán tìm đường đi Dijkstra đã được trình bày trong chương 2:
private void giaiThuatDijkstra(clsBenXe diemDau) {
for (int i = 0; i < danhSachDiem.Length; i++) {
danhSachDiem[i].isKiemTra = false; danhSachDiem[i].diemTruoc = diemDau; }
diemDau.isKiemTra = true;// dua vao tap set //diemDau.diemTruoc = diemDau; int SoDiemChuaXet = danhSachDiem.Length - 1; while (SoDiemChuaXet > 0)
{
// tim diem ngan nhat chua xet toi diemDau clsBenXe diemMin = new clsBenXe();
for (int i = 0; i < danhSachDiem.Length; i++) {
if (!danhSachDiem[i].isKiemTra) {
if (diemMin.ten == "") diemMin = danhSachDiem[i]; if (DoThi[diemDau.thuTu,i].doDai < DoThi[diemDau.thuTu,diemMin.thuTu].doDai) { diemMin = danhSachDiem[i]; } } } diemMin.isKiemTra = true; SoDiemChuaXet--;
for (int i = 0; i < danhSachDiem.Length; i++) {
if((!danhSachDiem[i].isKiemTra)&&(DoThi[diemDau.thuTu,i].doDai > DoThi[diemDau.thuTu,diemMin.thuTu].doDai +
DoThi[diemMin.thuTu,i].doDai)) {
DoThi[diemDau.thuTu, i].doDai = DoThi[diemDau.thuTu, diemMin.thuTu].doDai + DoThi[diemMin.thuTu, i].doDai; danhSachDiem[i].diemTruoc = diemMin; DoThi[diemDau.thuTu, i].tuyenXe = DoThi[diemMin.thuTu, i].tuyenXe; } } } }
3.6.3 Các kết quả thử nghiệm
3.6.3.1 Kết quả bước đầu
Chương trình “Tìm kiếm đường đi ngắn nhất giữa hai điểm xe buýt trong mạng lưới tuyến xe buýt Hà Nội” chạy trên môi trường WinXP khá ổn định.
Giao diện chính của chương trình (hình 3.2)