Tối ưu đội xe (VRP)
Bài toán của người điều phối: n xe, m điểm giao. API quyết định xe nào đi điểm nào, theo thứ tự nào — trong giới hạn tải trọng, khung giờ và giờ làm việc.
Kịch bản: Giao hàng chặng cuối — 1 kho, 3 xe, 8 khách
Bài toán hay gặp nhất: một kho, nhiều xe, một ngày đơn lẻ. Hai xe tải nhỏ chở tối đa 12 thùng và một xe nhỏ chở 4 thùng; 8 khách cần tổng 18 thùng, mỗi điểm dừng 5–15 phút, bốn khách hẹn giờ nhận (sáng hoặc chiều). Nhìn kết quả: bộ giải tự chia 8 đơn cho 3 xe, tên khách hiện thẳng trên từng chặng, giờ tới nằm trong khung khách hẹn, và đường trên bản đồ là lộ trình thật xe chạy. Thử đổi "Đường đi tính theo" sang Xe máy để thấy quãng đường ngắn lại — lưu ý cả đội phải cùng một hồ sơ.
- API trả về routes — mỗi xe một lộ trình, gồm các chặng theo đúng thứ tự chạy, kèm thời điểm tới và lượng hàng còn trên xe sau mỗi chặng.
- Đơn nào không xe nào nhận được sẽ nằm ở unassigned thay vì làm hỏng cả lời giải — đó là cách biết mình thiếu xe hay đặt ràng buộc quá chặt.
Đơn hàng (8)
Tên này được API trả lại trên từng chặng, dễ đọc hơn mã đơn
Nhập "vĩ độ, kinh độ" hoặc bấm biểu tượng để chọn trên bản đồ
Hàng chất sẵn trên xe từ kho, dỡ xuống tại điểm này
Hàng gom tại điểm này rồi mang ngược về kho
Thời gian xe đứng lại để giao nhận, tính vào tổng hành trình
Để trống nếu nhận giờ nào cũng được; tới sớm thì xe phải chờ
0 = bỏ được nếu thiếu xe · 10 = phải giao bằng được
Chỉ xe đúng loại mới nhận được đơn này
Xe (3)
Hiện trên lộ trình thay cho "Xe #1"
Nhập "vĩ độ, kinh độ" hoặc bấm biểu tượng để chọn trên bản đồ
Tổng hàng trên xe không được vượt mức này
Để trống nếu chạy giờ nào cũng được
Quyết định xe nhận được những đơn nào
Quay về kho thì quãng đường tính cả chặng về
Hiện trên lộ trình thay cho "Xe #1"
Nhập "vĩ độ, kinh độ" hoặc bấm biểu tượng để chọn trên bản đồ
Tổng hàng trên xe không được vượt mức này
Để trống nếu chạy giờ nào cũng được
Quyết định xe nhận được những đơn nào
Quay về kho thì quãng đường tính cả chặng về
Hiện trên lộ trình thay cho "Xe #1"
Nhập "vĩ độ, kinh độ" hoặc bấm biểu tượng để chọn trên bản đồ
Tổng hàng trên xe không được vượt mức này
Để trống nếu chạy giờ nào cũng được
Quyết định xe nhận được những đơn nào
Quay về kho thì quãng đường tính cả chặng về
Mỗi màu là một xe. Đường nối là các chặng giữa các điểm dừng, không phải hình dạng đường thật.
Code mẫu
curl -X POST 'https://maps.vietmap.vn/api/vrp?api-version=1.1&apikey=YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"jobs": [
{
"id": 1,
"location": [
106.70592,
10.79628
],
"service": 600,
"description": "Cửa hàng Bình Thạnh",
"delivery": [
3
],
"time_windows": [
[
28800,
39600
]
]
},
{
"id": 2,
"location": [
106.7066,
10.80189
],
"service": 900,
"description": "Siêu thị mini Điện Biên Phủ",
"delivery": [
4
]
},
{
"id": 3,
"location": [
106.68982,
10.80159
],
"service": 600,
"description": "Quán ăn Phú Nhuận",
"delivery": [
2
],
"time_windows": [
[
32400,
43200
]
]
},
{
"id": 4,
"location": [
106.695,
10.785
],
"service": 300,
"description": "Nhà khách Quận 3",
"delivery": [
1
]
},
{
"id": 5,
"location": [
106.712,
10.7905
],
"service": 600,
"description": "Kho lẻ Thủ Đức",
"delivery": [
3
],
"time_windows": [
[
46800,
57600
]
]
},
{
"id": 6,
"location": [
106.6835,
10.7925
],
"service": 300,
"description": "Tiệm tạp hoá Gò Vấp",
"delivery": [
2
]
},
{
"id": 7,
"location": [
106.6961,
10.7826
],
"service": 600,
"description": "Nhà hàng Nguyễn Đình Chiểu",
"delivery": [
2
],
"time_windows": [
[
50400,
61200
]
]
},
{
"id": 8,
"location": [
106.7047,
10.7877
],
"service": 300,
"description": "Chung cư Bình Thạnh",
"delivery": [
1
]
}
],
"vehicles": [
{
"id": 1,
"description": "Xe tải nhỏ 1",
"profile": "car",
"start": [
106.7,
10.79
],
"end": [
106.7,
10.79
],
"capacity": [
12
]
},
{
"id": 2,
"description": "Xe tải nhỏ 2",
"profile": "car",
"start": [
106.7,
10.79
],
"end": [
106.7,
10.79
],
"capacity": [
12
]
},
{
"id": 3,
"description": "Xe giao hàng nhỏ",
"profile": "car",
"start": [
106.7,
10.79
],
"end": [
106.7,
10.79
],
"capacity": [
4
]
}
]
}'Thay YOUR_API_KEY bằng API key của bạn trước khi chạy.
// Khi đưa vào sản phẩm, đọc key từ biến môi trường thay vì ghi cứng.
const API_KEY = "YOUR_API_KEY";
const params = new URLSearchParams([
["api-version", "1.1"],
["apikey", API_KEY],
]);
const body = {
"jobs": [
{
"id": 1,
"location": [
106.70592,
10.79628
],
"service": 600,
"description": "Cửa hàng Bình Thạnh",
"delivery": [
3
],
"time_windows": [
[
28800,
39600
]
]
},
{
"id": 2,
"location": [
106.7066,
10.80189
],
"service": 900,
"description": "Siêu thị mini Điện Biên Phủ",
"delivery": [
4
]
},
{
"id": 3,
"location": [
106.68982,
10.80159
],
"service": 600,
"description": "Quán ăn Phú Nhuận",
"delivery": [
2
],
"time_windows": [
[
32400,
43200
]
]
},
{
"id": 4,
"location": [
106.695,
10.785
],
"service": 300,
"description": "Nhà khách Quận 3",
"delivery": [
1
]
},
{
"id": 5,
"location": [
106.712,
10.7905
],
"service": 600,
"description": "Kho lẻ Thủ Đức",
"delivery": [
3
],
"time_windows": [
[
46800,
57600
]
]
},
{
"id": 6,
"location": [
106.6835,
10.7925
],
"service": 300,
"description": "Tiệm tạp hoá Gò Vấp",
"delivery": [
2
]
},
{
"id": 7,
"location": [
106.6961,
10.7826
],
"service": 600,
"description": "Nhà hàng Nguyễn Đình Chiểu",
"delivery": [
2
],
"time_windows": [
[
50400,
61200
]
]
},
{
"id": 8,
"location": [
106.7047,
10.7877
],
"service": 300,
"description": "Chung cư Bình Thạnh",
"delivery": [
1
]
}
],
"vehicles": [
{
"id": 1,
"description": "Xe tải nhỏ 1",
"profile": "car",
"start": [
106.7,
10.79
],
"end": [
106.7,
10.79
],
"capacity": [
12
]
},
{
"id": 2,
"description": "Xe tải nhỏ 2",
"profile": "car",
"start": [
106.7,
10.79
],
"end": [
106.7,
10.79
],
"capacity": [
12
]
},
{
"id": 3,
"description": "Xe giao hàng nhỏ",
"profile": "car",
"start": [
106.7,
10.79
],
"end": [
106.7,
10.79
],
"capacity": [
4
]
}
]
};
const response = await fetch(`https://maps.vietmap.vn/api/vrp?${params}`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(body),
});
if (!response.ok) {
throw new Error(`Vietmap ${response.status}: ${await response.text()}`);
}
const data = await response.json();
console.log(data);Thay YOUR_API_KEY bằng API key của bạn trước khi chạy.
import requests
# Khi đưa vào sản phẩm, đọc key từ biến môi trường thay vì ghi cứng.
API_KEY = "YOUR_API_KEY"
params = [
("api-version", "1.1"),
("apikey", API_KEY),
]
body = {
"jobs": [
{
"id": 1,
"location": [
106.70592,
10.79628,
],
"service": 600,
"description": "Cửa hàng Bình Thạnh",
"delivery": [
3,
],
"time_windows": [
[
28800,
39600,
],
],
},
{
"id": 2,
"location": [
106.7066,
10.80189,
],
"service": 900,
"description": "Siêu thị mini Điện Biên Phủ",
"delivery": [
4,
],
},
{
"id": 3,
"location": [
106.68982,
10.80159,
],
"service": 600,
"description": "Quán ăn Phú Nhuận",
"delivery": [
2,
],
"time_windows": [
[
32400,
43200,
],
],
},
{
"id": 4,
"location": [
106.695,
10.785,
],
"service": 300,
"description": "Nhà khách Quận 3",
"delivery": [
1,
],
},
{
"id": 5,
"location": [
106.712,
10.7905,
],
"service": 600,
"description": "Kho lẻ Thủ Đức",
"delivery": [
3,
],
"time_windows": [
[
46800,
57600,
],
],
},
{
"id": 6,
"location": [
106.6835,
10.7925,
],
"service": 300,
"description": "Tiệm tạp hoá Gò Vấp",
"delivery": [
2,
],
},
{
"id": 7,
"location": [
106.6961,
10.7826,
],
"service": 600,
"description": "Nhà hàng Nguyễn Đình Chiểu",
"delivery": [
2,
],
"time_windows": [
[
50400,
61200,
],
],
},
{
"id": 8,
"location": [
106.7047,
10.7877,
],
"service": 300,
"description": "Chung cư Bình Thạnh",
"delivery": [
1,
],
},
],
"vehicles": [
{
"id": 1,
"description": "Xe tải nhỏ 1",
"profile": "car",
"start": [
106.7,
10.79,
],
"end": [
106.7,
10.79,
],
"capacity": [
12,
],
},
{
"id": 2,
"description": "Xe tải nhỏ 2",
"profile": "car",
"start": [
106.7,
10.79,
],
"end": [
106.7,
10.79,
],
"capacity": [
12,
],
},
{
"id": 3,
"description": "Xe giao hàng nhỏ",
"profile": "car",
"start": [
106.7,
10.79,
],
"end": [
106.7,
10.79,
],
"capacity": [
4,
],
},
],
}
response = requests.post("https://maps.vietmap.vn/api/vrp", params=params, json=body, timeout=60)
response.raise_for_status()
print(response.json())Thay YOUR_API_KEY bằng API key của bạn trước khi chạy.
Tôi cần tích hợp VRP API (api-version 1.1) của Vietmap vào ứng dụng của mình.
Tài liệu chính thức: https://maps.vietmap.vn/docs/map-api/vrp/
Đây là một request mẫu đã chạy được trên Vietmap API Playground:
POST https://maps.vietmap.vn/api/vrp?api-version=1.1&apikey=YOUR_API_KEY
Body (JSON):
```json
{
"jobs": [
{
"id": 1,
"location": [
106.70592,
10.79628
],
"service": 600,
"description": "Cửa hàng Bình Thạnh",
"delivery": [
3
],
"time_windows": [
[
28800,
39600
]
]
},
{
"id": 2,
"location": [
106.7066,
10.80189
],
"service": 900,
"description": "Siêu thị mini Điện Biên Phủ",
"delivery": [
4
]
},
{
"id": 3,
"location": [
106.68982,
10.80159
],
"service": 600,
"description": "Quán ăn Phú Nhuận",
"delivery": [
2
],
"time_windows": [
[
32400,
43200
]
]
},
{
"id": 4,
"location": [
106.695,
10.785
],
"service": 300,
"description": "Nhà khách Quận 3",
"delivery": [
1
]
},
{
"id": 5,
"location": [
106.712,
10.7905
],
"service": 600,
"description": "Kho lẻ Thủ Đức",
"delivery": [
3
],
"time_windows": [
[
46800,
57600
]
]
},
{
"id": 6,
"location": [
106.6835,
10.7925
],
"service": 300,
"description": "Tiệm tạp hoá Gò Vấp",
"delivery": [
2
]
},
{
"id": 7,
"location": [
106.6961,
10.7826
],
"service": 600,
"description": "Nhà hàng Nguyễn Đình Chiểu",
"delivery": [
2
],
"time_windows": [
[
50400,
61200
]
]
},
{
"id": 8,
"location": [
106.7047,
10.7877
],
"service": 300,
"description": "Chung cư Bình Thạnh",
"delivery": [
1
]
}
],
"vehicles": [
{
"id": 1,
"description": "Xe tải nhỏ 1",
"profile": "car",
"start": [
106.7,
10.79
],
"end": [
106.7,
10.79
],
"capacity": [
12
]
},
{
"id": 2,
"description": "Xe tải nhỏ 2",
"profile": "car",
"start": [
106.7,
10.79
],
"end": [
106.7,
10.79
],
"capacity": [
12
]
},
{
"id": 3,
"description": "Xe giao hàng nhỏ",
"profile": "car",
"start": [
106.7,
10.79
],
"end": [
106.7,
10.79
],
"capacity": [
4
]
}
]
}
```
Tham số đang dùng:
- api-version = 1.1
Hãy viết code bằng [ngôn ngữ / framework của tôi] để gọi API này, với các yêu cầu:
1. Đọc API key từ biến môi trường VIETMAP_API_KEY, không ghi cứng trong code.
2. Truyền tham số qua query string đúng như request mẫu; tham số lặp lại (như `point`) phải giữ nguyên thứ tự.
3. Xử lý lỗi theo mã HTTP của Vietmap:
- 401: API key sai hoặc đã bị thu hồi.
- 403: key bị giới hạn theo domain / IP không khớp.
- 423: API chưa được bật cho consumer của key, HOẶC tài khoản hết credit — phân biệt bằng nội dung phản hồi (có cụm "exceeded credit" là hết credit).
- 429: vượt giới hạn tần suất — thử lại với backoff tăng dần.
4. Đặt timeout cho request, và định nghĩa kiểu dữ liệu (type / interface / dataclass) cho phản hồi.
Nếu không chắc tên một trường, tra trong tài liệu ở link trên thay vì đoán.Dán vào ChatGPT, Claude… để sinh code tích hợp. Prompt không bao giờ chứa API key của bạn.
https://tools.vietmap.vn/playground/vrp?sample=last-mileMở Playground với đúng các tham số này — dùng để gắn vào tài liệu hoặc gửi đồng nghiệp. Link không chứa API key.
VRP API là gì?
VRP API là gì?
VRP API (bài toán định tuyến đội xe) phân bổ nhiều điểm giao, điểm lấy cho nhiều xe cùng lúc, tôn trọng tải trọng từng xe, khung giờ của khách, kỹ năng xe (xe lạnh, xe tải lớn…) và độ ưu tiên. Kết quả là lộ trình của từng xe theo thứ tự chạy, kèm giờ đến và lượng hàng còn trên xe; những đơn không xếp được nằm trong unassigned để biết thiếu xe hay ràng buộc quá chặt.
Dùng để làm gì
- Lập tuyến giao hàng chặng cuối hằng ngày cho đội xe.
- Giao hàng theo khung giờ hẹn với khách.
- Lấy hàng ở điểm A, giao tới điểm B (shipments).
- Phân việc cho kỹ thuật viên theo kỹ năng.
Request mẫu
POST https://maps.vietmap.vn/api/vrp?api-version=1.1&apikey=YOUR_API_KEY
body: { "vehicles": [ { "id": 1, "start": [lng, lat], "capacity": [12] } ], "jobs": [ { "id": 1, "location": [lng, lat], "delivery": [2] } ] }Trang này có sẵn 10 kịch bản mẫu và nhập/xuất Excel để thử với dữ liệu thật.
Câu hỏi thường gặp về VRP API
- VRP là gì?
- VRP (Vehicle Routing Problem, bài toán định tuyến xe) là bài toán chia nhiều điểm giao, điểm lấy cho nhiều xe và sắp lộ trình từng xe sao cho tổng chi phí thấp nhất, trong khi vẫn tôn trọng các ràng buộc như tải trọng, khung giờ, kỹ năng xe. Đây là bài toán cốt lõi khi lập kế hoạch giao hàng chặng cuối.
- VRP API hỗ trợ những ràng buộc nào?
- Tải trọng từng xe, khung giờ của khách, kỹ năng xe, độ ưu tiên của đơn, và đơn lấy – giao (shipments) lấy hàng ở điểm A rồi giao tới điểm B.
- Vì sao có đơn nằm trong unassigned?
- Đơn đó không xếp được vào xe nào với các ràng buộc hiện tại — thường do thiếu xe, tổng hàng vượt tải trọng, hoặc khung giờ quá hẹp. Thử thêm xe, nới khung giờ hoặc tăng tải trọng rồi chạy lại.
- Dùng thử VRP API có mất phí không?
- Trên Playground có sẵn API key demo để gọi thử VRP API ngay trên trình duyệt, không cần đăng ký. Khi tích hợp vào sản phẩm, bạn đăng ký tài khoản VIETMAP để có API key riêng. Phí tính theo transaction, mỗi API quy đổi số request ra transaction theo tỉ lệ riêng; chi tiết và chương trình trải nghiệm miễn phí có trong bảng giá.