Bảng 3.1 Giới thiệu môi trường phần mềm triển khai thực nghiệm bài toán TSP cho luận văn. Trong phần thực nghiệm tác giả sử dụng hệ điều hành mã nguồn mở Ubuntu 12.04, Ubuntu 13.04 làm môi trường nền.
Bảng 3.1 Các gói phần mềm được cài đặt và cấu hình chạy TSP
tt Phàn mềm Phiên bản
1 PostGres 9.1
2 PostGIS 2.05
3 pgRouting 2.0
4 Osm2pgrouting 2.0
a) Hệ quản trị CSDL Postgres: làm nhiệm vụ tạo môi trường thực thiện bài toán bằng
cách chứa dữ liệu, tổ chức kiến trúc CSDL, và xử lý dữ liệu cấp thấp.
b) Moudle PostGIS: làm nhiệm vụ cung cấp các hàm chuyên xử lý dữ liệu không gian.
Cho phép biểu diễn kiểu dữ liệu không gian, node, ways, … để tổ chức dữ liệu bản đồ, phục vụ thực nghiệm bài toán TSP.
c) pgRouing: Gói thư viện phần mềm mở rộng của PostGIS được viết trên ngôn ngữ C. pgRouting chứa các hàm giải quyết bài toán về tìm đường đi (routing), tính toán chi phí (cost), đường đi (path) trong hệ thống csdl thông tin địa lý. Các hàm cơ bản của pgRouting trình bày trong bảng 3.2.
Bảng 3.2 Một số hàm routing điển hình trong pgRouting
tt Hàm routing Chú giải
1 pgr_tsp Bài toán TSP trên pgRouting
2 pgr_astar Tìm kiếm theo giải thuật A* 3 pgr_makedistancematrix Tính Matrix
4 pgr_dijkstra Thuật toán dijkstra 5 pgr_kdijkstrapath Thuật toán kdijkstra 6 pgr_bdastar Thuật toán bdastar
7 pgr_trsp Thuật toán trsp
- Hàm pgr_tsp cho phép thực hiện hiện bài toán tsp. Hàm được cài đặt dựa trên thuật toán GA nhưng không biết chính xác giải thuật cụ thể. Hàm pgr_tsp cho phép tìm ra đường đi TSP với một giá trị xấp xỉ (theo giải thuật xấp xỉ) .
Các hàm pgr_tsp trong pgRouting:
o Hàm : pgr_costResult[] pgr_tsp(sql text, start_id integer);
Thực hiện giải thuật TSP với các đối số đầu vào là một điểm bắt đầu và đi tới tất cả các điểm được chỉ ra trong câu lệnh SQL. Điểm đặc biệt trong hàm này là cho phép chỉ ra đường đi tới tất cả các node nhưng không quay lại node ban đầu
Ví dụ:
o pgr_costResult[] pgr_tsp(sql text, start_id integer, end_id integer);
Thực hiện giải thuật TSP với các đối số đầu vào là một điểm bắt đầu và đi tới tất cả node được chỉ ra trong câu lệnh SQL. Bắt đầu từ start_id và kết thúc là end_id. Nếu start_id trùng end_id sẽ được chu trình haminton.
Ví dụ:
o pgr_costResult[] pgr_tsp(„array node‟, start_id integer, end_id integer); Thực
hiện giải thuật TSP với các đối số đầu vào là một điểm bắt đầu và đi tới tất cả node còn lại trong mảng. Bắt đầu từ start_id và kết thúc là end_id. Nếu start_id trùng end_id sẽ được chu trình hamilton.
Giải thích:
pgr_costResult: Kết quả trả về của hàm pgr_tsp
• seq: thứ tự thực hiện.
• id1: chỉ số trong của ma trận khoảng cách.
• id2: id của node.
• cost: chi phí đi tới node tiếp theo.
sql: tập các node( id, x,y) thực hiện giải thuật TSP.
start_id: node bắt đầu
end_id: node kết thúc
Các hàm hỗ trợ xử lý dữ liệu trong pgRouting
o pgr_createtopolog: thiết lập Topology cho dữ liệu không gian
Dữ liệu GIS được nhập vào trong CSDL sẽ không chứa các thông tin topology ( các ràng buộc đối tượng trong bản đồ) để thực hiện các truy vấn không gian thông qua việc sử dụng các hàm pgRouting. Các hàm pgRouting cần các thông tin về nodes (điểm) và ways(tuyến đường) để thực thi các hàm routing trên dữ liệu đã được tạo. pgRouting cung cấp hàm xây dựng topology.
Giao cắt giữa các tuyến đường
Vị trí đặt các điểm trên tuyết đường
Tính chất tuyến đường: một chiếu, hai chiều, đường cấm… Hàm CreateTopology:
varchar pgr_createTopology (varchar geom_table, double precision tolerance, varchar geo_cname, cvarchar gid_cname);
Các đối: được thể hiện trong bảng 3.3.
Bảng 3.3: Các đối trong câu lệnh truy vấn SQL
tt Đối Kiểu Mô tả
1 geom_table Varchar Tên bảng thực hiện truy vấn 2 Tolerance float8 khoảng sai số cho phép
3 geo_cname Varchar Tên thuộc tính geometry trong bảng goem_table 4 gid_cname Varchar Tên thuộc tính khóa chính trong bảng geom_table
Ví dụ:
SELECT pgr_createTopology('edge_table', 0.000001, 'the_geom', 'id'); pgr_createtopology
--- OK (1 row)
Bảng geom_table: Chứa các thông tin về các tuyến đường trong đồ thị. Hỗ trợ cho các hàm routing thực hiện thuật toán. Bảng này giải quyết các vấn đề cần thiết trong hàm routing như tập các cung nối node i tới node j.
o pgr_nodenetwork: chỉ ra mạng lưới các node(địa điểm) trên bản đồ
Vấn đề trong dữ liệu thực tế là vị trí các node không thật sự chính xác. Nên việc sử dụng các hàm routing trở nên không đúng như trong việc dựng topology. Như các điểm node giao cắt gữa hai tuyến đường sẽ không được biểu diễn. Nếu được biểu diễn có thể tìm được các kết quả tốt hơn. Hơn nữa việc định vị các node trên các tuyến đường cũng khó có thể chính xác được. Việc giao cắt giữa các tuyến đường sẽ chia các tuyến đường thành các đoạn đường nhỏ hơn cũng chưa được ghi nhận vào trong CSDL. Đôi khi gặp các tuyến đường trên thực tế là không có giao cắt (giao cắt được xử lý bằng cầu vượt) nhưng nhìn trong bản đồ là có giao cắt. Các trường hợp tương tự đều được pgr_nodenetwork xử lý để có một topology tốt cho các bài toán routing.
Hàm pgr_nodenetwork: Tạo các điểm giao cắt giữa các tuyến được đưa vào một bảng mới.
text pgr_nodeNetwork(text table_in, text gid_cname, text geo_cname,
text table_out, double precision tolerance)
Các đối:
tt Đối Kiểu Mô tả
1 edge_table bảng tuyến đường (các cung trong đồ thị) 2 Tolerance float8 độ sai số giữa các điểm trên tuyến đường 3 Id text khóa chính trong network_table
4 the_geom: text thuộc tính Geometry trong bảng network table. 5 table_ending text hậu tố của bảng kết quả.
Kết quả: bảng được mô tả
tt Đối Kiểu Mô tả
1 Id Bigint Khóa chính
2 old_id bigint Id của cung cũ
3 sub_id integer Id cung/tuyến con bị chia cắt 4 Source Integer Bắt đầu tuyến con
5 target: integer Kết thúc tuyến con
the geom: geometry Thuộc tính Geometry tuyến con
Ví dụ: sử dụng hàm pgr_nodeNetwork tạo ra các điểm giao giữa các tuyến đường SELECT pgr_nodeNetwork('edge_table', 0.001);
NOTICE: PROCESSING:
NOTICE: pgr_nodeNetwork('edge_table',0.001,'the_geom','id','noded') NOTICE: Performing checks, pelase wait ...
NOTICE: Processing, pelase wait ... NOTICE: Splitted Edges: 3
NOTICE: Untouched Edges: 15 NOTICE: Total original Edges: 18 NOTICE: Edges generated: 6 NOTICE: Untouched Edges: 15
NOTICE: Total New segments: 21
NOTICE: New Table: public.edge_table_noded NOTICE: ---
pgr_nodenetwork
--- OK(1 row)