MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn moreOpportunities for recent engineering grads.

Apply Today
Asked by Yogesh Shukla on 18 Apr 2013

function genetic4()

xy =[

6.9409 0.2259

1.7989 5.2270 3.1137 4.5593

8.8533 3.2828

7.6421 0.9238

5.0609 5.2346

3.0046 9.0919

8.6061 8.6808

2.0093 5.1440

4.3699 2.3990

9.8835 3.0795

9.0423 3.9674

5.7818 1.1668

7.7035 2.2236

7.6342 0.8472

5.5940 9.9058

7.0005 5.8606

4.8557 6.3250

4.7683 1.9913

7.4014 1.7087

7.4623 4.4927

2.0258 4.0282

0.8051 1.0827

7.0566 1.7103

4.4705 6.1112

3.4823 4.9517

1.4722 2.7032

9.2913 3.0202

3.8684 0.0541

7.6120 0.0102

0.5414 5.1897

8.7149 2.4217

7.1843 0.8910

6.1193 6.3243

0.6303 8.1332 ];

N = size(xy,1);

a = meshgrid(1:N);

distance_matrix = reshape(sqrt(sum((xy(a,:)-xy(a',:)).^2,2)),N,N);

population = 100;

iterations = 1e4;

figure('Name','City Locations','Numbertitle','on');

plot(xy(:,1),xy(:,2),'k.');

[nr,nc] = size(distance_matrix);

if N ~= nr N ~= nc

error('Invalid XY or distance_matrix inputs!')

end

n = N;

population = 4*ceil(population/4);

iterations = max(1,round(real(iterations(1))));

pop = zeros(population,n);

for k = 1:population

pop(k,:) = randperm(n);

end

global_min = Inf;

total_dist = zeros(1,population);

dist_history = zeros(1,iterations);

tmp_pop = zeros(4,n);

new_pop = zeros(population,n);

pfig = figure('Name','genetic | Current Best

Solution','Numbertitle','off');

for iter = 1:iterations

for p = 1:population

d = distance_matrix(pop(p,n),pop(p,1));

for k = 2:n d = d + distance_matrix(pop(p,k-1),pop(p,k));

end

total_dist(p) = d;

end

[min_dist,index] = min(total_dist);

dist_history(iter) = min_dist;

if min_dist < global_min

global_min = min_dist;

if global_min>75.000

% global_min = 80.152;

best_route = pop(index,:);

figure(pfig);

route = best_route([1:n 1]);

plot(xy(route,1),xy(route,2),'r.-');

title(sprintf('Total Distance = %1.4f, Iteration =

%d',min_dist,iter));

end end

rand_pair = randperm(population);

for p = 4:4:population

routes = pop(rand_pair(p-3:p),:);

dists = total_dist(rand_pair(p-3:p));

[~,idx] = min(dists);

best_of_4_route = routes(idx,:);

ins_pts = sort(ceil(n*rand(1,2)));

I = ins_pts(1);

J = ins_pts(2);

for k = 1:4

tmp_pop(k,:) = best_of_4_route;

switch k case 2

tmp_pop(k,I:J) = fliplr(tmp_pop(k,I:J)); case 3 tmp_pop(k,[I J]) = tmp_pop(k,[J I]);

case 4 tmp_pop(k,I:J) = tmp_pop(k,[I+1:J I]);

otherwise

end display(best_of_4_route);

display(d);

end

new_pop(p-3:p,:) = tmp_pop; end

pop = new_pop; end end

*No products are associated with this question.*

Answer by Jan Simon on 18 Apr 2013

It is not a good idea to let us guess, in which lines you want to perform "I want to terminate the program when route distance becomes 75". I find:

if global_min>75.000 ... end

But there is no trial to terminate the program, as far as I can see. Do you want to add a `return` command there?

Yogesh Shukla on 18 Apr 2013

My program finds routes and optimizes them according to path length. My purpose of terminating at

global_min>75

was to find the route which has length more than 75. But I am unable to store whole work space by

% save('d')

(all routes, all distances etc). It only stores final route and final path length. What should I use to store it.

## 1 Comment

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/72542#comment_143970

Please learn how to format code in the forum. A blank line after each line of code reduces the readability. The indentation can be cleaned automatically by Matlab's editor (mark bloc, Ctrl-I).