Discover MakerZone

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

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

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.

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

1 Comment

Jan Simon on 18 Apr 2013

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).

Yogesh Shukla

Products

No products are associated with this question.

1 Answer

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?

1 Comment

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.

Jan Simon

Contact us