蚁群算法解决指数正弦问题.docx
《蚁群算法解决指数正弦问题.docx》由会员分享,可在线阅读,更多相关《蚁群算法解决指数正弦问题.docx(18页珍藏版)》请在冰豆网上搜索。
![蚁群算法解决指数正弦问题.docx](https://file1.bdocx.com/fileroot1/2023-4/28/ebe34cb6-8ae2-4a71-a64b-19b75ed543d3/ebe34cb6-8ae2-4a71-a64b-19b75ed543d31.gif)
蚁群算法解决指数正弦问题
指数正弦组合优化问题
Byhero鹏
摘要:
对指数正弦组合优化问题分别采用了牛顿法及蚁群算法两种方法进行解决。
重点强调智能优化问题在解决一些数学问题上的重要性。
本文阐述蚁群算法的思想,并利用基于网格划分策略的连续域蚁群算法解决所提出的指数正弦组合优化问题。
分析了普通优化方法与智能优化方法之间的区别,并指出了它们之间存在的一些不足。
关键词:
优化,蚁群算法,牛顿法,指数正弦组合
前言
当今时代,科学迅猛发展,寻找解决问题的最优化方法则是科学发展的动力之一。
在人类的发展的历程中,大自然是人类一切思想的源泉,自然界的许多自适应优化现象不断给人以启示,生物的各种行为就使寻多在人类看起来高度复杂的优化问题得到完美的解决。
蚁群算法就是人类模仿蚂蚁觅食而产生的一种仿生优化方法。
生物学家通过对蚂蚁的长期观察研究发现,每只蚂蚁的智能并不高,看起来没有集中的指挥,但它们却能协同工作,依靠群体的力量发挥出超出个体的智能。
于是,人们就对蚂蚁的这种行为,进而形成了蚁群算法。
蚁群算法最初是由意大利学者DorigoM于1991年提出的,如今,蚁群算法的研究已深入到多个应用领域,并由离散域范围内的研究逐步拓展到了连续域范围内的研究。
针对指数正弦组合优化问题中的复杂函数,我们是想要求在连续域中求出其的最小值,并且竟可能的精确,由于蚁群算法最初是用来解决离散域组合优化问题,因此我们需要寻找一种稳定性良好的,能够解决连续域组合优化问题的算法。
基于网格划分策略的连续域蚁群算法正是这样的一种算法,利用网格划分的思想,将变量区域打网格,在网格点上求目标函数的值,逐步比较目标函数的大小,从中选择较小者,以此较小者作为基点,缩小变量区间,重复搜索,直至满足所给精度为止。
网格划分的思想,给了我们解决连续域问题的启示,就是不断地将连续区间划分成尽可能小的离散点,用以回归到离散域组合优化问题的蚁群算法。
1.算法介绍
本文运用牛顿法以及基于网格划分的连续域蚁群算法解决同一指数正弦组合优化问题
1.1牛顿法
牛顿法的具体思想是,把非线性函数f(x)在x0出展开成泰勒级数,即有
取其线性部分,作为非线性函数f(x)=0的近似方程,则有
,解之
,在把f(x)在x处进行泰勒展开,取其线性部分作为方程f(x)的近似解,如此进行下去,得牛顿迭代公式
。
不过需要注意的是,在每次迭代我们需要导数
。
本文是要解决指数正弦组合函数
的最小值问题,所以,利用牛顿法我们只有先函数y的所有极值点,也即利用牛顿迭代法求
在区间[0,8]内的所有解值X[N],并找出使函数值y(X[N])最小的X[k],也即解决了本组合优化问题。
1.2蚁群算法
本文针对指数正弦组合函数,采用基于网格划分策略的连续域蚁群算法,其具体思想为,对于给定的变量区间,在变量区域打网格,空间上的网格点对应于一个状态,蚂蚁在各个空间网格点之间移动,并根据各网格点处目标函数值的不同留下不同的信息量,以此影响下一批蚂蚁的移动方向,循环一段时间后,目标函数小的网格点出的信息量比较大,找出信息量较大的网格节点,并以此节点为基点缩小变量范围,在此点附近进行蚁群移动。
不断重复这一过程,直到满足给定的跳出条件为止。
下面给出本蚁群算法中要用到的一些状态的定义。
(1)第i个网格点处的信息量
;
(2)信息量更新方程:
,其中Q表示信息强度,
为信息挥发系数,用以表示信息素的挥发,f表示此时的目标函数值。
(3)蚂蚁从第转移到第i个网格节点的转移概率
由此,基于网格划分策略的连续域蚁群算法的实现步骤如下:
(1)将变量x分成N等份,即有H=(xhigh-xlow)/N;
(2)若H(3)循环次数Nc=0;给
赋相同的值1,设置Q、
、NcMax的初始值;
(4)设置蚂蚁数为M,对每只蚂蚁按
选择下一节点;
(5)蚂蚁移动后,按
修改信息量,并Nc=Nc+1;
(6)若Nc最大的元素,并记录此时网格节点的位置i,缩小变量的取值范围,令xhigh=xlow+(i+1)H,xlow=xlow+(i-1)H,跳转至第
(1)步继续执行。
2.程序流程框图
2.1牛顿法程序流程图
3.程序源代码
3.1牛顿法源代码
//本程序尝试用牛顿迭代法寻求最优值
#include
#include
#include
#include
#include//为了使用窗口属性控制函数
#defineN100
usingnamespacestd;
//全局变量声明
doublex[N]={0};//用以存储所有解值
//目标函数f(x)
doubleFunction(doublex)
{
doubleY;
Y=5*exp(-0.5*x)*sin(30*x)+exp(0.2*x)*sin(20*x)+6;
returnY;
}
//目标函数的导函数f'(x)
doubleDFunction(doublex)
{
doubley;
y=-2.5*exp(-0.5*x)*sin(30*x)+150*exp(-0.5*x)*cos(30*x)
+0.2*exp(0.2*x)*sin(20*x)+20*exp(0.2*x)*cos(20*x);
returny;
}
//目标函数f(x)的二次导函数f''(x)
doubleDDFunction(doublex)
{
doubley;
y=-4498.75*exp(-0.5*x)*sin(30*x)-150*exp(-0.5*x)*cos(30*x)
-399.96*exp(0.2*x)*sin(20*x)+8*exp(0.2*x)*cos(20*x);
returny;
}
//牛顿法解函数f(x)=0的近似值
voidNewton()
{
cout<<"**尝试求解使方程y=5*exp(-0.5*x)*sin(30*x)+exp(0.2*x)*sin(20*x)+6有最小解的解值**"<doublex0,x1,eps,d;
eps=10;
staticintk=1;
cout<<"请输入精度==>";
cin>>eps;
x0=0.0;
//循环寻找区间内的解值点
while(x0<8)
{
doublexx;
//将区间上限存入数组
x[0]=0;
x1=x0-DFunction(x0)/DDFunction(x0);
d=fabs(x1-x0);
xx=x0;//保存初始X0值
//利用牛顿迭代法解x0处的值
while(d>eps)
{
x0=x1;
x1=x0-DFunction(x0)/DDFunction(x0);
d=fabs(x1-x0);
}
//将解值存入数值x[N]
if(x1>0)
{
x[k]=x1;
k++;
}
x0=xx+0.1;
}
//将区间上限存入数组
x[k+1]=8;
}
//主函数
voidmain()
{
HANDLEhCon;
hCon=GetStdHandle(STD_OUTPUT_HANDLE);
//控制台窗口信息
CONSOLE_SCREEN_BUFFER_INFOInfo;
//获取控制台信息
GetConsoleScreenBufferInfo(hCon,&Info);
doubleMin=100;
intK=0;
//调用函数Newton
Newton();
//找出区间端点及所有极值点处的最小值
for(intk=0;k{
if(Function(x[k]){
Min=Function(x[k]);
K=k;
}
}
//控制输出台信息
SetConsoleTextAttribute(hCon,13);
cout<<"目标函数最优解值x为:
"<cout<<"则最优目标值为:
"<//恢复窗口原来属性
SetConsoleTextAttribute(hCon,Info.wAttributes);
}
2.2蚁群算法源代码
/*本程序利用蚁群算法的思想,解决无约束非线性最优化问题*/
#include
#include
#include
#include
#include
#include
#defineN30//划分等份
#defineM18//蚂蚁数量
usingnamespacestd;
//全局变量声明
doubleQ;//信息强度
doubleeps,rou;//rou为信息素挥发系数
intNc,NcMax;//循环次数
doubletao[N];//tao表示信息量,P表示状态转移概率
doubleJJ[M][N];//JJ为禁忌表,用来记录蚂蚁当前走过的节点
doublexlow,xhigh;//存储变量的上下限
intRoute[M][N];//记录蚂蚁所走过的节点
doubleX;
//函数声明
voidInitData();//初始化数据
doubleFunction(doublex);//非线性方程
voidAntSolution();//蚁群算法实现
//主函数
voidmain()
{
cout<<"尝试求解使方程y=5*exp(-0.5*x)*sin(30*x)+exp(0.2*x)*sin(20*x)+6有最小解的解值x\n"<stringanswer;
do
{
AntSolution();
cout<<"还要进行测试吗yes/no?
==>";
getline(cin,answer);
}while(answer=="yes");
}
//初始化数据
voidInitData()
{
cout<<"请设置信息强度Q,循环次数NcMax,精度eps及信息素挥发系数rou的初始值,输入顺序为Q,NcMax,eps,rou==>";
cin>>Q>>NcMax>>eps>>rou;
cin.ignore();
}
//非线性方程
doubleFunction(doublex)
{
doubleY;
Y=5*exp(-0.5*x)*sin(30*x)+exp(0.2*x)*sin(20*x)+6;
returnY;
}
//蚁群算法实现
voidAntSolution()
{
//估计各变量取值范围
cout<<"**输入变量的取值范围**\n"<doublelow,high;
cout<<"变量的上下限==>";
cin>>low>>high;
xlow=low;
xhigh=high;
HANDLEhCon;//句柄
hCon=GetStdHandle(STD_OUTPUT_HANDLE);
//控制台窗口信息
CONSOLE_SCREEN_BUFFER_INFOInfo;
//获取控制台信息
GetConsoleScreenBufferInfo(hCon,&Info);
//将变量N等份
doubleH;
H=(xhigh-xlow)/N;
InitData();
//cout<//cout<while(fabs(H)>eps)
{
//初始化信息量
for(inti=0;itao[i]=1;
//初始化蚂蚁的位置
for(intk=0;k{
for(i=0;iRoute[k][i]=-1;
srand(time(NULL));//获得随机时间种子
}
for(k=0;k{
Route[k][0]=k%N;
JJ[k][Route[k][0]]=1;//每只蚂蚁随机分布在各个节点
}
//对每只蚂蚁按状态转移概率选择下一结点
do
{
ints=1;
doubleP;
doubleprand=0.05;//随机概率
while(s{
for(intk=0;k{
intp1rand=rand()%3000;
prand=double(p1rand)/3001;//利用时间种子获取随机概率
//cout<P=0;
doublesum=0;
//计算所有节点上的信息量总和
for(inti=0;i{
sum+=tao[i];
}
//cout<//计算概率,以确定蚂蚁将走的下一结点
for(i=0;i{
if(JJ[k][i]==0)//蚂蚁走过的节点不重复计算
P+=tao[i]/sum;
if(P>prand)
{
//cout<
break;
}
}
JJ[k][i]=1;//对已走过的节点做标记
Route[k][s]=i;//记录蚂蚁第s步走过的节点
//cout<
}
s++;
}
//寻找最优寻优路线
doubleMin1=10;
intK;
//用以确定哪只蚂蚁所走路线最优,并记录该蚂蚁所走路线用以更新信息素
for(intk=0;k{
doublesum1;
for(inti=0;i{
sum1+=Function(xlow+Route[k][s]*H);
}
if(sum1{
Min1=sum1;
K=k;
}
}
//更新信息素量
for(inti=0;itao[i]=(1-rou)*tao[i];
for(i=0;i{
tao[Route[K][i]]+=Q/Function(low+H*Route[K][i]);
}
Nc++;
}while(Nc//找出信息量最大的节点
intI=0;
doubleMax=0;
for(i=0;i{
if(tao[i]>Max)
{
Max=tao[i];
I=i;
//cout<
}
}
//缩小变量区间范围
xhigh=xlow+(I+1)*H;
xlow=xlow+(I-1)*H;
H=(xhigh-xlow)/N;
//cout<}
//当区间范围足够小时进行输出
X=(xhigh+xlow)/2;
//控制输出信息的颜色
SetConsoleTextAttribute(hCon,10);
cout<<"最优解值x是==>"<cout<//恢复原来窗口属性
SetConsoleTextAttribute(hCon,Info.wAttributes);
}
4.运行界面
程序的运行界面如图4.1及4.2所示,其中4.1是牛顿法的结果,4.2是蚁群算法的结果。
图4.1
图4.2
5.计算结果
由4中运行界面得知,经牛顿法得出的函数
的最小值是y(0.72542)=1.25731,而采用蚁群算法思想解出的结果为y(0.144751)=1.91487。
经由matlab绘出目标函数的曲线图如图5.1所示。
图5.1
如上图所示,容易看出目标函数的最小值小于2。
且经计算,目标函数的最小精确值为1.44085。
与我们所得结果相比较,牛顿算法及蚁群算法得出的结果非常接近目标精确值,因此,两算法是有效的。
6结束语
本文完成了用牛顿法与蚁群算法解决指数正弦组合优化问题,由图5.1所知,目标函数在给定区间[0,8]中具有多个局部极小值点,因此在连续域优化问题中非常具有代表性。
正是因为如此,我选择它来作为蚁群算法解决连续域问题的一个例子。
虽然在此组合问题中,目标函数只是一个一元函数,在利用蚁群算法及牛顿法之间并不能看出蚁群算法的明显优势,但需要强调的是,蚁群算法之所以被科学界所认可,其较强的鲁棒性及优良的分布式计算机制是其渗透到各个领域的关键。
我在这里只是通过一个比较简单的例子来了解蚁群算法的基本思想,并借此来掌握这一优良的智能算法,为以后的专业研究拓宽道路。
通过对基本优化方法牛顿法以及智能优化方法基于网格划分策略的连续域蚁群算法的应用实践,在了解并掌握了优化问题中将用到的一些思想方法的同时,我对最优化方法在科学研究及生活中的重要作用有了更深层次的认识。
并且,“最优”一词也让督促着我不断完善自身,努力寻求解决专业领域问题的最优方法,不断开拓创新,永远不应满足于现状。
短短34学时的《最优化方法》课程,却让我收获良多,这全得益于张火明教授孜孜不倦的教导及辛勤付出,在此,对张火明教授致以崇高的敬意和衷心的感谢!
参考文献
[1]段海滨.蚁群算法原理及其应用[M].科学出版社,2005:
p24-37,p175-187.
[2]
[3]王菁,刘三阳,李祖猛.基于改进蚁群算法的QoS单播路由优化[J].系统仿真学报,2009.10.
[4]何汉林,梅家斌.数值分析[M].科学出版社,2007.
[5]