今天实现了《一类求解方程全部根的改进差分进化算法》(by 宁桂英,周永权),虽然最后的实现结果并没有文中分析的那么好,但是本文依然是给了一个求解多项式全部实根的基本思路。思路是对的,利用了代数原理。

求解全部根的理论还是很有必要说一下的。就是利用了多项式综合除法,在matlab中可以采用deconv(A,B)直接实现。同时为了确定多项式方程根的范围,还采用了代数方程根的分布理论,个人觉得这两点是值得借鉴的一种方法。

% 首先定义常量,包括最大迭代次数、搜索范围、个体维度、缩放因子等。程序如下
function DE
close all
clc
maxIteration=1000;%最大迭代次数
Generation=0;%进化代数,或者当前迭代代数
Xmax=30;%搜索上界,可以根据需要改为向量形式
Xmin=-30;%搜索下界
Dim=30;%个体维数
NP=50;%population size,种群规模
F=0.5;%scaling factor 缩放因子
CR=0.3;%crossover rate 交叉概率
FunIndex=4;%测试方程索引
mutationStrategy=1;%变异策略
crossStrategy=1;%交叉策略
% 步骤1:对应算法中Step 1,即初始化
X=(Xmax-Xmin)*rand(NP,Dim)+Xmin;%X:行代表个体i,列代表i的维度j
% 步骤2:对应算法中Step 2:
%step2 mutation,crossover,selection
while Generation<maxIteration
%求bestX
for i=1:NP
fitnessX(i)=testFun(X(i,:),FunIndex);%fitnessX表示X的适应值
end
[fitnessbestX,indexbestX]=min(fitnessX);%fitnessbestX最优适应值
bestX=X(indexbestX,:);%bestX表示最优值对应的位置
%%
%step2.1 mutation
%mutationStrategy=1:DE/rand/1,
%mutationStrategy=2:DE/best/1,
%mutationStrategy=3:DE/rand-to-best/1,
%mutationStrategy=4:DE/best/2,
%mutationStrategy=5:DE/rand/2,
%产生为每一个个体Xi,G 产生一个变异向量Vi,G。 G代表进化代数
V=mutation(X,bestX,F,mutationStrategy);
%%
%step2.2 crossover
%crossStrategy=1:binomial crossover
%crossStrategy=2:Exponential crossover
%产生为每一个个体Xi,G 产生一个交叉向量Ui,G。 G代表进化代数
U=crossover(X,V,CR,crossStrategy);
%%
%step2.3 selection
for i=1:NP
fitnessU(i)=testFun(U(i,:),FunIndex);
if fitnessU(i)<=fitnessX(i)
X(i,:)=U(i,:);
fitnessX(i)=fitnessU(i);
if fitnessU(i)<fitnessbestX
bestX=U(i,:);
fitnessbestX=fitnessU(i);
end
end
end
%%
Generation=Generation+1;
bestfitnessG(Generation)=fitnessbestX;
end
% 步骤3:显示结果
%画图
%plot(bestfitnessG);
optValue=num2str(fitnessbestX);
Location=num2str(bestX);
disp(strcat('the optimal value','=',optValue));
disp(strcat('the best location','=',Location));
end
%变异向量用函数mutation(X,bestX,F,mutationStrategy)
function V=mutation(X,bestX,F,mutationStrategy)
NP=length(X);
for i=1:NP
%在[1 NP]中产生nrandI个互不相等的随机数,且与i皆不相等
nrandI=5;
r=randi([1,NP],1,nrandI);%产生一个1*nrandI的伪随机标准分布,范围是1:NP
for j=1:nrandI %保证随机数互不相等。如果出现随机数相等的情况,则sum(equlr)>nrandi;
equalr(j)=sum(r==r(j));
end
equali=sum(r==i); %保证产生的随机数与i不相等,如果相等的话,则equali>0;则两者合并在一起可得,当且仅当sum(equalr)+equali=nradi时,产生的随机数是符合条件;任一条件不满足,则sum(equalr)+equali》nrandi
equalval=sum(equalr)+equali;
while(equalval>nrandI)
r=randi([1,NP],1,nrandI);
for j=1:nrandI
equalr(j)=sum(r==r(j));
end
equali=sum(r==i);
equalval=sum(equalr)+equali;
end switch mutationStrategy
case 1
%mutationStrategy=1:DE/rand/1;
V(i,:)=X(r(1),:)+F*(X(r(2),:)-X(r(3),:));
case 2
%mutationStrategy=2:DE/best/1;
V(i,:)=bestX+F*(X(r(1),:)-X(r(2),:));
case 3
%mutationStrategy=3:DE/rand-to-best/1;
V(i,:)=X(i,:)+F*(bestX-X(i,:))+F*(X(r(1),:)-X(r(2),:));
case 4
%mutationStrategy=4:DE/best/2;
V(i,:)=bestX+F*(X(r(1),:)-X(r(2),:))+F*(X(r(3),:)-X(r(4),:));
case 5
%mutationStrategy=5:DE/rand/2;
V(i,:)=X(r(1),:)+F*(X(r(2),:)-X(r(3),:))+F*(X(r(4),:)-X(r(5),:));
otherwise
error('没有所指定的变异策略,请重新设定mutationStrategy的值');
end
end
end %交叉函数,根据算法中提供的两种交叉方法编写,即binomial crossover和 %二项式交叉和指数交叉
%Exponential crossover
function U=crossover(X,V,CR,crossStrategy)
%V为产生的变异向量
[NP,Dim]=size(X);
switch crossStrategy
%crossStrategy=1:binomial crossover
case 1
for i=1:NP
jRand=floor(rand*Dim);%由于jRand要在[0,1)*Dim中取值,故而用floor
for j=1:Dim
if rand<CR||j==jRand
U(i,j)=V(i,j);
else
U(i,j)=X(i,j);
end
end
end
%crossStrategy=2:Exponential crossover
case 2
for i=1:NP
j=floor(rand*Dim);%由于j在[0,1)*Dim中取值,故而用floor
L=0;
U=X;
U(i,j)=V(i,j);
j=mod(j+1,D);
L=L+1;
while(rand<CR&&L<Dim)
U(i,j)=V(i,j);
j=mod(j+1,D);
L=L+1;
end
end
otherwise
error('没有所指定的交叉策略,请重新设定crossStrategy的值');
end
end %测试函数,可以根据需要添加相应的程序
function y=testFun(x,index)
%x代表参数,index代表测试的函数的选择
%该测试函数为通用测试函数,可以移植
%目录
% 函数名 位置 最优值
%1.Sphere 0 0
%2.Camel 多个
%3.Rosenbrock
switch index
case 1 %Sphere函数
y=sum(x.^2);
case 2 %Camel函数,Dim只能取2
if length(x)>2
error('x的维度超出了2');
end
xx=x(1);yy=x(2);y=(4-2.1*xx^2+xx^4/3)*xx^2+xx*yy+(-4+4*yy^2)*yy^2;
case 3 %Rosenbrock函数
y=0;
for i=2:length(x)
y=y+100*(x(i)-x(i-1)^2)^2+(x(i-1)-1)^2;
end
case 4
y=sum((x-1).^2);
otherwise
disp('no such function, please choose another');
end
end
% %%该函数用修正的差分进化算法求解多项式的全部根
function DE_to_polynomial
clc
close all
popsize=20;%种群规模
% F=0.5;%缩放因子
CR=0.5;%交叉概率 控制参数是三个 Gnow=1; %种群代数
Gmax=500;
Dim=1;
% Xmax=10;
% Xmin=-10; R=11;
A=[1 0 1 -10 -1 0 -1 10];
len=length(A);
for i=len:-1:1
r(i)=R.^(len-i);
end
A=A.*r; nA=length(A);
JGoal=zeros(nA,1);
XGoal=zeros(nA,1);
beta=0.3; for n=1:nA
% step2: initialize
Gnow=1;
a=2*rand(popsize,Dim)-1;
b=2*rand(popsize,Dim)-1;
X=complex(a,b);
if n>1
B=[1,XGoal(n,1)];
A=deconv(A,B);
end
while Gnow<Gmax
lamda=Gmax/(Gnow+Gmax);
sita=beta*(exp(lamda)-1); %这里采用的自适应变异算子 % step3: choose the well-fitness seeds 即1/2原则
if Gnow==1
Jt1=fitness_sort(X,A);
end % step 4:mutation operation
L=mutation(X(1:popsize/2,:),sita);
%step 5:cross
V=crossover(X,L,CR);
%step6:choose
X=selection(X,V,A);
% 步骤7:终止检验
Jt2=fitness_sort(X,A);
eps=1e-5;
Jbest(Gnow)=Jt2(1);
fitbestX(Gnow)=X(1);
if Jbest(Gnow)<eps
JGoal(n,1)=Jbest(Gnow);
XGoal(n,1)=fitbestX(Gnow);
break;
end JGoal(n,1)=Jbest(Gnow);
XGoal(n,1)=fitbestX(Gnow); Gnow=Gnow+1;
end
end JGoal
XGoal*11 end %% 变异操作 function L=mutation(X,sita)
Xbest=X(1,:);%由于进行排序之后,较小适应度的X排在前面 [NP,Dim]=size(X);
for i=1:NP
%接下来只需要产生si个不相同的r ,并且r与i不相等
numr=4;
r=randi([1,NP],1,numr);%产生一个1*nrandI的伪随机标准分布,范围是1:NP
for j=1:numr
equalr(j)= sum(r==r(j));
end
equali=sum(r==i);
equalvalue=sum(equalr(j))+equali;
while equalvalue>numr
r=randi([1,NP],1,numr);%产生一个1*nrandI的伪随机标准分布,范围是1:NP
for j=1:numr
equalr(j)= sum(r==r(j));
end
equali=sum(r==i);
equalvalue=sum(equalr(j))+equali; end
% 变异策略,将popsize/2个个体生成为popsize个个体
u(i,:)=Xbest+sita*(X(r(1),:)-X(r(2),:));
w(i,:)=(X(r(3),:)-X(r(4),:))/2;
end
k=1:NP;
L(k,:)=u(k,:);
k=NP+1:2*NP;
L(k,:)=w(k-NP,:);
end
%% 交叉操作
function V=crossover(X,L,CR)
[popsize,Dim]=size(X);
for i=1:popsize
jrand=floor(rand*Dim);
for j=1:Dim
if rand<CR ||j==jrand
V(i,j)=L(i,j);
else
V(i,j)=X(i,j);
end
end
end
end %% 选择操作 function T=selection(X,V,A)
[popsize,Dim]=size(X);
for i=1:popsize
Jv=fitness(V(i,:),A);
Jx=fitness(X(i,:),A);
if Jv<Jx
T(i,:)=V(i,:);
else
T(i,:)=X(i,:);
end
end
end % %% 步骤7:终止检验
% function termination(X)
% eps=1e-6;%终止此次求根的精度要求
% if
%
%
%
% end %% 用于测试的多项式方程
function y=testfunc(x,A)
% 测试向量
% A=[1 0 1 -10 -1 0 -1 10];
len=length(A);
for i=len:-1:1
vect(i)=x.^i-1;
end
y=A*vect';
end function y=func(x,A)
R=11;%多项式根的变化范围在R的圆内
% A=[1 4 1 -10 -1 0 -1 10]/R;
% syms x;
len=length(A);
for i=len:-1:1
vect(i)=x.^(len-i);
end
y=A*vect';
end %% 计算各个函数的适应度
function J=fitness(x,A)
y=func(x,A);
J=abs(y);
end %% 计算种群中每个个体的适应度并排序,利用二分之一规则选取个体,其中J 值越小,说明适应度越好
function J=fitness_sort(X,A)
[popsize,Dim]=size(X);
for i=1:popsize
J(i)=fitness(X(i),A);
end
[J,index]=sort(J);
X=X(index);%按照升序排列的X
end

