你好我正在用一个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)));
末
'分钟=米;'将使代码运行不适当 – scmg
您正在使用功能'min' _and_限定称为'min'变量,其阴影的功能。您应该更改该变量名称。 –
是的,但即时通讯使用一个名为minimo的变量,我写了分钟只是为了让你明白 – Andy