2015-05-19 74 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