% ( ) %-------------------------------------------------------------------------- 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