首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用MATLAB时,节省的时间最少

在使用MATLAB时,节省的时间最少
EN

Stack Overflow用户
提问于 2015-05-19 23:09:14
回答 1查看 42关注 0票数 0

你好,我正在写一个带有while循环的代码,在迭代过程中,我需要保存一个函数的最小值。现在在我的代码中,我保存了迭代的最后一个值,但是我想要最低的值,而不是最后一个值,如何解决它呢?她的代码是我的(我想记住这段代码在运行一段时间)

代码语言:javascript
复制
particelle = 30;               % numero delle particelle
it  = 50;                      % massimo numero di iterazioni
var = 5;                       % numero di variabili del problema
ls = 1;                        % limite superiore
li = 0;                        % limite inferiore
c2 =0.1;                      % parametro PSO 
c1 = 0.1;                     % parametro PSO 
w =0.9;                        % inerzia del PSO

% Parametri del benchmark
Io   =   3.195366750697098e-9;
Iirr =   1.073577407858;
Rp   =   0.783526109678138e+5;
Rs   =   1.18407328046765;
n    =   1.33752492449578;

% Limiti da considerare 
Io_low = Io - (Io * 0.1);               % valore basso togliamo il 10   per cento
Io_high = Io + (Io * 0.1);              % valore alto sommiamo il 10 per cento
Iirr_low = Iirr - (Iirr * 0.1);         % valore basso togliamo il 10 per cento
Iirr_high = Iirr + (Iirr * 0.1);        % valore alto sommiamo il 10 per cento
Rp_low = Rp - (Rp * 0.1);               % valore basso togliamo il 10   per cento
Rp_high = Rp + (Rp * 0.1);              % valore alto sommiamo il 10 per cento
Rs_low = Rs - (Rs * 0.1);               % valore basso togliamo il 10 per cento
Rs_high = Rs + (Rs * 0.1);              % valore alto sommiamo il 10 per cento
n_low = n - (n * 0.1);                  % valore basso togliamo il 10 per cento
n_high = n + (n * 0.1);                 % valore alto sommiamo il 10 per cento

x_low = [Rs_low, n_low, Io_low, Iirr_low, Rp_low ];
x_high = [Rs_high, n_high, Io_high, Iirr_high, Rp_high];

fitness1 = @fitness;          % funzione di fitness


pos = rand(particelle, var);            % posizione delle particelle
vel = 1e-3*rand(particelle, var) ;      % velocità delle particelle
pers  = pos ;                           % personale delle particelle
glob = min(pers);                       % minimo di ogni colonna            
glob = repmat(glob,particelle,1);       % minimo globale uguale per ogni particella           

fitness_corrente = zeros(particelle,1);              % inizializziamo la matrice fitness_corrente che conterrà tutti i valori del fitness di ogni singola particella 
h = zeros(particelle,var);                           % inizializziamo la matrice per 
for i = 1: particelle
h(i,:) = x_low + (pos(i,:).*(x_high-x_low));     % normalizziao i limiti delle particelle
fitness_corrente(i,:) = fitness1(h(i,:));        % fitness della prima popolazione normalizzata
end 

% assegnamo il valore di fitness di ogni particella a fitness_personale
fitness_pers = fitness_corrente;

% indidichiamo con fitness_globale il minimo valore ottenuto dalla fitness e la posizione che occupa x è la particella con ilvalore minimo di fitness
[fitness_glob, minimo] = min(fitness_pers);

%% Main
iter = 1 ;                                    % Contatore 
while  ( iter < it )                          % Finchè non arriviamo a 50 continua 
iter = iter + 1;

% Assegnamo i nuovi valori al personale se ce ne è bisogno
for i = 1:particelle
for j = 1: var
    if pos(i,j) < pers(i,j)
        pers(i,j) = pos(i,j);
    end 
end
end
% implementiamo il valore globale
glob = min(pers);                       % minimo di ogni colonna            
glob = repmat(glob,particelle,1);               % minimo globale uguale per ogni particella           

% implementiamo ancora velocità e posizione
 vel = w*vel + c1*((pers-pos)) + c2*((glob-pos));
 vel(vel<=-0.99) = -0.1;
 pos = pos + vel; 
 con = 0;
% vediamo se le particelle sono all' interno
for i = 1:particelle
for k = 1:var
    if pos(i,k) < li || pos(i,k) > ls
        pos(i,:) = rand(1,var);
        con = con +1;
    end 
end 
end

% vediamo di nuovo il fitness della singola particella normalizzata
for i = 1: particelle
h(i,:) = x_low + (pos(i,:).*(x_high-x_low));     % normalizziao i limiti delle particelle
fitness_corrente(i,:) = fitness1(h(i,:));        % fitness della nuova popolazione
if fitness_corrente(i,:) < fitness_pers(i,:)     % se il fitness della nuova popolazione è minore di quello della vecchia popolazione
    fitness_pers(i,:) = fitness_corrente(i,:);   % assegna il valore di quel fitness alla nuova posizione 
end

end 

[temporaneo, m] = min( fitness_pers);       % temporaneo serve esclusivamente a vedere se il minimo è diminuito rispetto a prima
if temporaneo < fitness_glob
fitness_glob = temporaneo;
minimo = m;                                  % riassegnamo così anche la posizione del fitness globale
end

end % fine del loop


disp(fitness_glob);                         % fitness minimo
disp(h(minimo,:));          

这是一个完整的测试,函数适合性是这个,但您可以使用另一个具有5个变量的

代码语言:javascript
复制
function [ f ] = fitness(x)

Rs       = x(1);
n        = x(2);
Io       = x(3);
Iirr_ref = x(4);
Rp       = x(5);

load datatest_bench1.txt;
V = datatest_bench1(:,1);
I = datatest_bench1(:,2);

for i=1:length(V)
    Ieval(i) = I_bench1(Rs,Rp,Io,Iirr_ref,n,273.15+45,V(i));
    f(i)     = (Ieval(i)-I(i));      
end
    f = mean(abs(Ieval(i)-I(i)));      

结束

EN

回答 1

Stack Overflow用户

发布于 2015-05-19 23:24:29

通过将最小值设置为与函数一起迭代的向量,可以很容易地做到这一点,例如:

代码语言:javascript
复制
for a = 1:10
   number = rand(10);
   minimum(a) = min(number);
end

最后,你会得到一个与你迭代的时间长度相同的向量的最小值。然后,您可以对向量执行另一个最小值,以获得整个迭代过程的最小值。

在您的示例中,您可以简单地将迭代器放入调用函数中;如果您使用的是while,则可以放置一个常量(初始设置为1),并在每次添加一个常量,然后将其用作向量索引。

代码语言:javascript
复制
a = 1;
while (some condition)
    conditions
    [temp(a), m(a)] = min (fitness_pers); 
    a= a+1;
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30329456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档