Матрица вне границ в оптимизации роя частиц: как ограничить значения?

Я нахожу веса когнитивной карты, которая похожа на нейронную сеть с прямой связью, различие состоит в том, что нет собственной связи (следовательно, диагонали = 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]

Обратите внимание, что это отображение сохраняет нулевые значения и отношения между величинами весов.

Другие вопросы по тегам