Vehicle Routing Problem Vấn đề định tuyến xe

Một phần của tài liệu Phát triển phân hệ quản lý vận tải và tối ưu lộ trình giao hàng trong hệ thống abivin vroute,khoá luận tốt nghiệp (Trang 67)

Trong Bài toán định tuyến xe (VRP), mục tiêu là tìm ra các lộ trình tối ưu cho

nhiều

phương tiện ghé thăm một tập hợp các địa điểm giao hàng.

Nhưng ý nghĩa của "các lộ trình tối ưu" đối với VRP là gì? Một câu trả lời là các tuyến đường có tổng khoảng cách bé nhất. Giả định, không có ràng buộc nào khác, giải pháp tối ưu lộ trình là giảm thiểu chiều dài của các tuyến đường trong số tất cả các phương tiện với mục tiêu là hoàn thành tất cả việc giao hàng càng sớm càng tốt hay nói cách khác đó là định tuyến quãng đường của xe đến các cửa hàng sao cho tổng quãng đường của các xe là bé nhất.

Dưới đây là cách thức giải quyết bài toán định tuyến phương tiện - Vehicle Routing

Problem (VRP) bằng OR Tools như sau:

Giả sử, mỗi điểm giao được biểu thị bằng các chỉ số 1, 2, 3... tương ứng với một khách hàng và vị trí của Kho là 0 (Hình 39).

Hình 39. Sơ đồ minh hoạ các điểm giao hàng

Thứ nhất, tạo dữ liệu đầu vào, bao gồm:

- distance matrix: một mảng ma trận khoảng cách hai chiều giữa các vị trí kho,

khách hàng theo mét

- num locations: số các vị trí - địa điểm khách hàng

52

- Imiiiveliicles: số lượng phương tiện đang hoạt động thuộc Kho

- depot: chỉ số của Kho - vị trí nơi mà tất cả các phương tiện bắt đầu và kết thúc

lộ trình giao hàng

C ɪn

