连续优化问题 处理y= x1^2+x2^2+x3^3......

       这个是我自己编写的连续蚁群算法求解问题的代码 在变量的个数2个以内的话,能够找到较好的最优解。但是在变量个数增加的情况下,却不能够很快找到最优解  反而陷入了局部最优。我才用了全局信息素更新以及局部信息素更新的规则 对其做了一下改变。并设置了一个上限count  当最优解10次均相同时,我变跳出局部 采用新产生一个变量组 从而跳出循环 ,显然是有效果的 ,但是效果不是很明显。下一步我会继续对我的代码和算法进行深入的了解 并作出代码修改,希望能有所提高!!!!!!!!下面附上该代码 

        clc 
clear all;
% global N
%----------------------- initialization of variable-----------------------%
N = 100;%等分区间的数量
N_ants=50;%蚂蚁的数目
N_vars = 3;%变量数量
Times=20;%迭代的次数
Q = 10000;%信息量强度
Rou=0.5;%信息量残留因子
det = 10;%最优解为中心 上下浮动的程度范围一般为[1,6]
for i = 1:N_vars
    Lower(i) = -5.12;
    Upper(i) = 5.12;
end
for j = 1:N_vars 
    h(j) = (Upper(j)-Lower(j))/N;%划分后区间的大小          
 end%j  
x_best = Upper;
fx_best = F1(x_best);%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
x(1,N_vars) = 0;
P(N,N_vars) = 0;
tao_sum(N_vars) = 0;
tao(1:N,1:N_vars) =1/N;
count=1;%计数
%-------------------------------------------------------------------------%
%% 算法开始
    for iter=1:Times %迭代次数
        P(N,N_vars) = 0;
         tao_sum(N_vars) = 0;
        tao(1:N,1:N_vars) =1/N;
        for i  = 1:N_ants%遍历每只蚂蚁
            %% 将变量区间进行划分网格 
             pos = ceil(N*rand(1,N_vars));%随机放置蚂蚁         
           for j = 1:N_vars 
               h(j) = (Upper(j)-Lower(j))/N;%划分后区间的大小
               x(j) = Lower(j)+(pos(j)-1)*h(j);%计算蚂蚁当前位置(区间)的 左区间的值 
           end%j    
        
            f_value = F1(x);%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  
           if f_value < fx_best
              %% 更新节点信息素局部更新
               for j= 1:N_vars
                      tao(pos(j),j) = (1-Rou)*tao(pos(j),j)+Rou*Q/f_value;
               end %j
                % 计算信息量总和
                for j = 1:N_vars
                   tao_sum(j) = sum(tao(:,j));
                 end%j
        %% 更新概率
            for j = 1:N
               for k = 1:N_vars
                  P(j,k) = tao(j,k) /tao_sum(k);
               end%k
            end %j  
           end%if
        end%i          
        %% 通过概率的大小选择最优的变量和最优的函数值
        for j = 1:N_vars
           P_vars = P(:,j);%第j个变量的所有区间概率
           [Px_best,ind] = sort(P_vars);%当前变量各个区间概率从小到大排序 ind 是对应概率的节点序号
           max_ind (j) = ind(N);%概率最大的节点序号=ind最后一个数 
           x_local(j) = Lower(j)+(Upper(j)-Lower(j))*(max_ind(j)-1)/N;%计算最大概率变量的值
        end %j 
        %信息素全局更新
         for j= 1:N_vars
              tao(max_ind(j),j) = (1-Rou)*tao(max_ind(j),j)+Rou*Q/f_value ;
         end %j
        fx_local(iter) = F1(x_local);
        if fx_best>fx_local
            fx_best = fx_local;
        end 
        lower(iter,:)=Lower;
        if iter>1
            if lower(iter,:)==lower(iter-1,:)
                count =count+1;
            end
        end
         count;
        if count==5
            count=0;
            max_ind = ceil(N*rand(1,N_vars));%随机放置蚂蚁
        end
        %% 缩小变量范围 优化变量范围  
        for j = 1:N_vars
               Lower_new(j) = Lower(j)+(max_ind(j)-det)*((Upper(j)-Lower(j))/N);
               Upper_new(j) = Lower(j)+(max_ind(j)+det)*((Upper(j)-Lower(j))/N);
               % 越界处理
               if Lower_new(j)<Lower(j)
                   Lower_new(j)=Lower(j);
               end
               if Upper_new(j) > Upper(j)
                   Upper_new(j) = Upper(j);
               end
               Lower(j) = Lower_new(j);
               Upper(j) = Upper_new(j);
        end %j
        Lower
        Upper
     end %i  
