Матрица вне границ в оптимизации роя частиц: как ограничить значения?
Я нахожу веса когнитивной карты, которая похожа на нейронную сеть с прямой связью, различие состоит в том, что нет собственной связи (следовательно, диагонали = 0). Весовая матрица 3*3
и каждая частица представляет веса, которые необходимо найти (оптимизировать). В моем приложении мне нужно ограничить значения весов в диапазоне [-1,1].
Итак, когда PSO обновляет свои уравнения скорости и положения (отрывок ниже), я выбрал те индексы, которые выше 1 и -1, и установил их пороговое значение. Я проверил значения скорости и положения. Первые 6 строк и 6 столбцов Velocity
являются
-3.29818766857477e-10 1.06365098218884e-09 1.72718584823501e-08 8.52030002125361e-08 4.24567055691019e-09 1.42682312020373e-10
-0.527487299879998 0.0141963443263498 2 -2 0.0804033989937564 0.0294235685161277
-0.460426149819118 -0.00962472296493386 -0.231141442703638 -0.161996004370743 -0.00140062376098630 -0.0183361675902131
0.490979470234505 -0.150287862753787 -0.453325515475146 1.48710788599919 -2 -0.0168498207544201
-1.49184829189134 0.718322120314944 0.191912248648141 1.67798502924430 -0.811846486653242 -0.00645584872854835
0.0236930729558028 0.725697240982270 -0.571776066383284 -0.481114642909396 -0.623411799726210 0.00226958877218209
А также Position
значения для первых 6 строк и 6 столбцов =
-7.98664279308835 -3.90744804351231 -6.92609001695919 -6.38057220301763 6.34627589189950 0.515032878765257
-8.23428663786642 -3.91888491694193 -5.06678793435555 -7.66405701509194 6.18465937874726 0.527740403314418
-8.18128160012481 -3.91458365620100 -6.65571517234057 -6.64026727804025 6.46684166489122 0.509478265627388
-7.82297889594148 -3.73466474001669 -6.83434245810552 -5.84907863164857 6.76798656860034 0.497959367071159
-8.65135591544159 -3.40466585557339 -7.11566232657911 -6.09503181101550 5.95791723669973 0.511429259659808
-7.93848660180123 -3.22292763621706 -6.41517926678420 -7.12188582637202 6.18562296678481 0.514711315467883
Значения Positions
и, следовательно, вес, а также Velocity
находятся за пределами диапазона, который я упомянул. Что нужно сделать, чтобы значения Положения и, следовательно, весовая матрица находились в диапазоне [-1,1]? Куда я иду не так? Пожалуйста помоги.
noP = 10;
Dim = 9;
Velocity=zeros(noP,Dim); %Velocity vector
Position=zeros(noP,Dim); %Position vector
weight_min_range = -1;
weight_max_range = 1;
velocity_clamping_factor = 2;
Vmax=weight_max_range*velocity_clamping_factor;
Vmin=-Vmax;
%////////Cognitive component/////////
pBestScore=zeros(noP);
pBest=zeros(noP,Dim);
pBestScore2=zeros(noP);
%Initialization
for i=1:size(Position,1) % For each Particle
for j=1:size(Position,2) % For each dimension
Position(i,j)=rand();
Velocity(i,j)=rand();
end
end
for PSOITER = 1:IterMax
%INSIDE PSO LOOP : DETAILS SKIPPED
.........
............
%Fitness evaluation by each particle for all training set
for i=1:size(pos,1)
for j=1:size(pos,2)
Velocity(i,j)=inertia*vel(i,j)+c1*rand()*(pBest(i,j)-Position(i,j))+c2*rand()*(gBest(j)-Position(i,j));
Vind1 = Velocity<Vmin;
Vind2 = Velocity>Vmax;
Velocity(Vind1) = Vmin;
Velocity(Vind2) = Vmax;
Position(i,j)= Position(i,j)+ Velocity(i,j);
end
end
После того, как все вычисления и процедура PSO закончены, я получаю следующую Матрицу Веса вместо значений матрицы веса, находящихся в диапазоне от -1 до 1.
WeightMatrix =
0 -6.9261 6.3463
-7.9866 0 0.5150
-3.9074 -6.3806 0
1 ответ
Ваш Velocity
все значения кажутся в пределах [-1, 1]
,
Ваш код не содержит пороговое значение Position
,
Кроме того, вы устанавливаете пороги для всех значений Velocity
на каждой итерации i,j
пока только обновление Velocity(i,j)
,
Если вы хотите, чтобы порог обоих Velocity
а также Position
и избегайте использования цикла, вы можете заменить весь цикл оценки пригодности следующим:
G = repmat(gBest, Dim, 1);
Velocity = inertia*vel + c1*rand(size(Velocity))*(pBest - Position) + ...
c2*rand(size(Velocity))*(G - Position);
Velocity(Velocity < Vmin) = Vmin;
Velocity(Velocity > Vmax) = Vmax;
Position = Position + Velocity;
Position(Position < Pmin) = Pmin;
Position(Position > Pmax) = Pmax;
В качестве альтернативы, вы можете позволить Position
а также Velocity
развиваться без порога и нормализовать весовую матрицу в конце процесса:
w_max = max(W(:));
w_min = min(W(:));
W_norm = -1.0 + (W - w_min)*2.0/(w_max - w_min);
Это отобразит вашу весовую матрицу W
в [-1 1]
вот так:
[0.11444 -0.85202 1.00000;
-1.00000 0.11444 0.18631;
-0.43079 -0.77590 0.11444]
Альтернативный метод, который сохранит масштабирование положительных и отрицательных значений относительно нуля:
w_max = max(W(:));
w_min = min(W(:));
w_abs_max = max([abs(w_max), abs(w_min)]);
W_norm = -1.0 + (W - w_min)/w_abs_max;
Который отобразит вашу матрицу веса в [-1 1]
следующим образом:
[0.00000 -0.86722 0.79462;
-1.00000 0.00000 0.06448;
-0.48924 -0.79891 0.00000]
Обратите внимание, что это отображение сохраняет нулевые значения и отношения между величинами весов.