I want to terminate the program when route distance becomes 75. But in command window program keeps running till the condition of iterations is achieved.

1 次查看(过去 30 天)
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
  1 个评论
Jan
Jan 2013-4-18
编辑:Jan 2013-4-18
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).

请先登录,再进行评论。

回答(1 个)

Jan
Jan 2013-4-18
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?
  1 个评论
Sanuj Shukla
Sanuj Shukla 2013-4-18
编辑:Sanuj Shukla 2013-4-18
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.

请先登录,再进行评论。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by