你好,我正在写一个带有while循环的代码,在迭代过程中,我需要保存一个函数的最小值。现在在我的代码中,我保存了迭代的最后一个值,但是我想要最低的值,而不是最后一个值,如何解决它呢?她的代码是我的(我想记住这段代码在运行一段时间)
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))); 结束
发布于 2015-05-19 23:24:29
通过将最小值设置为与函数一起迭代的向量,可以很容易地做到这一点,例如:
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;
endhttps://stackoverflow.com/questions/30329456
复制相似问题