2015-05-19 71 views
0

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

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个变量

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

+0

'分钟=米;'将使代码运行不适当 – scmg

+0

您正在使用功能'min' _and_限定称为'min'变量,其阴影的功能。您应该更改该变量名称。 –

+0

是的,但即时通讯使用一个名为minimo的变量,我写了分钟只是为了让你明白 – Andy

回答

0

你可以很容易地通过设置最低为矢量做到这一点,以你的函数循环,例如:

for a = 1:10 
    number = rand(10); 
    minimum(a) = min(number); 
end 

最后,您将具有与迭代时间长度相同的最小向量。然后,您可以对矢量做另一个最小值以获得整个迭代过程的最小值。

在你的情况,你可以简单地把迭代器调用函数;如果你在使用while,你可以把一个常量(最初设置为1)并每次添加一个,并将其用作向量索引。

a = 1; 
while (some condition) 
    conditions 
    [temp(a), m(a)] = min (fitness_pers); 
    a= a+1; 
end 
+0

是的,但与第二个例子,你保存最小值的索引,而不是价值,我需要有价值,因为在我的算法中,我有5变量,每个变量都对应于空间中的5个位置。我怎样才能得到一个不像索引的值,但像价值? – Andy

+0

因为你没有提供一个可运行的例子,所以很难为你提供帮助 – scmg

+0

@scmg我改变了一个完整的代码 – Andy