TSP-Metaheuristics: Giải bài toán Người giao hàng bằng Tabu Search, Simulated Annealing và Guided Local Search
Dự án này cài đặt ba thuật toán metaheuristic kinh điển cho bài toán người giao hàng đối xứng (Symmetric TSP):
- Tabu Search (TS)
- Simulated Annealing (SA)
- Guided Local Search (GLS)
Tất cả đều sử dụng phép biến đổi 2-opt và được đánh giá trên các bộ dữ liệu chuẩn từ TSPLIB. Dưới đây trình bày chi tiết mô hình toán học của bài toán, các thuật toán, tham số cài đặt và kết quả thực nghiệm.
- Mô hình bài toán TSP
- Toán tử 2-opt
- Mô hình các thuật toán
- Cấu trúc dự án
- Cài đặt và thực nghiệm
- Kết quả thực nghiệm
- Giấy phép
Cho tập hợp
Mục tiêu là tìm
với
Cho hai chỉ số
Nếu
Tabu Search là phương pháp tìm kiếm dựa trên bộ nhớ ngắn hạn nhằm vượt khỏi cực trị địa phương. Gọi
Tại mỗi bước, thuật toán chọn bước di chuyển
với
Tham số thực nghiệm:
max_iter = 800– số vòng lặp tối đa.tabu_tenure = 20– số vòng lặp một bước di chuyển bị cấm.
Simulated Annealing mô phỏng quá trình ủ kim loại, cho phép chấp nhận bước di chuyển xấu với xác suất giảm dần theo nhiệt độ
Lịch làm lạnh hình học:
Tham số thực nghiệm:
-
init_temp = 2000– nhiệt độ ban đầu. -
final_temp = 0.1– nhiệt độ kết thúc. -
cooling_rate = 0.999– hệ số$\alpha$ . -
inner_iter = 150– số bước lặp tại mỗi mức nhiệt.
Guided Local Search đưa các khoản phạt vào hàm mục tiêu để hướng tìm kiếm tránh các đặc trưng (features) không mong muốn. Trong TSP, mỗi cạnh
trong đó
Các cạnh có utility lớn nhất sẽ bị phạt:
Tham số thực nghiệm:
max_iter = 500– số lần gọi local search.lambda_factor = 0.4– hệ số nhân.
.
├── main.py # Chạy thực nghiệm, in bảng kết quả
├── algorithms/
│ ├── tabu_search.py # Cài đặt TS
│ ├── simulated_annealing.py # Cài đặt SA
│ └── guided_local_search.py # Cài đặt GLS
├── utils/
│ ├── math_utils.py # totalDistance, twoOptSwap, randomTour
│ └── data_loader.py # Đọc file TSPLIB (định dạng EUC_2D)
└── data/ # Thư mục chứa các file .tsp
- Yêu cầu: Python 3.10 trở lên, không cần thư viện ngoài.
- Clone dự án:
git clone [https://github.com/yourusername/TSP-Metaheuristics.git](https://github.com/yourusername/TSP-Metaheuristics.git)
cd TSP-Metaheuristics
- Chạy thực nghiệm:
python main.py
(Đảm bảo các file .tsp nằm trong thư mục data/ với tên như trong main.py)
4. Tùy chỉnh: Sửa số lần chạy (NUM_RUNS), danh sách instance hoặc tham số thuật toán trực tiếp trong các file tương ứng.
Thực hiện 5 lần chạy cho mỗi thuật toán trên 6 instance TSPLIB. Các chỉ số: Best (tốt nhất), Avg (trung bình), Std (độ lệch chuẩn), Time(s) (thời gian trung bình), Gap(%) = (Best – Optimal)/Optimal × 100.
| Instance | Optimal | TS Best | SA Best | GLS Best | TS Avg (Std) | SA Avg (Std) | GLS Avg (Std) | TS Gap | SA Gap | GLS Gap |
|---|---|---|---|---|---|---|---|---|---|---|
| eil51 | 426 | 442 | 430 | 428 | 456.4 (10.2) | 435.2 (4.4) | 429.6 (1.1) | 3.76% | 0.94% | 0.47% |
| st70 | 675 | 694 | 675 | 679 | 716.0 (23.4) | 682.6 (4.6) | 680.4 (0.9) | 2.81% | 0.00% | 0.59% |
| kroA100 | 21282 | 22479 | 21346 | 21424 | 23224.2 (727) | 21465.8 (94.7) | 21523.4 (88.2) | 5.62% | 0.30% | 0.67% |
| pr144 | 58537 | 59168 | 58554 | 59356 | 59619.0 (451) | 58690.0 (102) | 59832.8 (425) | 1.08% | 0.03% | 1.40% |
| d198 | 15780 | 16306 | 16139 | 16197 | 16450.0 (172) | 16235.8 (62.3) | 16293.2 (82.5) | 3.33% | 2.28% | 2.64% |
| lin318 | 42029 | 44415 | 44267 | 44418 | 44950.4 (746) | 44919.4 (586) | 44810.2 (311) | 5.68% | 5.32% | 5.68% |
Ghi chú: Giá trị in đậm là kết quả tốt nhất cho instance đó.
Dự án được phân phối theo giấy phép MIT. Xem file LICENSE để biết thêm chi tiết.