matlab差分算法的更多相关文章

  1. 【matlab】运动目标检测之"背景差分算法“

    clear; clc; i1=imread('D:\Work\1.png'); i2=imread('D:\Work\2.png'); i1=rgb2gray(i1); i2=rgb2gray(i2) ...

  2. bsdiff差分算法

    bsdiff的基本原理 bsdiff是由Conlin Percival开源的一个优秀的差分算法,而且是跨平台的.在Android系统中所使用的imgdiff本质上就是bsdiff. bsdiff的依据 ...

  3. 洛谷 [USACO17OPEN]Bovine Genomics G奶牛基因组(金) ———— 1道骗人的二分+trie树(其实是差分算法)

    题目 :Bovine Genomics G奶牛基因组 传送门: 洛谷P3667 题目描述 Farmer John owns NN cows with spots and NN cows without ...

  4. Codeforces 191C (LCA+树上差分算法)

    题面 传送门 题目大意: 给出一棵树,再给出k条树上的简单路径,求每条边被不同的路径覆盖了多少次 分析 解决这个问题的经典做法是树上差分算法 它的思想是把"区间"修改转化为左右端点 ...

  5. 【蓝桥杯C/C++组】备赛基础篇之差分算法

    一.个人理解 前面学习了前缀和算法,对于访问任意区间的速度是比较快的,但如果我们要修改某个区间的数呢,对于前缀和算法来说这还是有点棘手. 所以我们来学学新的算法:差分算法! 前缀和数组储存的是前n个数 ...

  6. Myers差分算法的理解、实现、可视化

    作者:Oto_G QQ: 421739728 目录 简介 基础 差异的描述 好的差异比较 算法介绍 名词解释 两个定理 绘制编辑图 感谢 简介 本文章对Myers差分算法(Myers Diff Alg ...

  7. 强化学习-时序差分算法(TD)和SARAS法

    1. 前言 我们前面介绍了第一个Model Free的模型蒙特卡洛算法.蒙特卡罗法在估计价值时使用了完整序列的长期回报.而且蒙特卡洛法有较大的方差,模型不是很稳定.本节我们介绍时序差分法,时序差分法不 ...

  8. Matlab PCA 算法

    Matlab 自带PCA函数形式为 [mappedX, mapping] = pca(X, no_dims) 自己编写PCA函数的步骤 %第一步:输入样本矩阵%%%%%%%%%%%%%%%%%%%%% ...

  9. Matlab 模拟退火算法模型代码

    function [best_solution,best_fit,iter] = mySa(solution,a,t0,tf,Markov) % 模拟退化算法 % ===== 输入 ======% % ...

随机推荐

  1. Altium designer使用技巧集(1)

    1.如何生成PCB 先得新建个PCB文件(File-New-Pcb):然后保存下,在新建的PCB文件下:Design-Import Changes From PCB_PROJECT1.PRJPCB(D ...

  2. TcpClient

    public class TcpClientSession { protected TcpClient Client { get; set; } /// <summary> /// 远程地 ...

  3. HTML 5 JavaScript初步 编译运行.doc

    编译运行 解释运行 JavaScript:只有一种变量类型,var.数据类型:整型,小数,字符串,布尔型 1.如何把数值型字符串变成数字型: parseInt("字符串")——把字 ...

  4. java入门概念个人理解之访问修饰符

      类.方法.成员变量和局部变量的对应修饰符是否可以使用 修饰符 类 成员访求 构造方法 成员变量 局部变量 abstract(抽象的) √ √ - - - static (静态的) - √ - √ ...

  5. python 多线程爬虫

    最近,一直在做网络爬虫相关的东西. 看了一下开源C++写的larbin爬虫,仔细阅读了里面的设计思想和一些关键技术的实现. 1.larbin的URL去重用的很高效的bloom filter算法: 2. ...

  6. N皇后问题 深搜+剪枝 hdu-2553

    N 皇后问题在此就不多介绍了,相信CS的同学都应经清楚了,不清楚也可自行Google(听说国内用不了Google了?令人发指!).在此以一道例题为引. hdu-2553 1 #include < ...

  7. mysql学习(十二)内置函数

    常用的内置函数,常用select\ 字符串函数 contat('' , '', .....) //连接字符串 select concat(name, ' age is ', age) from per ...

  8. 【学习笔记01】:hover为DIV添加鼠标悬停时改变颜色的效果

    :hover所有主流浏览器都支持(IE6.0以下支持不好,以后再学习用Javascript来实现悬停效果) 这是一个绿色底白色Icon的搜索按钮

  9. Windows 下 Django/python 开发环境配置

    1.安装 Aptana/Eclipse Aptana是在eclipse上二次开发的一个开源的集成开发环境,内置python编译器 http://www.aptana.com/ 2. 安装python ...

  10. service:jmx:rmi:///jndi/rmi

    service:jmx:rmi:///jndi/rmi://ip:9889/jmxrmi http://stackoverflow.com/questions/2768087/explain-jmx- ...