
















%   (     ) %-------------------------------------------------------------------------- tic % clearvars -except cities clearvars % ----------------------------------------------------------------- % -  m = 1000000; % ---------------------------------------------------------------- %   Tstart = 100000; %   Tend = 0.1; %     T = Tstart; %  S = inf; %   n = 500; %  ? g = 1; % ------------------------------------------------------------------- %   dist = zeros(n,n); % ------------------------------------------------------------------------- %   (x,y) cities = rand(n,2)*100; %      RANDONE = rand(m,1); %      D = randi(n,m,2); %    ROUTE = randperm(n); %    for i = 1:n for j = 1:n % dist (  ) dist(i,j) = sqrt((cities(i,1) - cities(j,1))^2 + ... (cities(i,2) - cities(j,2))^2); end end %  ,   -  for k = 1:m %    Sp = 0; %     , ROUTEp - %   %   ROUTEp = ROUTE; %    transp = D(k,[1,2]); %    ,      . if transp(1) < transp(2) if transp(1) ~= 1 && transp(2) ~= n S = dist(ROUTE(transp(1)-1),ROUTE(transp(1))) + ... dist(ROUTE(transp(2)),ROUTE(transp(2)+1)); elseif transp(1) ~= 1 && transp(2) == n S = dist(ROUTE(transp(1)-1),ROUTE(transp(1))) + ... dist(ROUTE(transp(2)),ROUTE(1)); elseif transp(1) == 1 && transp(2) ~= n S = dist(ROUTE(end),ROUTE(transp(1))) + ... dist(ROUTE(transp(2)),ROUTE(transp(2)+1)); end else if transp(2) ~= 1 && transp(1) ~= n S = dist(ROUTE(transp(2)-1),ROUTE(transp(2))) + ... dist(ROUTE(transp(1)),ROUTE(transp(1)+1)); elseif transp(2) ~= 1 && transp(1) == n S = dist(ROUTE(transp(2)-1),ROUTE(transp(2))) + ... dist(ROUTE(transp(1)),ROUTE(1)); elseif transp(2) == 1 && transp(1) ~= n S = dist(ROUTE(end),ROUTE(transp(2))) + ... dist(ROUTE(transp(1)),ROUTE(transp(1)+1)); end end %------------------------------------------------------------------------- if transp(1) < transp(2) ROUTEp(transp(1):transp(2)) = ROUTEp(transp(2):-1:transp(1)); if transp(1) ~= 1 && transp(2) ~= n Sp = dist(ROUTEp(transp(1)-1),ROUTEp(transp(1))) + ... dist(ROUTEp(transp(2)),ROUTEp(transp(2)+1)); elseif transp(1) ~= 1 && transp(2) == n Sp = dist(ROUTEp(transp(1)-1),ROUTEp(transp(1))) + ... dist(ROUTEp(transp(2)),ROUTEp(1)); elseif transp(1) == 1 && transp(2) ~= n Sp = dist(ROUTEp(end),ROUTEp(transp(1))) + ... dist(ROUTEp(transp(2)),ROUTEp(transp(2)+1)); end else ROUTEp(transp(2):transp(1)) = ROUTEp(transp(1):-1:transp(2)); if transp(2) ~= 1 && transp(1) ~= n Sp = dist(ROUTEp(transp(2)-1),ROUTEp(transp(2))) + ... dist(ROUTEp(transp(1)),ROUTEp(transp(1)+1)); elseif transp(2) ~= 1 && transp(1) == n Sp = dist(ROUTEp(transp(2)-1),ROUTEp(transp(2))) + ... dist(ROUTEp(transp(1)),ROUTEp(1)); elseif transp(2) == 1 && transp(1) ~= n Sp = dist(ROUTEp(end),ROUTEp(transp(2))) + ... dist(ROUTEp(transp(1)),ROUTEp(transp(1)+1)); end end %-------------------------------------------------------------------------- if Sp < S ROUTE = ROUTEp; iter = k; else %    P = exp((-(Sp - S)) / T); if RANDONE(k) <= P ROUTE = ROUTEp; end end %   T = Tstart / k; %    if T < Tend break; end; end %   citiesOP(:,[1,2]) = cities(ROUTE(:),[1,2]); plot([citiesOP(:,1);citiesOP(1,1)],[citiesOP(:,2);citiesOP(1,2)],'-r.') msgbox ('!') %   clearvars -except cities ROUTE S iter %   toc  %   (     ) % ------------------------------------------------------------------------- tic % clearvars -except cities clearvars % ----------------------------------------------------------------- % -  (  ) age = 2000; % -    countage = 10; % -  n = 50; % ----------------------------------------------------------------- %  -  ,  0     %   a = 1; %  -  ,  0  %      b = 2; %  ,  e = 0.1; %  ,  p = 0.1; %    Q = 1; %        AS q = 0.9; %   ph = Q/(n*2000); % ------------------------------------------------------------------- %   dist = zeros(n,n); %    returndist = zeros(n,n); %       ROUTEant = zeros(countage,n); %       DISTant = zeros(countage,1); %       bestDistVec = zeros(age,1); %    bestDIST = inf; %   ROUTE = zeros(1,n+1); %     (    ) RANDperm = randperm(n); %   P = zeros(1,n); %    val = zeros(1); %    getcity = zeros(1); %     indexP = zeros(1); %  minDISTiterration = zeros(1); % ------------------------------------------------------------------------- %   (x,y) cities = rand(n,2)*100; %    tao = ph*(ones(n,n)); tao(logical(eye(size(tao)))) = 0; %        for i = 1:n for j = 1:n % dist (  ) dist(i,j) = sqrt((cities(i,1) - cities(j,1))^2 + ... (cities(i,2) - cities(j,2))^2); % nn (   ) if i ~= j returndist(i,j) = 1/sqrt((cities(i,1) - cities(j,1))^2 + ... (cities(i,2) - cities(j,2))^2); end end end %  for iterration = 1:age %  (  ) for k = 1:countage % ******************    ****************** %    %     ROUTEant(k,1) = randi([1 n]); %       (   ), - %   -       % ROUTEant(k,1) = RANDperm(k); %           1- % ROUTEant(k,1) = 1; %       ,    %  ,     ,      %   % if iterration == 1 % ROUTEant(k,1) = randi([1 n]); % % ROUTEant(k,1) = RANDperm(k); % % ROUTEant(k,1) = 1; % else % ROUTEant(k,1) = lastROUTEant(k); % end % ********************************************************************* %   ,   ,     for s = 2:n %     ir = ROUTEant(k,s-1); %    (  ) ,     % : tao^a*(1/S)^b % 1/S - returndist. %      (-  *  %  * - ) ,       , %      .    %   .     : % for c = 1:n % P(1,c) = tao(ir,c).^a * returndist(ir,c).^b; % end P = tao(ir,:).^a .* returndist(ir,:).^b; %   (     k- ) %  n ,      ,   %  %     ,   ,  %    0,     %       P(ROUTEant(k,1:s-1)) = 0; %       RANDONE = rand; if RANDONE <= q [val, getcity] = max(P); else %    (     = 1 ) P = P ./ sum(P); getcity = find(cumsum(P) >= RANDONE, 1, 'first'); end %  s-    k-  ROUTEant(k,s) = getcity; end %   k-  ROUTE = [ROUTEant(k,1:end),ROUTEant(k,1)]; %   S = 0; %   k-  for i = 1:n S = S + dist(ROUTE(i),ROUTE(i+1)); end %  k- ,   k-  age-  DISTant(k) = S; %     S if DISTant(k) < bestDIST bestDIST = DISTant(k); bestROUTE = ROUTEant(k,[1:end,1]); iter = iterration; end %  ""  k-  (    %      ,    %  ) % lastROUTEant = ROUTEant(1:end,end); %   ,    for tL = 1:n xL = ROUTE(tL); yL = ROUTE(tL+1); %    tao(xL,yL) = (1-p)*tao(xL,yL) + p*ph; tao(yL,xL) = (1-p)*tao(yL,xL) + p*ph; end end % -------------------------- -------------------------- %   ""   -   tao(tao < 2.500000000000000e-150) = 2.500000000000000e-150; %    for t = 1:n xG = bestROUTE(t); yG = bestROUTE(t+1); %    tao(xG,yG) = tao(xG,yG) + e*(Q/bestDIST); tao(yG,xG) = tao(yG,xG) + e*(Q/bestDIST); end end %   citiesOP(:,[1,2]) = cities(bestROUTE(:),[1,2]); plot([citiesOP(:,1);citiesOP(1,1)],[citiesOP(:,2);citiesOP(1,2)],'.r-') disp (num2str(bestDIST)) msgbox ('!') clearvars -except cities bestDIST bestROUTE iter toc Source: https://habr.com/ru/post/314056/
All Articles