fx_local
fx_best
figure (2) %函数值的变化趋势
plot ([1:Times],fx_local,'b-')

function y  = F1(x)
% This is  function
% x is a vector


% d=length(x);
% z = 0;
% for k = 1:d
%     z = z + x(k).^2;
% end
y= sum(x.^2);
  
  
            
            
            

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,对于二次型 $f=x_1^2+x_2^2+x_3^2+2ax_1x_2+2x_1x_2+2x_1x_3+2bx_2x_3$,可以写成矩阵形式: $$ \boldsymbol{A}=\begin{pmatrix} 1+a & 1 & 1 \\ 1 & 1 & b \\ 1 & b & 1 \end{pmatrix} $$ 要将其化为标准形 $f=y_1^2+y_2^2+2y_3^2$,需要进行正交变换。设正交变换矩阵为 $\boldsymbol{P}$,即 $\boldsymbol{x}=\boldsymbol{Py}$,则原二次型可表示为 $f=\boldsymbol{x}^T\boldsymbol{A}\boldsymbol{x}$,带入正交变换后可得: $$ f=\boldsymbol{y}^T\boldsymbol{P}^T\boldsymbol{A}\boldsymbol{P}\boldsymbol{y} $$ 为了使其化为标准形,需要求出 $\boldsymbol{P}$ 和 $\boldsymbol{P}^T\boldsymbol{A}\boldsymbol{P}$。我们分别来求解。 首先,求出 $\boldsymbol{P}^T\boldsymbol{A}\boldsymbol{P}$。由于正交变换的矩阵是正交矩阵,因此有 $\boldsymbol{P}^T\boldsymbol{P}=\boldsymbol{P}\boldsymbol{P}^T=\boldsymbol{I}$。将 $\boldsymbol{x}=\boldsymbol{Py}$ 带入原式,可得: $$ \begin{aligned} f &= \boldsymbol{x}^T\boldsymbol{A}\boldsymbol{x} \\ &= \boldsymbol{y}^T\boldsymbol{P}^T\boldsymbol{A}\boldsymbol{P}\boldsymbol{y} \\ &= y_1^2 + y_2^2 + (1+a)y_3^2 + (2a+2)y_1y_2 + 2(1+b)y_1y_3 + 2by_2y_3 \end{aligned} $$ 要将其化为标准形 $f=y_1^2+y_2^2+2y_3^2$,需要令 $y_1, y_2, y_3$ 的系数分别为 $1, 1, 2$,即: $$ \begin{cases} 1+a = 2 \\ 2a+2 = 2 \\ 2(1+b) = 0 \\ 2b = 2 \end{cases} $$ 解得 $a=0, b=1$。 其次,求出正交变换矩阵 $\boldsymbol{P}$。由于 $\boldsymbol{P}$ 是正交矩阵,因此有 $\boldsymbol{P}^T\boldsymbol{P}=\boldsymbol{P}\boldsymbol{P}^T=\boldsymbol{I}$。根据上文的计算结果,可得: $$ \boldsymbol{P}^T\boldsymbol{A}\boldsymbol{P}=\begin{pmatrix} 2 & 0 & 0 \\ 0 & 2 & 0 \\ 0 & 0 & 1 \end{pmatrix} $$ 可以通过将 $\boldsymbol{A}$ 相似对角化来求解 $\boldsymbol{P}$。具体地,设 $\boldsymbol{P}$ 的列向量为 $\boldsymbol{p}_1, \boldsymbol{p}_2, \boldsymbol{p}_3$,则有: $$ \begin{aligned} \boldsymbol{P}^T\boldsymbol{A}\boldsymbol{P} &= \boldsymbol{P}^{-1}\boldsymbol{A}\boldsymbol{P} \\ &= \begin{pmatrix} \boldsymbol{p}_1^T \\ \boldsymbol{p}_2^T \\ \boldsymbol{p}_3^T \end{pmatrix}^{-1} \begin{pmatrix} 1 & a+1 & b+1 \\ a+1 & 1 & b \\ b+1 & b & 1 \end{pmatrix} \begin{pmatrix} \boldsymbol{p}_1 & \boldsymbol{p}_2 & \boldsymbol{p}_3 \end{pmatrix} \end{aligned} $$ 由于 $\boldsymbol{P}$ 是正交矩阵,因此有 $\boldsymbol{P}^{-1}=\boldsymbol{P}^T$,代入上式可得: $$ \begin{pmatrix} \boldsymbol{p}_1^T \\ \boldsymbol{p}_2^T \\ \boldsymbol{p}_3^T \end{pmatrix}^T \begin{pmatrix} 1 & a+1 & b+1 \\ a+1 & 1 & b \\ b+1 & b & 1 \end{pmatrix} \begin{pmatrix} \boldsymbol{p}_1 & \boldsymbol{p}_2 & \boldsymbol{p}_3 \end{pmatrix} =\begin{pmatrix} 2 & 0 & 0 \\ 0 & 2 & 0 \\ 0 & 0 & 1 \end{pmatrix} $$ 解方程组可得: $$ \begin{cases} \boldsymbol{p}_1^T\boldsymbol{A}\boldsymbol{p}_1 = 2 \\ \boldsymbol{p}_2^T\boldsymbol{A}\boldsymbol{p}_2 = 2 \\ \boldsymbol{p}_3^T\boldsymbol{A}\boldsymbol{p}_3 = 1 \\ \boldsymbol{p}_1^T\boldsymbol{A}\boldsymbol{p}_2 = 0 \\ \boldsymbol{p}_1^T\boldsymbol{A}\boldsymbol{p}_3 = 0 \\ \boldsymbol{p}_2^T\boldsymbol{A}\boldsymbol{p}_3 = 0 \\ \boldsymbol{p}_1^T\boldsymbol{p}_1 = 1 \\ \boldsymbol{p}_2^T\boldsymbol{p}_2 = 1 \\ \boldsymbol{p}_3^T\boldsymbol{p}_3 = 1 \\ \boldsymbol{p}_1^T\boldsymbol{p}_2 = 0 \\ \boldsymbol{p}_1^T\boldsymbol{p}_3 = 0 \\ \boldsymbol{p}_2^T\boldsymbol{p}_3 = 0 \end{cases} $$ 由于 $\boldsymbol{A}$ 是对称矩阵,因此可以直接使用 Cholesky 分解求解上述方程组。具体来说,将 $\boldsymbol{A}$ 进行 Cholesky 分解,得到下三角矩阵 $\boldsymbol{L}$,使得 $\boldsymbol{A}=\boldsymbol{LL}^T$,然后令 $\boldsymbol{P}=\boldsymbol{L}^{-1}$ 即可。这里不再赘述求解过程,给出结果: $$ \boldsymbol{P}=\begin{pmatrix} \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} & 0 \\ \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} & 0 \\ 0 & 0 & 1 \end{pmatrix} $$ 综上所述,参数 $a=0, b=1$,正交变换矩阵 $\boldsymbol{P}$ 为: $$ \boldsymbol{P}=\begin{pmatrix} \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} & 0 \\ \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} & 0 \\ 0 & 0 & 1 \end{pmatrix} $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值