static class DataModel {

public final long[][] distanceMatrix - {

{θ, 548, 776, 696, 582, 274, 502, 194, 308, 194, 536, 502, 388, 354, 468, 776, 662}. {548, 0, 684, 308, 194 502,730, 354, 696, 742, 1084,594, 480, 674, 1016, 868, 121θ}, {776, 684, 0, 992, 878, 502,274, 810, 468, 742, 400, 1278,1164, 1138, 788, 1552, 754}, {696, 308, 992, 0, 114, 658,878, 502, 844, 890, 1232,514, 628, 822, 1164,560,1358}, {582, 194, 878, 114, 8 536,764, 388, 730, 776, 1118,488 514, 708, 1050, 674 1244}, {274, 502, 502, 650, 536, 0, 228, 308, 194, 240, 582, 776, 662, 628, 514, 1050, 708}, {5Θ2, 730, 274, 878, 764,228, 0, 536, 194, 468, 354,1884, 89θ, 856, 514, 1278, 48θ}, {194, 354, 810, 502, 388,308, 536, 0, 342, 388, 73β,468, 354, 320, 662, 742, 856}. {3Θ8, 696, 468 844, 730,194, 194^ 342, 0, 274, 388 810, 696, 662, 320, 1884, 514}, {194, 742,742, 890, 776, 248, 468, 388, 274, 8, 342,536, 422, 388, 274, 810, 468), {536, 1884, 488, 1232, 1118, 582, 354, 738, 388, 342, 8, 878, 764, 738, 388, 1152, 354}, {5Θ2, 594, 1278, 514, 488, 776, 1884, 468, 818, 536, 878, θl 114, 388, 658, 274, 844}, {388, 488, 1164, 628, 514, 662, 898, 354, 696, 422, 764, 114, 8, 194, 536, 388, 738}, {354, 674, 1138, 822,788, 628, 856, 328, 662, 388, 738, 388, 194, 8, 342, 422, 536}, {468, 1816, 788 1164, 1858, 514, 514, 662, 328, 274, 388, 658, 536, 342, 8, 764, 194}, {776, 868, 1552 568, 674, 1858, 1278, 742, 1884, 818, 1152, 274, 388, 422, 764, 8, 798}, {662, 1218, 754, 1358, 1244, 788, 488, 856, 514, 468, 354, 844, 738, 536, 194, 798, θ}, }.

public final Int VehicleNumber - 4;

public final int depot = 8;

Trong ví dụ này mảng ma trận khoảng cách cho 16 địa điểm khách hàng tương ứng

với 16 x 16 = 256 khoảng cách giữa các địa điểm. Số phương tiện được truyền vào là 4 và chỉ số của Kho là 0.

Thứ hai, truyền toạ độ vị trí:

Để tính toán ma trận khoảng cách, công cụ OR-Tools đã định ra các toạ độ vị trí x,y được truyền vào tương ứng với các vị trí được hiển thị, ví dụ như sau:

Truyền dữ liệu về các vị trí, OR-Tools sẽ định nghĩa các vị trí từ đó biểu thị bằng các chỉ số (0, 1, 2...). Sau đó tính khoảng cách giữa các vị trí bằng cách xác định khoảng

cách giữa hai điểm (x1, y1) và (x2, y2), được tính bằng công thức: |x1-x2| + |y1-y2|.

Thứ ba, xác định distance callback:

Distance callback function là một hàm gọi lại khoảng cách. Callback finction được

dùng đề thực hiện các tác vụ bất đồng bộ. Khi nó được truyền vào một function khác dưới dạng tham số sẽ có tác dụng trả về khoảng cách giữa các vị trí. Nó cũng được dùng

để xác định chi phí đi lại dựa trên khoảng cách của quãng đường.

C C

final int transitcallbackindex =

routing.register!ransitCallback((long fromlndex, long tolndex) -> {

// Convert from routing variable Index to user Nodeindex.

int fromNode = manager.index!oNode(fromlndex);

int toNode = manager.IndexToNode(tolndex);

return data.distanceMatrix[fromNode][toNode];

});

routing .setArcCostEValuatorOfAHVehicles(transitcallbackindex) ;

Thứ tư, thêm kích thước khoảng cách:

Để giải quyết bài toán định tuyến phương tiện, cần tạo thêm một kích thước khoảng

cách, tính toán các khoảng cách giữa Kho tới khách hàng và giữa khách hàng tới khách hàng dọc theo lộ trình của phương tiện.

I routing.addDimeπsioπ(transitcallbackindex, 0, 300θ,

true, /Ị start Mill to zero

"Distance’);

RoutingDiiIieriSion (IistanceDiIIiension = routing .getMutableDimension("Distance");

d LStanceDiniension. SetGlobaispanCostCoefficient(jIDD) ;

Cuối cùng là thực hiện in ra lộ trình giao hàng đến các cửa hàng của các phương

tiện, chính là output - đầu ra với tổng quãng đường nhỏ nhất từ số lượng xe và số lượng các vị trí kho và khách hàng đã truyền vào.

e ŋ

III Φbrief Print the solution.

static void printSol□tion(

DataModel data, RoutingModel routing, RoutingIndexManager manager. Assignment solution) {

Il Inspect solution.

long InaxRouteDistance = 0;

I

for (int i = θ; i < data.VehicleNumber; **i) {

long index = routing.start(i);

logger.info("Route for Vehicle ” + i +

long TOUteDistance = 0;

String route = "";

while (!routing.IsEnd(Index)) {

route += manager.IndexToNode(index) + " -> ";

long PreviousIndex = index;

index = solution.value(routing.nextVar(index));

TOUteDistance += routing .getArcCostForVehicle(previousIndex, index, i);

}

logger.info(route + manager.IndexToNode(Index));

logger.info( "Distance of the route: '' + TOUteDistance + "m'');

IiiaxRouteDistance = Math.max(routeDistance, InaxRouteDistance);

}

logger.info("Maximum of the route distances: ,,+ IiiaxRouteDistance + "m");

Sau khi chạy chương trình thuật toán, kết quả đầu ra là các lộ trình có tổng quãng đường là bé nhất. Một lộ trình giao hàng được bắt đầu tại Kho và cũng kết thúc tại Kho.

Dưới đây là các lộ trình được lên kế hoạch cho 4 phương tiện như sau:

Route for vehicle 0:

a -> 8 -> 6 -> 2 -> 5 -> 0 Distance of route: 1552m Route for vehicle 1: a -> 7 -> 1 -> 4 -> 3 -> 0 Distance of route: 1552m Route for vehicle 2:

B -> 9 -> IB -> 16 -> 14 -> 0 Distance of route: 1552m Route for vehicle 3:

B -> 12 -> 11 -> 15 -> 13 -> B

Distance of route: 1552m

Total distance of all routes: 6208ιr∣

Lộ trình của Phương tiện 0: bắt đầu từ vị trí Kho có chỉ số là 0 đến vị trí khách hàng có chỉ số là 8, rồi đến vị trí khách hàng có chỉ số là 6, tiếp đến đến vị trí khách hàng có chỉ số là 2, đến vị trí khách hàng có chỉ số là 5 và trở về Kho. Chiều dài quãng đường lộ trình của Phương tiện 0 là 1552m.

Tương tự, với các lộ trình của Phương tiện 1,2 và 3. Từ đó, có tổng quãng đường ngắn nhất của 4 phương tiện là 6208 m.

Dưới đây là sơ đồ mô phỏng lộ trình đã được tạo ra sau quá trình tối ưu:

Hình 40. Sơ đồ mô phỏng các lộ trình tối ưu VRP

3.1.2. Capacity Constraints — Hạn chế tải trọng

Đối với các Doanh nghiệp lớn, mỗi ngày có hàng trăm đơn hàng cần đi giao và tương ứng với hàng trăm khách hàng nhận hàng. Vì vậy số lượng mặt hàng càng lớn thì thể tích hoặc/và khối lượng của đơn hàng càng nhiều mà các phương tiện có khả năng chuyên chở hạn chế nên vấn để đặt ra là làm thế nào để việc giao nhận các mặt hàng đáp

ứng số lượng xe ít nhất nhưng lại giao đến nhiều khách hàng nhất mà không vượt quá sức chứa của các phương tiện với mục tiêu giảm thiểu chi phí vận tải.

Dưới đây là cách thức giải quyết bài toán định tuyến phương tiện với hạn chế về tải trọng - Capacitated Vehicle Routing Problem (CVRP) bằng OR Tools như sau:

Bài toán CVRP được mở rộng từ bài toán VRP trước đó. Ví dụ, tại mỗi địa điểm sẽ có thêm nhu cầu tương ứng với số lượng mặt hàng đã đặt và mỗi chiếc xe có tải trọng

là 15 (Hình 41)

Hình 41. Sơ đồ các điểm giao hàng tương ứng với tải trọng

Thứ nhất, tạo dữ liệu đầu vào:

- distance matrix: một mảng ma trận khoảng cách hai chiều giữa các vị trí kho,

khách hàng theo mét

- num locations: số các vị trí - địa điểm khách hàng

- num_vehicles: số lượng phương tiện đang hoạt động thuộc Kho

- depot: chỉ số của Kho - vị trí nơi mà tất cả các phương tiện bắt đầu và kết thúc

lộ trình giao hàng

- demands: mỗi vị trí có nhu cầu về mặt hàng tương ứng với số lượng đã đặt

- capacity: sức chứa tối đa của phương tiện

Các dữ liệu đầu vào được giữ nguyên như đối với bài toán VRP, ở bài toán CVRP OR Tools thêm hai dữ liệu đầu vào đó là demands và capacity:

public final Lor⅜g∣] demands = <θ, 1r 1r2, 4. 2, 4, S, B, 1.2, 1, 2, 4, 4r 8, 8};

public final loπg[] VehicleCapacities = {1Ξ, 15, 15, 15};

Trong ví dụ này mảng ma trận khoảng cách cho 16 địa điểm khách hàng tương ứng

với 16 x 16 = 256 khoảng cách giữa các địa điểm. Số phương tiện được truyền vào là 4 và chỉ số của Kho là 0. Tương ứng với 16 khách hàng là 16 nhu cầu số lượng hàng hoá. Sức chứa tối đa của 4 xe là bằng nhau bằng 15.

Route for vehicle 0:

0 Load (15) -> 1 Load (14) -> 4 Load (10) -> 3 Load (8) -> 15 Load (0) -> 0 Load (0)

Distance of the route: 2192m Load of the route: 15

Route for vehicle 1:

0 Load (15) -> 14 Load (11) -> 16 Load (3) -> 10 Load (1) -> 2 Load (0) -> 0 Load (0) Distance of the route: 2192m

Load of the route: 15

Thứ hai, thêm demand callback và capacity constraint: các hàm này sẽ trả về nhu

cầu tức là khối lượng và/hoặc thể tích của hàng hoá tại mỗi vị trí và các ràng buộc về tải

trọng của phương tiện.

. . e l∏

final int demandcallbackindex = routing.FegisterUnaryTransitCallback((long fromlndex) -> {

// Convert from routing variable Index to user Nodeindex,

int fromNode = manager.indexT0N0de(fromlndex);

return data.demands[fromNode];

}): ' '

routing.addDimensionWithVehicleCapacity(demandCallbackIndex, 0, Ilnull capacity slack data.vehiclecapacities, // vehicle maximum capacities

true, Ilstart cumul to zero

"Capacity");

Cuối cùng, in ra được lộ trình tối ưu cho các xe trong đó tải trọng của mỗi xe là

tối đa.

C C

III i⅛rief Print the solution.

static void printSolution(

DataModel data, RoutingModel routing, RoutingIndexManager manager. Assignment solution) {

IlInspect solution.

long totalDιstance = e;

long totalLoad = θ;

I

for (int i = 0; i < data.VehicleNumber; ++1) {

long index = routing.start(i);

logger.info("Route for Vehicle ■ + i +

long routeDistance = 0;

long TOUteLoad = θ;

String route = "";

while (!routing.isEnd(index)) {

long nodeindex = manager.IndexToNode(index);

TOUteLoad += data.demands[(Int) nodeindex]; route += nodeindex + ^ L□ad(" + TOUteLoad + ■) -> ,,;

long PreviousIndex - index;

index ≈ solution.value(routing.nextVar(index));

TOUteDistance += routing.getArcCostForVehicle(previousIndex, index, i); } ’ ’

route += manager.indexToNode(routing.end(i));

logger.iπfo(route);

logger.info("Distance of the route: " + TOUteDistance + "m");

totalDistance += TOUteDistance; totalLoad += TOUteLoad;

logger.info("Total distance of all routes: " + totalDistance + ,,m");

logger.info("Total load of all routes: " + totalLoad) ;

}

Sau khi chạy thuật toán các lộ trình của mỗi xe như sau:

Route for vehicle 2:

0 Load (15) -> 7 Load (7) -> 13 Load (3) -> 12 Load (1) -> 11 Load (0) -> 0 Load (0) Distance of the route: 2192m

Load of the route: 15 Route for vehicle 3:

0 Load (15) -> 9 Load (14) -> 8 Load (7) -> 6 Load (3) -> 5 Load (0) -> 0 Load (0) Distance of the route: 2192m

Trên mỗi lộ trình là các chỉ số biểu thị của mỗi vị trí và tổng trọng tải của xe khi bắt đầu khởi hành.

Lộ trình cho xe 0: Xe xuất phát từ Kho có chỉ số 0 với tải trọng tối đa là 15 giao đến khách hàng có chỉ số 1 với đơn hàng có tải trọng 1, lúc này trên xe còn 14; xe giao tiếp đến khách hàng có chỉ số 4 với đơn hàng có tải trọng 4, lúc này trên xe còn 10; tiếp đến khách hàng có chỉ số 3 với đơn hàng có tải trọng 2, lúc này xe còn 8; xe đi tiếp đến khách hàng có chỉ số 15 với đơn hàng có tải trọng 8, lúc này xe đã rỗng. Kết thúc lộ trình xe trở về Kho.

Tương tự với lộ trình của Xe 1, 2 và 3. Từ đó, có tổng quãng đường là 6872m và chuyên chở với sức chứa tối đa.

Dưới đây là sơ đồ mô phỏng lộ trình đã được tạo ra sau quá trình tối ưu:

Hình 42. Sơ đồ mô phỏng các lộ trình tối ưu CVRP

3.1.3. Time Window Constraint — Ràng buộc khung thời gian

Nhiều vấn đề định tuyến xe liên quan đến việc lên kế hoạch sao cho xe ghé thăm khách hàng trong một khoảng thời gian đáp ứng. Ví dụ khách hàng là một chuỗi siêu thị

hoạt động 24/7 nhưng họ chỉ nhận hàng hoá từ các nhà cung cấp trong khoảng thời gian

từ 3:00 a.m đến 7:00 a.m. Có những khách hàng là cửa hàng nhỏ hơn lại có khung thời gian nhận hàng từ 5:00 - 7:00. Tuỳ vào mỗi khách hàng sẽ có những khung thời gian nhận hàng khác nhau. Vấn đề này được gọi là Vấn đề định tuyến xe với cửa sổ thời gian

- Vehicle Routing Problems with Time Windows (VRPTWs). Đó là các phương tiện cần ghé thăm mỗi cửa hàng trong đúng khung thời gian nhận hàng của họ sao cho tổng thời gian di chuyển của các phương tiện là thấp nhất.

Dưới đây là ví dụ về cách thức giải quyết bài toán định tuyến phương tiện với cửa sổ thời gian - Vehicle Routing Problems with Time Windows (VRPTWs) bằng OR Tools như sau:

Biểu đồ bên dưới biểu thị vị trí các điểm khách hàng là màu xanh tương ứng với các chỉ số 1, 2, 3...và Kho là màu đen. Mỗi vị trí khách hàng có các khung thời gian nhận hàng khác nhau (Hình 43).

{8r8. 9, 8. 7. 3. 6. 2. 3. 2J b. 6, 4. 4, s. 9 . 7}. 4í>. &. H. 3. 2, tìr tì, 4. aj Hj13, 7. SjHJ12. 18, 14}, {9, 6. a. 11, Ifl j & Ir 3, 9. S .jã, 4. 15, 14. 13. s. 18, 9}. {8, 3, 11, ồ, 1 7.r lô. &. T0j 10, 14, 6. 7, 9. 14, ⅛, 18}, ịĩ. 2, 10, 1, &. 6. 9. 4J Ẽ. 9. 13. 4r 6. tì. 12 . 8, 14}, (ỉ, 6. 6. 7. 6, tì. 2, 3. 2. 2, 7. θr 7, 7. 6. 1 í, 8Jj

{8. 8, 3. Itì. 9, 2. a. fcj 2. 5, 4, 12, 1&. lô, 8, 15. SJ1

{2, 4. 9. 6. 4, 3. &. a. 4. 4. B, Sr 4, 3. 7, È . 1&}, {3, 8. s. 10, Sr 2, 2, 4. tì. 3, 4, 9. HJ7. 3. 13J 6}, {2, S, 8, lô, 9r 2, 5, 4, 3. 0, 4, 6, Sj 4. 3. 9, SJ. ^6. 13. . 144, . 13. 7, 4. HJ 4. 4, 0r Iflj 9. tì. 4, 13. 4Jj ⅛r 7, 15, 6, 4, 9. 12. 5, 9 ‘. 6, lô. &. Ij 3. 7 . 3. 10}. H. Sr 14, 7. 6, 7. lô, 4. H .. S. 9JIrỒ, 2, 6. 4. 6}, <4. Sr 13, 9, S7.r lô. 3, 7 . 4. Hj 3r 2. Ồ. 4. Sj 6} r {5r 12. . 149, . 12. 6, 6. 7. 3J 3. 4r 7, &. 4. tì . 9. íị. ^9. Itì. . 61S, , 1 8j 2, ISJ TÌ. 13. 9. 13. 3. 4. S . 9, 8, 9}, {7r 14 , 169, . 14, s, 5. Itì, 6. 5, 4. 10, a, 6. 2J 9. ejj < 1 16J. It10 { 1 1SJ. H'1 Ó . S}, tỉ 12 { S 10}, / ì13 Ờ . 0}, tỉ 14 { 1 ISJj 1115 { 1 15}. It'6

Hình 43. Sơ đồ mô phỏng các điểm giao hàng tương ứng với khung thời gian

Tạo dữ liệu đầu vào: Dữ liệu đầu vào bao gồm:

- time matrix: một mảng ma trận thời gian di chuyển giữa các địa điểm của xe.

time_ windows: một mảng các khung thời gian nhận hàng của mỗi vị trí khách hàng.

Phương tiện giao hàng cần phải ghé thăm trong đúng khoảng thời gian này.

- num locations: số các vị trí - địa điểm khách hàng.

- numpvehicles: số lượng phương tiện đang hoạt động thuộc Kho

- depot: chỉ số của Kho - vị trí nơi mà tất cả các phương tiện bắt đầu và kết thúc

lộ trình giao hàng

61

C O

static class DataModeL {

QUblLC final Ioffigllll tιmeMatrιx ■ i

}:

public final longI]I I timesindows - {

{0j S}, ttdepot {7, 12J, n1 {10. IS It 2 {16, 18 JjHa {lβ, 13 }. It4 in, S}. // S {5j ιej, ft6 {S. 4}, t! 7 {S, ιej, H8 {0, 3}, tt9

Một phần của tài liệu Phát triển phân hệ quản lý vận tải và tối ưu lộ trình giao hàng trong hệ thống abivin vroute,khoá luận tốt nghiệp (Trang 67)

Tải bản đầy đủ (DOCX)

(93 trang)
w