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: Kỹ năng xe (skills)
Xe #1 là xe đông lạnh (mã trang bị 1), xe #2 là xe chở hàng cồng kềnh (mã 2). Đơn #1 và #2 là hàng đông lạnh, đơn #3 và #4 là hàng cồng kềnh — mỗi đơn chỉ lên được đúng loại xe của nó. Nhìn kết quả: hai đơn đầu về xe #1, hai đơn sau về xe #2, dù xe nào cũng còn thừa chỗ. Lưu ý: đã dùng skills thì MỌI đơn đều phải khai, thiếu một đơn là dịch vụ ngắt kết nối chứ không báo lỗi.
- 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 (4)
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
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
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
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 (2)
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,
"delivery": [
1
],
"skills": [
1
]
},
{
"id": 2,
"location": [
106.7066,
10.80189
],
"service": 600,
"delivery": [
1
],
"skills": [
1
]
},
{
"id": 3,
"location": [
106.68982,
10.80159
],
"service": 900,
"delivery": [
1
],
"skills": [
2
]
},
{
"id": 4,
"location": [
106.695,
10.785
],
"service": 600,
"delivery": [
1
],
"skills": [
2
]
}
],
"vehicles": [
{
"id": 1,
"start": [
106.7,
10.79
],
"end": [
106.7,
10.79
],
"capacity": [
10
],
"skills": [
1
]
},
{
"id": 2,
"start": [
106.69,
10.795
],
"end": [
106.69,
10.795
],
"capacity": [
10
],
"skills": [
2
]
}
]
}'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,
"delivery": [
1
],
"skills": [
1
]
},
{
"id": 2,
"location": [
106.7066,
10.80189
],
"service": 600,
"delivery": [
1
],
"skills": [
1
]
},
{
"id": 3,
"location": [
106.68982,
10.80159
],
"service": 900,
"delivery": [
1
],
"skills": [
2
]
},
{
"id": 4,
"location": [
106.695,
10.785
],
"service": 600,
"delivery": [
1
],
"skills": [
2
]
}
],
"vehicles": [
{
"id": 1,
"start": [
106.7,
10.79
],
"end": [
106.7,
10.79
],
"capacity": [
10
],
"skills": [
1
]
},
{
"id": 2,
"start": [
106.69,
10.795
],
"end": [
106.69,
10.795
],
"capacity": [
10
],
"skills": [
2
]
}
]
};
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,
"delivery": [
1,
],
"skills": [
1,
],
},
{
"id": 2,
"location": [
106.7066,
10.80189,
],
"service": 600,
"delivery": [
1,
],
"skills": [
1,
],
},
{
"id": 3,
"location": [
106.68982,
10.80159,
],
"service": 900,
"delivery": [
1,
],
"skills": [
2,
],
},
{
"id": 4,
"location": [
106.695,
10.785,
],
"service": 600,
"delivery": [
1,
],
"skills": [
2,
],
},
],
"vehicles": [
{
"id": 1,
"start": [
106.7,
10.79,
],
"end": [
106.7,
10.79,
],
"capacity": [
10,
],
"skills": [
1,
],
},
{
"id": 2,
"start": [
106.69,
10.795,
],
"end": [
106.69,
10.795,
],
"capacity": [
10,
],
"skills": [
2,
],
},
],
}
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,
"delivery": [
1
],
"skills": [
1
]
},
{
"id": 2,
"location": [
106.7066,
10.80189
],
"service": 600,
"delivery": [
1
],
"skills": [
1
]
},
{
"id": 3,
"location": [
106.68982,
10.80159
],
"service": 900,
"delivery": [
1
],
"skills": [
2
]
},
{
"id": 4,
"location": [
106.695,
10.785
],
"service": 600,
"delivery": [
1
],
"skills": [
2
]
}
],
"vehicles": [
{
"id": 1,
"start": [
106.7,
10.79
],
"end": [
106.7,
10.79
],
"capacity": [
10
],
"skills": [
1
]
},
{
"id": 2,
"start": [
106.69,
10.795
],
"end": [
106.69,
10.795
],
"capacity": [
10
],
"skills": [
2
]
}
]
}
```
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=skillsMở 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.