Matlab 粒子群优化中的矩阵越界:如何限制值?

Matlab 粒子群优化中的矩阵越界:如何限制值?,matlab,matrix,particle-swarm,Matlab,Matrix,Particle Swarm,我发现认知图的权重类似于前馈神经网络,区别在于没有自连接(因此对角线=0)。权重矩阵为3*3,每个粒子表示需要找到(优化)的权重。在我的应用程序中,我需要将权重值限制在[-1,1]的范围内。 所以,当粒子群优化算法更新它的速度和位置方程(下面摘录)时,我选择了那些大于1和-1的指数,并对它们设置了阈值。我检查了速度和位置的值。Velocity的前6行和6列是 -3.29818766857477e-10 1.06365098218884e-09 1.72718584823501e-08

我发现认知图的权重类似于前馈神经网络,区别在于没有自连接(因此对角线=0)。权重矩阵为
3*3
,每个粒子表示需要找到(优化)的权重。在我的应用程序中,我需要将权重值限制在
[-1,1]的范围内。
所以,当粒子群优化算法更新它的速度和位置方程(下面摘录)时,我选择了那些大于1和-1的指数,并对它们设置了阈值。我检查了速度和位置的值。
Velocity
的前6行和6列是

-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
位置
前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
位置
的值以及因此而产生的权重和
速度
的值超出了我提到的范围。应采取什么措施使位置值和权重矩阵在[-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

您的
Velocity
值似乎都在
[-1,1]
范围内

您的代码不包含
位置的阈值设置

此外,在每次迭代
i,j
时,您将对
Velocity
的所有值设置阈值,同时只更新
Velocity(i,j)

如果您想同时设定
速度
位置
的阈值,并避免使用循环,您可以将整个健身评估循环替换为:

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;
这会将您的权重矩阵
W
映射到
[-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]

[0.00000 -0.86722 0.79462;
-1.00000  0.00000 0.06448;
-0.48924 -0.79891 0.00000]

请注意此映射如何保留零值和权重大小之间的比率。

变量
惯性
的值是多少?^。即使我想在I,j循环中做,我对位置和速度设定了阈值,现在我得到的权重值只有-1和1,中间没有中间值。我取Pmin=-1和Pmax=1。我先存储索引然后再更新阈值的方法是否不正确?还有,如果我取Pmin=-1&Pmax=1,为什么结果权重现在只有-1和1?谢谢你的努力和时间,我会很感激的。我不太清楚你的算法是如何工作的,但是这里有一个建议:为什么不让位置和速度在没有阈值的情况下发展,然后在最后标准化权重,使最大值和最小值在[-1,1]范围内?我对算法的了解还不够多,不能再多加评论了。我将在我的答案中添加一个编辑,向您展示如何在更新权重后规范化权重。我当然会尝试上述方法,但在此之前,我想问一下,在计算适合度时,我是将输入特征与权重+偏差相乘。然后我计算这个输出和目标之间的平方误差(目标是[100;010;110])。那么,我应该在这一步中乘以标准化权重,还是与没有标准化的权重相乘?第二,在第二种标准化方法中保留零值的意义是什么?请原谅我的小问题。我在计算位置后应用了这两种方法,因为在适应度计算过程中,位置值与输入特征相乘。我得到的所有权重都是-1,两者之间没有任何值!!我不知所措,我该怎么办?请帮忙
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;
[0.00000 -0.86722 0.79462;
-1.00000  0.00000 0.06448;
-0.48924 -0.79891 0.00000]