最近观摩了油管大佬关于VRP的讲解,获得了一些体会,并自己用lingo编程实现了一些无时间窗口的VRP,使用的模型是整数规划。
把所有运送货物的车辆当成一辆去考虑,只要有某一辆车从i到j送过货,x_{ij}=1,否则为0;f_{ij}是一个辅助变量,表示的是在除去发货点(depot)以外的每一个点有且只有一辆车去的前提下,从i出发到j的车辆上所承载的货物的余量,所以得到这个余量的两个约束:
表示为所有可能到i点的车的余量减去从i点出去的车的余量是i点的需求量
表示为:若某车从i点到过j点则其载量不大于车的总承载量C;如果没来过则承载量必为0;
为此我自己编了lingo程序实现:
N=15;C=35;
MODEL:
SETS:
CITY/1..15/:DEMAND;
CXC(CITY,CITY):DIST,F,X;
ENDSETS
DATA:
DIST=
0 6.9630 5.2030 10.0750 4.0230 3.0710 4.3500 4.1250 5.6280 6.3840 3.6870 3.4250 8.6590 3.5510 7.9180
6.9630 0 9.3180 7.6410 5.4940 10.9060 6.6890 6.4680 6.6630 6.7480 6.5730 7.5220 7.2500 6.0380 8.0600
5.2030 9.3180 0 7.6520 6.9260 7.3970 7.8340 6.3890 6.0140 10.5140 5.6190 6.8320 6.5090 8.5310 8.9140
10.0750 7.6410 7.6520 0 3.1320 5.7650 9.7370 6.9490 7.0950 7.3060 6.3760 5.8960 10.3970 8.3150 9.1060
4.0230 5.4940 6.9260 3.1320 0 3.5890 7.1960 7.2610 7.9930 8.6330 6.4200 6.3040 5.8040 6.7340 6.3310
3.0710 10.9060 7.3970 5.7650 3.5890 0 6.5890 11.6230 8.5780 9.2250 9.1820 6.2760 10.9700 5.0080 6.5680
4.3500 6.6890 7.8340 9.7370 7.1960 6.5890 0 8.6860 6.1750 7.0210 7.1110 4.6290 4.7340 11.6380 6.2130
4.1250 6.4680 6.3890 6.9490 7.2610 11.6230 8.6860 0 6.3290 4.3000 5.8340 7.7320 8.3390 7.2770 6.9490
5.6280 6.6630 6.0140 7.0950 7.9930 8.5780 6.1750 6.3290 0 4.9970 5.0830 7.1610 6.9370 10.1340 5.9630
6.3840 6.7480 10.5140 7.3060 8.6330 9.2250 7.0210 4.3000 4.9970 0 3.1420 8.4270 6.1860 5.1270 6.8490
3.6870 6.5730 5.6190 6.3760 6.4200 9.1820 7.1110 5.8340 5.0830 3.1420 0 9.8980 9.9830 6.6840 9.5520
3.4250 7.5220 6.8320 5.8960 6.3040 6.2760 4.6290 7.7320 7.1610 8.4270 9.8980 0 4.2850 3.7890 3.6040
8.6590 7.2500 6.5090 10.3970 5.8040 10.9700 4.7340 8.3390 6.9370 6.1860 9.9830 4.2850 0 6.6910 5.0810
3.5510 6.0380 8.5310 8.3150 6.7340 5.0080 11.6380 7.2770 10.1340 5.1270 6.6840 3.7890 6.6910 0 4.4620
7.9180 8.0600 8.9140 9.1060 6.3310 6.5680 6.2130 6.9490 5.9630 6.8490 9.5520 3.6040 5.0810 4.4620 0;
DEMAND = 0 8 12 13 10 7 16 6 6 7 7 12 12 6 16;
ENDDATA
@FOR(CXC:@BIN(X));
MIN = @SUM(CXC(I,J):DIST(I,J)*X(I,J));
@FOR(CITY(I)|I #GT# 1:@SUM(CITY(J):X(I,J))=1;@SUM(CITY(J):X(J,I))=1);
@FOR(CITY(I)|I #GT# 1:@SUM(CITY(J):F(J,I))-@SUM(CITY(J):F(I,J))=DEMAND(I));
@FOR(CXC(I,J):F(I,J)<=35*X(I,J);F(I,J)>=0);
结果并没有注明所使用到的车辆数目,车辆数目是回路数量(因为所有车辆轨迹除了depot不相交)
Global optimal solution found.
Objective value: 85.08600
Objective bound: 85.08600
Infeasibilities: 0.000000
Extended solver steps: 15259
Total solver iterations: 822550
Elapsed runtime seconds: 39.30Model Class: MILP
Total variables: 455
Nonlinear variables: 0
Integer variables: 225Total constraints: 493
Nonlinear constraints: 0Total nonzeros: 1697
Nonlinear nonzeros: 0
这里的objective bound表示的是最小值的下界,因为整数规划用的还是单纯形法,通过换基来实现.