Genetic Algorithm for VRP
来源:互联网 发布:js 定义json字符串 编辑:程序博客网 时间:2024/05/18 02:28
Part 1: Representation and explanation of the given problem
This is a classical optimization problem in graphic thoery. Variable descriptions and mathmatical model are given below:
Variables:
K: the number of vehicles;
Q: capacity of each vehichle (all vehicles have the same capacity);
k: index of each vehicle;
Sk: length travelled by the kth vehicle;
Nk: the number of customers assigned to the kth vehicle;
M: the number of all customers;
xmk: x coordination of the mth customer corresponding to the kth vehicle;
ymk: y coordination of the mth customer corresponding to the kth vehicle;
Dmk: demand amount of the mth customer corresponding to the kth vehicle;
Tmk: arriving time of the mth customer corresponding to the kth vehicle;
T1mk: ready time of the mth customer corresponding to the kth vehicle;
T2mk: due time of the mth customer corresponding to the kth vehicle;
Tk: the time when the kth vehicle returns to the original starting location;
T20: the total consuming time limit;
t: duration of sevice time ( same in all locations );
S: total distance of all vehicles;
n: the orignal index of the given location.
dk(i , j): distance between the ith and jth location for the kth vehicle;
Analysis:
The goal is to fulfill demands of all customers at the lowest sum of travelling distances by all vehicles according to the problem requirement. For operational sake, all the customers have to be grouped into K sections. The kth section is supposed to contain Nk specific customers which are assigned to the kth vehicle.
Constraints can be listed in two aspects:
1. number and volumes of the vehicles;
2. time constraints including: ready time and due date of each customer and the total amount of time used by each vehicle. The latter one is mentioned in files as due date of the 0th location.
Mathematical model:
Objective:
in which, we give the general mathematical notation of the optimization objective and overall restraints. Some detailed relations among these varialbes are stated as following:
where d(m,m+1) originally represents the distance between the mth and (m+1)th customer, yet the task description thinks that this is eaqual to the time consumed in the jounry between the two locations. As a result, we directly adopt d(m,m+1) as the time. t is the service time in the mth location for kth vehicle. The total time during the jouney of the kth vehicle Tk can be seen as the sum of 3 parts: 1 elasped time when the kth vehicle arrives the last customer Nk; 2 sevice duration at the Nkth location; 3 time used in the way from the Nkth location to the starting point.
Part 2: Genetic Algorithm for VRP
The mathematical model only lists the general relations among all the variables and give a overall description of the problem. However, several critical issues call for solutions:
1. How to group these customers?
2. For a certain group, how to choose the exact route?
In fact, the two issues are mutually reliant. If the former one can be solved, then VRP problem can be transformed into the TSP (Travelling Salesman Problem). Distances in certain routes will definitely influence the way to devide customers.
Chromosome generating:
The coding of VRP problem is quite different from norm problems. All the original chromosomes must obey all the constraints above, as a result, we are confromted with some chromosome structure problem.
1. Time restraint of all customers. We build a directional graph spanned by all the locations. We know that the pth customer has a ready time T1p and a due time T2p, there is a route from customer p to customer q only when
which describs that if there is a vehicle moves from customer p, with time consumed on the way to qth customer and service time at location p taken into consideration, the time when the vehicle arrives at the qth location must lie between the ready time and due time of the the qth customer.
By this, we successfully transfer a complete graph into a directional graph whose degree is substantially decreased, and many routes need not to be considered.
2. Time constraint of a route. As is stated above, the time of traversing all the locations of a route and returning to the starting point must be less than the due time of the starting point. By further examination of some given examples and routine thinking we know that if there is no violation of the time restraint of the last customer of a route, the vehicle can return to the starting point on time.
3. Capacity limitation. In detailed operation, we will randomly choose a customer as the first customer of a certain route, and then there only some adjacent points next to it, from which we choose one as the second customer of the route, and so on. At each location, we will compute the cumulative demand of the customers on present route, a cease of the route when the cumulative demand exceeds the vehicle capacity. Then choose another customer as the first point of a new route and excute the same procedure. It must be addressed that each customer can only be contained in one route.
4. Constaint of the number of vehicles. We can excute the progress stated in Step 3, if the chromosome uses more vehicles than allowed, regenerate a new one until it satisfy all vehicle number constraint.
Estimation function:
Suppose there are M customers and K vehicles, there should be M+K+1 elements in the serial above. Our objective is to minimize the total distance, which in the specific serial can be expressed as the sum of all distances between two consecutive elements. I would like to choose such a calculation as fitness value.
where i is the index in the serial and d(i, i+1) represents the distance between the ith and (i+1)th location.
Crossover and variation:
Crossover here are also barried by the structual problem (all the constraints), we can not merely choose a crossover point and exchange haves of two chromosomes as normal. As the problem is based on the directional graph, and then we need only think over constraints of capacity limitation and vehicle number.
We randomly choose two chromosomes from parental generation. We build a new directional graph among customers only(no consideration of the starting point), all the routes between points are selected from the two chromosomes. In fact, quite a lot are repeated in two chromosomes, each vertex has no more than two inputs and two outputs. Maybe some points are isolated (in two chromosomes the point is a route). Then we can simplify the directional graph. We firstly choose a shorter input of two-inputs point and desert the other one. Then choose a shorter output of two-outputs and let the other abandoned. With the redued graph, we furtherly generate the vehicle routes as above, in which capacity are taken account.
In each ieration, we randomly generate several chromosomes as variation.
Part3: Calculation result:
We choose the data listed in file “C1_2_1.txt” as an example.
Each generation 10 chromosomes are selected and 3 iterations are taken. We only give the exact chromosome with the best fitness.
Initial generation:
Index
1
2
3
4
5
6
7
8
9
10
Fitness
(min)
4292.9
4601.7
5508.7
4791.8
4391.6
7438.8
7361.2
6563.2
5972.3
6705.4
Best fitness: 4292.9
Best chromosome:
Index
Route
1
0 20 41 12 129 11 6 122 90 67 17 39 0
2
0 21 23 182 75 163 194 145 195 52 92 0
3
0 24 61 139 0
4
0 30 120 19 192 196 97 14 89 105 15 59 0
5
0 32 171 65 86 115 94 51 110 162 0
6
0 45 155 0
7
0 144 119 166 35 126 71 9 1 99 53 0
8
0 100 64 179 109 149 56 0
9
0 57 5 10 193 46 128 106 167 34 95 158 0
10
0 114 159 38 150 22 151 16 140 187 142 111 63 0
11
0 73 116 147 160 47 91 70 0
12
0 78 175 13 43 2 0
13
0 190 82 0
14
0 85 80 31 25 172 77 0
15
0 93 55 18 54 185 132 7 181 188 108 0
16
0 101 0
17
0 133 48 26 152 40 153 169 96 130 28 74 107 0
18
0 118 83 143 176 36 33 121 165 49 0
19
0 148 103 197 124 141 69 200 174 136 189 0
20
0 161 104 0
21
0 164 66 0
22
0 170 134 50 156 112 168 79 29 87 42 123 198 0
23
0 177 3 88 8 186 127 98 157 0
24
0 178 27 173 154 0
25
0 135 58 184 199 37 81 138 137 183 0
26
0 180 84 191 125 4 72 0
27
0 44 102 146 0
28
0 60 0
29
0 62 0
30
0 68 76 0
31
0 113 0
32
0 117 0
33
0 131 0
Second generation:
Index
1
2
3
4
5
6
7
8
9
10
Fitness
(min)
3559.5
3410.8
3712.5
4246.4
3852.1
6075.3
6492.6
7536.1
6920.8
5671.4
Best fitness: 3410.8
Best chromosome:
Index
Route
1
0 20 41 85 80 31 25 172 77 110 162 0
2
0 21 23 182 75 163 194 145 195 52 92 0
3
0 30 120 19 192 196 97 14 96 130 28 74 149 0
4
0 32 171 65 86 115 94 51 174 136 189 0
5
0 45 27 173 154 24 61 100 64 179 109 0
6
0 161 104 18 54 185 132 7 181 117 49 0
7
0 101 144 119 166 35 126 71 9 1 99 53 0
8
0 50 156 112 168 79 29 87 42 123 198 56 0
9
0 57 118 83 143 176 36 33 121 165 188 108 0
10
0 133 48 26 152 40 153 169 89 105 15 59 0
11
0 60 82 180 84 191 125 4 72 0
12
0 62 131 44 102 146 68 76 0
13
0 38 150 22 151 16 140 187 142 111 63 0
14
0 93 55 135 0
15
0 113 155 78 175 13 43 2 90 67 17 39 107 0
16
0 116 12 129 11 6 122 139 0
17
0 148 103 197 124 141 69 200 0
18
0 190 5 10 193 46 128 106 167 34 95 158 0
19
0 164 66 147 160 47 91 70 0
20
0 170 134 0
21
0 177 3 88 8 186 127 98 157 0
22
0 178 0
23
0 58 184 199 37 81 138 137 183 0
24
0 73 0
25
0 114 0
26
0 159 0
Third generation:
Index
1
2
3
4
5
6
7
8
9
10
Fitness
(min)
2877.3
3602.6
3166.5
4982.7
4721.6
6282.7
7084.9
6716
6402.1
6907.6
Best fitness: 2877.3
Best chromosome:
Index
Route
1
0 20 41 85 80 31 25 172 77 110 162 0
2
0 21 23 182 75 163 194 145 195 52 92 0
3
0 30 120 19 192 196 97 14 89 105 15 59 0
4
0 32 171 65 86 115 94 51 174 136 189 0
5
0 45 27 173 154 24 61 100 64 179 109 149 0
6
0 161 104 18 54 185 132 7 181 117 49 0
7
0 101 144 119 166 35 126 71 9 1 99 53 0
8
0 93 55 135 58 184 199 37 81 138 137 183 56 0
9
0 57 118 83 143 176 36 33 121 165 188 108 0
10
0 60 82 180 84 191 125 4 72 0
11
0 62 131 44 102 146 68 76 96 130 28 74 0
12
0 114 159 38 150 22 151 16 140 187 142 111 63 0
13
0 164 66 147 160 47 91 70 0
14
0 73 116 12 129 11 6 122 139 0
15
0 113 155 78 175 13 43 2 90 67 17 39 107 0
16
0 133 48 26 152 40 153 169 0
17
0 148 103 197 124 141 69 200 0
18
0 190 5 10 193 46 128 106 167 34 95 158 0
19
0 170 134 50 156 112 168 79 29 87 42 123 198 0
20
0 177 3 88 8 186 127 98 157 0
21
0 178 0
The example given above shows that performance improved rapidly with the iteration of genetic algorithm. By perceptual knowledge, we manage it by two ways: (1) In crossover progress, we cut off the longer edge of the two-input or two-output vertex to keep it connected to other vertexes by the remained one. We see that the total objective function if the distance of all vehicle routes, when each element of the vehicle route becomes shorter, there must be an reduction in the total distace. (2) Each vehicle route has two extented cost of distance: the first customer and the last customer of the vehicle route connected to the starting point. As the iteration going on, the number of vehicles really used decreases, so the distance reduction in the extended cost will ensure the total distance optimized.
This is a strictly constrainted problem, which makes it hard to variate. We directly randomly select some new chromosomes, in which some new genes are included. It has reached the rule of traditional rule of getting new genes. We think that it makes sense.
function [resultChrom,lastMin,fitAll,ddd]=geneticVRP(iter)
clear
iter=4;
% Assumptions:
% (1) service time of all customers is the same
% (2) time and demand constraints can never be violated
% (3) K as the number of vehicles is only a upper limit, we need not use
% all the vehicles
% (4) no location but the start point can be revisited.
%55555555555555555555555555555555555555555555555555555555555555555555555555
% Some preparations
%55555555555555555555555555555555555555555555555555555555555555555555555555
%5 parameter description
originData11; % load data
[height,width]=size(originData);
M=height-1; % number of customers
K=50; % number of vehicles
capacity=200; % capacity of each vehicle
NC=5;
coord=originData(2:M+1,2:3); % coordinations
timLim=originData(2:M+1,5:6); % time limits
demand=originData(2:M+1,4); % demand
serTime=originData(2,7); % service time
%5 calculate distances of all points to start point
disOrg=zeros(1,M);
for i=1:M
disOrg(i)=sqrt((originData(i+1,2)-originData(1,2))^2+(originData(i+1,3)-originData(1,3))^2);
end
clear originData;
%5 build directional graph
pt2={};
ctPt=zeros(1,M);
dis2=ones(M)*Inf;
for i=1:M-1
for j=i+1:M
disBetween=sqrt((coord(i,1)-coord(j,1))^2+(coord(i,2)-coord(j,2))^2)+serTime; % distance between two consecutive locations
if(timLim(i,2)+disBetween>timLim(j,1)&&timLim(i,1)+disBetween<timLim(j,2))
ctPt(i)=ctPt(i)+1;
pt2{i}(ctPt(i))=j;
dis2(i,j)=disBetween;
end
if(timLim(j,2)+disBetween>timLim(i,1)&&timLim(j,1)+disBetween<timLim(i,2))
ctPt(j)=ctPt(j)+1;
pt2{j}(ctPt(j))=i;
dis2(j,i)=disBetween;
end
end
end
%55555555555555555555555555555555555555555555555555555555555555555555555555
% Genetic job
%55555555555555555555555555555555555555555555555555555555555555555555555555
% choose nc couples of chromosomes which fulfill all the constraints
% calculate the fitness of all the chromosomes
chrom={};
numVehi=zeros(1,NC*2);
fit=ones(1,NC*2);
for i=1:NC*2
while(1)
[chrom{i},numCus]=randomSelect(M,K,demand,disOrg,ctPt,pt2,dis2,capacity);
if(numCus==M)
break;
end
end
end
% chromosome crossover
% let the NC couples of chromosomes randomly unioned
% regenerate some chromosomes and then select the best 2*NC chromosomes as
% the parental chromosomes
% Get a discrete seria
chromChild={};
ddd={};
fitAll=zeros(iter,2*NC);
lastMin=inf;
lastIndex=0;
for j=1:iter
index=randperm(2*NC);
for i=1:NC
chromChild{i}=crossOver(chrom{index(2*i-1)},chrom{index(2*i)},dis2,M,K,capacity,demand);
end
for i=1:NC
chrom{i}=chromChild{i};
while(1)
[chrom{i+NC},numCus]=randomSelect(M,K,demand,disOrg,ctPt,pt2,dis2,capacity);
if(numCus==M)
break;
end
end
fit(i)=fitness(chrom{i},dis2-serTime,disOrg);
fit(i+NC)=fitness(chrom{i+NC},dis2-serTime,disOrg);
end
[minChrom,minIndex]=min(fit);
if(minChrom==lastMin)
break;
end
lastMin=minChrom;
lastIndex=minIndex;
lend=length(chrom{lastIndex});
ddd{j}=[];
for k=1:lend
ddd{j}=[ddd{j},0,chrom{lastIndex}{k}];
end
fitAll(j,:)=fit;
end
resultChrom=chrom{lastIndex};
%originalData11.m
originData=[0 70 70 0 0 1351 0
1 33 78 20 750 809 90
2 59 52 20 553 602 90
3 10 137 30 147 219 90
4 4 28 10 616 661 90
5 25 26 20 128 179 90
6 86 37 10 478 531 90
7 1 109 10 616 680 90
8 6 135 40 351 386 90
9 32 79 20 655 721 90
10 24 26 20 219 271 90
11 86 36 20 384 443 90
12 95 35 10 196 252 90
13 63 50 10 364 416 90
14 100 106 10 567 626 90
15 99 112 20 846 911 90
16 36 135 10 598 669 90
17 57 59 10 824 890 90
18 8 124 10 231 298 90
19 85 106 20 186 253 90
20 103 69 30 33 93 90
21 109 131 20 72 141 90
22 43 140 10 410 470 90
23 115 134 30 140 199 90
24 98 70 10 467 511 90
25 112 67 10 462 534 90
26 102 104 20 201 258 90
27 93 75 30 178 238 90
28 90 104 20 845 910 90
29 127 108 10 677 743 90
30 84 99 20 32 102 90
31 113 69 20 370 440 90
32 129 9 10 84 147 90
33 18 38 30 582 638 90
34 30 27 10 772 835 90
35 25 80 20 380 440 90
36 17 37 30 493 544 90
37 32 106 10 602 657 90
38 43 135 10 215 293 90
39 61 59 20 931 971 90
40 104 106 20 390 434 90
41 109 71 20 95 163 90
42 121 110 30 870 923 90
43 61 48 20 448 517 90
44 74 99 20 176 243 90
45 89 73 10 19 94 90
46 21 25 20 405 453 90
47 99 28 30 392 442 90
48 101 96 10 101 160 90
49 9 114 20 904 954 90
50 121 112 20 221 277 90
51 137 6 10 611 678 90
52 118 131 20 782 857 90
53 34 82 10 928 1000 90
54 4 125 30 319 398 90
55 26 105 40 115 179 90
56 35 123 20 1130 1198 90
57 21 48 10 53 123 90
58 21 115 10 306 376 90
59 99 108 20 952 992 90
60 1 34 20 77 132 90
61 94 70 20 556 610 90
62 74 93 20 23 66 90
63 32 128 20 1079 1123 90
64 94 73 10 741 791 90
65 135 3 20 250 300 90
66 97 28 20 110 170 90
67 59 56 20 745 780 90
68 80 97 10 457 518 90
69 134 31 20 508 566 90
70 103 34 30 577 636 90
71 30 79 20 561 632 90
72 4 30 40 693 768 90
73 87 39 20 35 92 90
74 90 101 10 933 1008 90
75 119 136 30 334 384 90
76 78 92 30 555 610 90
77 110 66 10 650 710 90
78 62 58 20 173 229 90
79 127 112 20 595 636 90
80 113 71 10 286 341 90
81 34 104 10 683 760 90
82 2 28 10 148 199 90
83 17 43 10 205 279 90
84 1 24 10 333 385 90
85 112 71 20 193 252 90
86 135 0 10 331 405 90
87 125 108 20 778 825 90
88 8 138 30 234 316 90
89 103 111 20 668 719 90
90 57 53 10 641 697 90
91 98 31 20 480 541 90
92 116 132 10 870 953 90
93 28 99 10 51 93 90
94 137 3 20 522 581 90
95 29 28 10 865 925 90
96 94 105 10 656 728 90
97 92 107 30 465 532 90
98 10 134 10 629 677 90
99 34 79 10 841 902 90
100 94 72 20 647 703 90
101 35 76 10 35 91 90
102 76 99 20 273 330 90
103 127 28 30 128 195 90
104 8 119 20 142 197 90
105 102 110 10 754 814 90
106 24 24 10 583 647 90
107 64 61 20 1011 1077 90
108 22 38 20 950 1003 90
109 88 72 30 925 979 90
110 107 63 30 748 800 90
111 33 131 30 979 1037 90
112 123 112 20 405 459 90
113 67 55 10 15 62 90
114 39 128 10 65 133 90
115 136 0 30 426 491 90
116 93 36 20 98 166 90
117 7 115 10 801 872 90
118 21 44 20 115 180 90
119 28 74 20 188 260 90
120 86 102 10 93 159 90
121 19 37 20 665 738 90
122 84 36 10 568 626 90
123 118 108 10 972 1008 90
124 132 24 10 311 384 90
125 6 25 10 516 574 90
126 28 78 10 479 529 90
127 2 132 10 526 584 90
128 22 22 10 494 550 90
129 88 35 20 285 358 90
130 94 104 10 754 813 90
131 74 96 30 80 153 90
132 0 117 30 515 585 90
133 99 96 10 38 93 90
134 119 114 20 128 185 90
135 28 107 20 206 275 90
136 133 12 10 797 874 90
137 35 102 10 877 938 90
138 36 105 20 776 852 90
139 84 39 20 659 720 90
140 34 138 20 704 749 90
141 136 29 10 406 482 90
142 33 133 20 890 941 90
143 16 39 20 314 358 90
144 32 77 20 100 157 90
145 122 131 20 608 661 90
146 77 100 20 356 429 90
147 96 26 10 202 262 90
148 127 29 20 70 141 90
149 91 95 20 1036 1097 90
150 42 136 10 310 381 90
151 36 132 10 509 571 90
152 103 106 30 296 347 90
153 107 105 10 472 539 90
154 96 74 10 351 437 90
155 63 57 10 79 140 90
156 122 113 20 307 374 90
157 14 131 10 712 784 90
158 30 31 20 960 1016 90
159 40 132 20 137 182 90
160 99 26 40 287 363 90
161 10 118 10 76 144 90
162 102 60 30 840 900 90
163 120 136 10 417 482 90
164 97 29 30 49 119 90
165 19 39 10 764 823 90
166 27 77 10 284 349 90
167 30 24 20 673 748 90
168 126 112 10 507 543 90
169 105 110 20 567 634 90
170 118 114 10 65 126 90
171 135 6 30 153 210 90
172 111 66 20 561 617 90
173 95 77 10 278 325 90
174 139 10 30 723 756 90
175 61 54 10 262 329 90
176 16 38 20 387 466 90
177 16 138 10 86 142 90
178 91 78 10 88 141 90
179 91 71 20 829 890 90
180 0 27 30 241 292 90
181 6 113 20 720 768 90
182 119 139 20 234 298 90
183 35 99 20 976 1025 90
184 31 112 20 401 481 90
185 5 119 20 425 484 90
186 3 135 20 433 491 90
187 30 136 10 792 850 90
188 20 39 10 855 913 90
189 131 11 10 895 960 90
190 28 33 20 55 128 90
191 4 23 10 414 491 90
192 87 108 20 275 350 90
193 21 26 20 311 365 90
194 121 134 20 517 567 90
195 119 130 20 692 765 90
196 91 108 10 384 430 90
197 130 27 30 229 280 90
198 101 107 10 1038 1090 90
199 34 108 10 506 566 90
200 131 31 20 604 657 90];
% radomSelect.m
function [serial_non,ctAll]=randomSelect(M,K,demand,disOrg,ctPt,pt2,dis2,capacity)
% randomSelect is to choose an original route
% denotions of all inputs are consistent with ones in m-file of graphBuild
%55555555555555555555555555555555555555555555555555555555555555555555555555
%5 randomly generate routes
%55555555555555555555555555555555555555555555555555555555555555555555555555
flagEmp=ones(1,M);
% Get a discrete serial
dd=randperm(M);
flagRand=1;
isSuc=1;
serial_non={};
capVe=zeros(1,K);
ctAll=0; % put down customers arranged
for i=1:K
pt=dd(flagRand); % Select the first customer of a route
flagRand=flagRand+1;
while(~flagEmp(pt)&flagRand<=M)
pt=dd(flagRand);
flagRand=flagRand+1;
end
if(flagRand>M) % all customers has been arranged while some vehicles are empty
break;%%'***************************'
end
timeCur=disOrg(pt); % initialization of each vehicle
demandCur=demand(pt);
count=1; % count the vehicles used
serial_non{i}(count)=pt;
capVe(i)=demand(pt);
flagEmp(pt)=0;
ctAll=ctAll+1;
%------- ------- --------- -------- -------- -------- ------- --------
judgeFlag=1;
while(judgeFlag)
while(ctPt(pt)>0) % find an unused location "next"
%index=ceil(rand(1)*ctPt(pt));
[dsd,index]=min(dis2(pt,pt2{pt}));
if(~flagEmp(pt2{pt}(index)))
pt2{pt}(index)=pt2{pt}(ctPt(pt));
ctPt(pt)=ctPt(pt)-1;
continue;
else
break;
end
end
isNext=ctPt(pt);
if(isNext) % verify the current point "next"
next=pt2{pt}(index);
timeCur=timeCur+dis2(pt,next);
demandCur=demandCur+demand(next);
inFlag=demandCur<=capacity;
if(inFlag)
count=count+1;
capVe(i)=demandCur;
serial_non{i}(count)=next;
flagEmp(next)=0;
ctAll=ctAll+1;
pt=next;
else
break;
end
else
break;
end
end
end
% crossOver.m
function serial_non=crossOver(parent1,parent2,dis2,M,K,capacity,demand)
% record all the routes used in the two chromosomes
inIndex=zeros(2,M);
outIndex=zeros(2,M);
len=length(parent1);
for i=1:len
subLen=length(parent1{i})-1;
for j=1:subLen
inIndex(1,parent1{i}(j+1))=parent1{i}(j);
outIndex(1,parent1{i}(j))=parent1{i}(j+1);
end
end
len=length(parent2);
for i=1:len
subLen=length(parent2{i})-1;
for j=1:subLen
inIndex(2,parent2{i}(j+1))=parent2{i}(j);
outIndex(2,parent2{i}(j))=parent2{i}(j+1);
end
end
inSum=sum(inIndex>0);
outSum=sum(outIndex>0);
for i=1:M
if(outSum(i)==2) % location is used for pt with no ending connectin to st
if(dis2(i,outIndex(1,i))>dis2(i,outIndex(2,i)))
outIndex(1,i)=0;
else
outIndex(2,i)=0;
end
end
if(inSum(i)==2) % location is used for pt with no start connectin to st
if(dis2(inIndex(1,i),i)>dis2(inIndex(2,i),i))
inIndex(1,i)=0;
else
inIndex(2,i)=0;
end
end
end
% firstly find sth from one-side point, and find routes with such pt as one
% end
flagUsed=zeros(1,M);
ctAll=0;
ctVe=0;
outFlag=sum(outIndex>0);
inFlag=sum(inIndex>0);
outIndex=sum(outIndex);
inIndex=sum(inIndex);
serial_non={};
for i=1:M
if(inFlag(i)==0&~flagUsed(i)&outFlag(i))
ctVe=ctVe+1;
count=1;
serial_non{ctVe}(count)=i;
capVe(ctVe)=demand(i);
pt=i;
flagUsed(i)=1;
ctAll=ctAll+1;
while(outFlag(pt)&~flagUsed(outIndex(pt)))
cap=capVe(ctVe)+demand(outIndex(pt));
if(cap>capacity)
break;
end
capVe(ctVe)=cap;
ctAll=ctAll+1;
count=count+1;
serial_non{ctVe}(count)=outIndex(pt);
pt=outIndex(pt);
flagUsed(pt)=1;
end
elseif(outFlag(i)==0&~flagUsed(i)&inFlag(i))
ctVe=ctVe+1;
count=1;
serial_non{ctVe}(count)=i;
capVe(ctVe)=demand(i);
pt=i;
flagUsed(i)=1;
ctAll=ctAll+1;
while(inFlag(pt)&~flagUsed(inIndex(pt)))
cap=capVe(ctVe)+demand(inIndex(pt));
if(cap>capacity)
break;
end
capVe(ctVe)=cap;
ctAll=ctAll+1;
count=count+1;
serial_non{ctVe}(count)=inIndex(pt);
pt=inIndex(pt);
flagUsed(pt)=1;
end
trans=serial_non{ctVe};
for i=1:count
serial_non{ctVe}(i)=trans(count+1-i);
end
end
end
% secondly try to trsemble all the points as long as possible
% we can cut it to pieces if it disobeys the capacity constraint
for i=1:M
if(flagUsed(i))
continue;
end
pre=[];
after=i;
ptPre=i;
ptAfter=i;
while(inFlag(ptPre)&~flagUsed(inIndex(ptPre)))
pre=[pre,inIndex(ptPre)];
ptPre=inIndex(ptPre);
end
while(outFlag(ptPre)&~flagUsed(outIndex(ptAfter)))
after=[after,outIndex(ptAfter)];
ptAfter=outIndex(ptAfter);
end
len1=length(pre);
len2=length(after);
ctVe=ctVe+1;
count=1;
capVe(ctVe)=0;
for j=len1:-1:1
cap=capVe(ctVe)+demand(pre(j));
if(cap>capacity)
break;
end
serial_non{ctVe}(count)=pre(j);
capVe(ctVe)=cap;
ctAll=ctAll+1;
count=count+1;
flagUsed(pre(j))=1;
end
for j=1:len2
cap=capVe(ctVe)+demand(after(j));
if(cap>capacity)
break;
end
serial_non{ctVe}(count)=after(j);
capVe(ctVe)=cap;
ctAll=ctAll+1;
count=count+1;
flagUsed(after(j))=1;
end
end
% fitness.m
function fit=fitness(serial_non,distance,disOrg)
% all the constraints including time and demand have been examned
% As a result, here we only figure the total distances traveled by all
% vehicles, which is the value of our objective function
len=length(serial_non);
fit=0;
for i=1:len
fit=fit+disOrg(serial_non{i}(1))+disOrg(serial_non{i}(end));
subLen=length(serial_non{i})-1;
for j=1:subLen
fit=fit+distance(serial_non{i}(j),serial_non{i}(j+1));
end
end
- Genetic Algorithm for VRP
- Genetic Algorithm
- TSP-Genetic Algorithm
- 遗传算法 Genetic Algorithm
- 基因算法 Genetic Algorithm
- 遗传算法--genetic algorithm
- 遗传算法(Genetic Algorithm)
- 遗传算法Genetic Algorithm
- 遗传算法(Genetic Algorithm)
- Group genetic algorithm
- A Simple C# Genetic Algorithm
- Design sequences using genetic algorithm
- 遗传算法(Genetic Algorithm,GA)
- Genetic Algorithm遗传算法学习
- [笔记]遗传算法 genetic algorithm
- Genetic Algorithm遗传算法学习
- 遗传算法(Genetic Algorithm)
- 遗传算法(genetic algorithm, GA)
- Nokia官方培训笔记 第六篇Descriptors
- 介绍LDAP(转贴)
- 用Visual Studio 2005和MapXtremeNT开发网络地理信息系统
- 三则小故事
- SEO与外链
- Genetic Algorithm for VRP
- 网站推广的18种秘笈
- js+css图片自动等比例缩小且垂直居中
- DataSet的用法
- 有关日期函数
- 中文版Windows XP升级SP3安装方法
- Log4j具体输出信息级别配置方法
- 佩服!原来兔子是这样吃掉狼和野猪的
- WebForm中DataGrid的20篇经典文章