编程中的优化算法问题

时间:2024.4.30

研究性学习:编程中的优化算法问题

课题组:高一十一班数学研究性学习小组

研究内容:编程中的优化算法问题

指导老师:张永平

组长:杨帆

组员:沙彦刚 王文琦 高天龙 李妍 任瑞荣 陈文文 王小路

感谢为本论文提供资料的所有网站,专家和学者以及指导老师张永平 申明:(本论文绝不允许有商业用途,仅供交流、学习之用)

——高一十一班数学研究性学习小组 内容:

?

程序是作为算法的一种描述,但是程序通常还需考虑很多与方法和分析无关的细节问题,这是因

为在编写程序时要受到计算机系统运行环境的限制。

通常,程序的编制不可能优于算法的设计。

B.什么是算法优化?

算法优化,优化是一个动词,是对某个算法的具体优化。所有的算法都是有优化的空间的。

比如动态归划算法,有斜率优化,四边形不等式优化,还有图论的算法,如SAP算法,这个可以

用间隙优化,变成ISAP。还有高精度算法,大数相加的,可以有进制优化,常数优化,能不用取

余的就不用取余,能用加法的不用乘法,能用减法的不用除法??

C.算法优化的意义有哪些?

1. 算法优化的过程是学习思维的过程

学习数学实质上就是学习思维。也就是说数学教育的目的不仅仅是要让学生掌握数学知识(包

括计算技能),更重要的要让学生学会数学地思维。算法多样化具有很大的教学价值,学生在探究

算法多样化的过程中,培养了思维的灵活性,发展了学生的创造性。在认识算法多样化的教学价

值的同时,我们也认识到不同算法的思维价值是不相等的。要充分体现算法多样化的教育价值,

教师就应该积极引导学生优化算法,把优化算法的过程看作是又一次发展学生思维、培养学生能

力的机会,把优化算法变成学生又一次主动建构的学习活动。让学生在优化算法的过程中,通过

对各种算法的比较和分析,进行评价,不仅评价其正确性——这样做对吗?而且评价其合理性—

—这样做有道理吗?还要评价其科学性——这样做是最好的吗?这样的优化过程,对学生思维品

质的提高无疑是十分有用的,学生在讨论、交流和反思的择优过程中逐步学会“多中择优,优中

择简”的数学思想方法。教师在引导学生算法优化的过程中,帮助学生梳理思维过程,总结学习方法,养成思维习惯,形成学习能力,长此以往学生的思维品质一定能得到很大的提高。

2. 在算法优化的过程中培养学生算法优化的意识和习惯

意识是行动的向导,有些学生因为思维的惰性而表现出算法单一的状态。明明自己的算法很繁琐,但是却不愿动脑做深入思考,仅仅满足于能算出结果就行。要提高学生的思维水平,我们就应该有意识的激发学生思维和生活的联系,帮助他们去除学生思维的惰性,鼓励他们从多个角度去思考问题,然后择优解决;鼓励他们不能仅仅只关注于自己的算法,还要认真倾听他人的思考、汲取他人的长处;引导他们去感受各种不同方法的之间联系和合理性,引导他们去感受到数学学科本身所特有的简洁性。再算法优化的过程中就是要让学生感受计算方法提炼的过程,体会其中的数学思想方法,更在于让学生思维碰撞,并形成切合学生个人实际的计算方法,从中培养学生的数学意识,使学生能自觉地运用数学思想方法来分析事物,解决问题。这样的过程不仅是对知识技能的一种掌握和巩固,而且可以使学生的思维更开阔、更深刻。

3. 算法优化是学生个体学习、体验感悟、加深理解的过程

算法多样化是每一个学生经过自己独立的思考和探索,各自提出的方法,从而在群体中出现了许多种算法。因此,算法多样化是群体学习能力的表现,是学生集体的一题多解,而不是学生个体的多种算法。而算法的优化是让学生在群体比较的过程中优化,通过交流各自得算法,学生可以互相借鉴,互相吸收,互相补充,在个体感悟的前提下实施优化。因为优化是学生对知识结构的再构建过程,是发自学生内心的行为和自主的活动。但是,在实施算法最优化教学时应给学生留下一定的探索空间,以及一个逐渐感悟的过程。让学生在探索中感悟,在比较中感悟,在选择中感悟。这样,才利于发展学生独立思考能力和创造能力。

4. 优化算法也是学生后继学习的需要

小学数学是整个数学体系的基础,是一个有着严密逻辑关系的子系统。算法教学是小学数学分析,在比较和分析的过程中感受不同策略的特点,领悟不同方法的算理,分析不同方法的优劣,做出合理的评价,从而选择具有普遍意义的、简捷的、并有利于后继学习的最优方法。

5. 优化也是数学学科发展的动力

数学是一门基础学科,是一门工具学科,它的应用十分广泛。数学之所以有如此广泛的应用,就是因为数学总是要求人们不断寻求使问题获得解决的捷径,在众多复杂的问题中,不断寻找最优、最简捷的解决问题的方法;就是因为在每门学科的研究中,应用了数学方法后,其研究过程得到优化,提高了研究的效率和质量。计算是数学的主要内容,算法的优化当然也不例外。所以数学的广泛应用全得益于优化,优化是数学的灵魂。因此,数学的发展过程就是一个不断优化的过程,它的每一个成果都是后人不断优化前人研究成果的结果。优化是数学的精髓,是数学发展不竭的动力,数学就是在不断优化的过程中得到发展的。

D.算法优化

1.选择一个更好的算法:

应该熟悉算法语言,知道各种算法的优缺点,一般很多计算机资料文本上有介绍,应该能够看得懂算法描述.

这里是一些明显可以通用的替换:

慢的算法 替换成

顺序查找 二分法查找或乱序查找

插入排序或冒泡排序 快速排序,合并排序,根(radix)排序

还要选择一种合适的数据结构,比如你在一堆随机存放

的数中使用了大量的插入和删除指令,那使用链表要快得多.如果你要做二

分法查找,那提前排下序非常重要.

2.写一些清晰,可读性好并且简单的代码

一个人容易看得懂的程序同样也容易被编译器读懂.一个大而复杂的表达式往往会把编译器脑袋都弄大,为了防止自己发疯,编译器往往放弃对这段代码的优化.但绝对不会向你报告,出于维护自己面子起见,东楼发现所有的编译器都只会向你报告它优化了多少,而决不会报告它干不了的有多少,东楼就亲眼见到一个瓜编译器因为一个表达式弄昏了头,把整个模块的优化都放弃了,回来居然还恬不知耻的报告优化非常顺利,整个儿一个报喜不报忧.

适当的时候尽量减小每个函数的代码量,不过也别走极端,别为了优化把一个函数写成10页纸的一堆函数,那编译器倒高兴了,可人发疯了.

3.透视你的程序

一个程序写出来,凭直觉就应该感觉出哪些地方快,哪些地方慢,一般说来,最快的运算就是分配一块内存,给指针赋值,还有就是两个整数的加法运算,别的都有点慢,最慢的就要数打开文件啦,打开新的进程啦,读写一大块内存啦,寻找啦,排序啦等等,别看这帮虾子指令都只要几个微秒,可成百上千的杀将过来,东楼可受不了.一定不能让这帮虾子进循环,干了它.

这是经常犯的一个错误:

if (x != 0) x = 0;

程序的原意是当x等于0时,节约时间不执行赋值操作,可你别忘了,赋值语句才是最快的,那还不如直接写成下面的语句更来劲.

x = 0;

,而程序完成的,

4.理解你的编译程序选项

许多编译程序有几级优化选项,注意使用最优化的一项,特别注意gcc,优化选项非常多,小心使用,别弄得适得其反.通常情况下一旦选用最高级优化,编译程序会近乎病态地追求代码优化,精简指令,(如DJGPP的-O3),但少数情况下,这会影响程序的正确性,这是你只有改自己的程序啦.不过也有这种情况,就是一些参数会影响优化的程序,但是不会影响普通程序,这时只有具体情况具体分析了.

5.内联(内嵌)

gcc(使用-finline-functions参数),还有一些别的编译器可以在最高级优化中内联一些小的函数.K&C编译器则只有在库函数是用汇编写成的时候才内联,C++编译器普遍支持内联函数.不过把C函数写成宏也能达到加速的作用,不过必须是在程序完全除错之后,因为绝大多数除错程序不支持宏除错.

宏内联的例子:

旧代码:

int foo(a, b)

{

a = a - b;

b++;

a = a * b;

return a;

}

新代码:

#define foo(a, b) (((a)-(b)) * ((b)+1))

注意最外层括号是必须的,因为当宏在表达式中展开时,你不知道表达式里还有没有比乘法级别更高的运算.

一些警告:

1.无限制地使用宏可以使代码爆炸,程序会很快消耗完你所有的资源,包 括物理内存,最后系统要么崩溃,要么把你的代码放到虚拟内存(磁盘上)中去,那你再怎么优化也没用了

2.C的宏每次调用都要对参数赋值,如果参数很多很复杂,那光赋值就要消耗大量的CPU时间,效果还不如不用宏

3.因为宏允许包含很复杂的表达式,所以编译程序会非常辛苦,为了使自己不至于完全发疯,一般编译程序对宏能包含的字符数都有一个限制,注意别犯规.

4.一旦用了宏,prof程序也跟着糊涂起来了,这是它说的话可信度可不高

6.循环展开

这是经典的速度优化,但许多编译程序(如gcc -funroll-loops)能自动完成这个事,所以现在你自己来优化这个显得效果不明显.(这里说一句,云风工作室的云风朋友曾来信和东楼专门探讨过这个问题,他根据自己在DJGPP的经验认定循环展开无效,东楼猜测可能就是因为gcc在编译时自动进行了展开,所以手工展开已经没多大效果了.但这个方法总是对的).

旧代码:

}

新代码:

for (i = 0; i < 100; )

{

do_stuff(i); i++;

do_stuff(i); i++;

do_stuff(i); i++;

do_stuff(i); i++;

do_stuff(i); i++;

do_stuff(i); i++;

do_stuff(i); i++;

do_stuff(i); i++;

do_stuff(i); i++;

do_stuff(i); i++;

}

可以看出,新代码里比较指令由100次降低为10次,循环时间节约了90%.

不过注意:对于中间变量或结果被更改的循环,编译程序往往拒绝展开,(怕担责任呗),这时候就需要你自己来做展开工作了.

还有一点请注意,在有内部指令cache的CPU上(如MMX芯片),因为循环展开的代码很大,往往cache溢出,这时展开的代码会频繁地在CPU 的cache和内存之间调来调去,又因为cache速度很高,所以此时循环展开反而会变慢.还有就是循环展开会影响矢量运算优化.

7.循环嵌套

把相关循环放到一个循环里,也会加快速度.

旧代码:

for (i = 0; i < MAX; i++) /* initialize 2d array to 0's */

for (j = 0; j < MAX; j++)

a[i][j] = 0.0;

for (i = 0; i < MAX; i++) /* put 1's along the diagonal */

a[i][i] = 1.0;

新代码:

for (i = 0; i < MAX; i++) /* initialize 2d array to 0's */

{

for (j = 0; j < MAX; j++)

a[i][j] = 0.0;

a[i][i] = 1.0; /* put 1's along the diagonal */

}

8.循环转置

为0

:

for (i = 1; i <= MAX; i++)

{

...

}

新代码:

i = MAX+1;

while (--i)

{

...

}

不过千万注意,如果指针操作使用了i值,这种方法可能引起指针索引超界的严重错误(i = MAX+1;).当然你可以通过对i做加减运算来纠正,但是这样加速的作用就没有了除非类似于以下情况

旧代码:

char a[MAX+5];

for (i = 1; i <= MAX; i++)

{

*(a+i+5)=0;

}

新代码:

i = MAX+1;

while (--i)

{

*(a+i+4)=0;

}

9.减小运算强度

采用运算量更小的表达式替换原来的表达式,下面是一个经典例子:

旧代码:

x = w % 8;

y = pow(x, 2.0);

z = y * 33;

for (i = 0; i < MAX; i++)

{

h = 14 * i;

printf("%d", h);

}

新代码:

x = w & 7; /* 位操作比求余运算快 */

{

h += 14; /* 加法比乘法快 */

printf("%d", h);

}

10.循环不变计算

对于一些不需要循环变量参加运算的计算任务可以把它们放到循环外面,现在许多编译器还是能自己干这件事,不过对于中间使用了变量的算式它们就不敢动了,所以很多情况下你还得自己干.那位大哥说了,不就是把没必要的表达式拿出来嘛,这话咱可得商量商量,这里的计算任务可不是仅仅表达式那么简单,什么调用函数啦,指针运算啦,数组访问啦,总之,凡是你相让计算机干的事都算计算任务.对于那些在循环中调用的函数,也不能让它们轻松了,把它扒光了看看,凡是没必要执行多次的操作通通提出来,放到一个init函数里,循环前调用.另外尽量减少喂食次数,没必要的话尽量不给它传参,需要循环变量的话让它自己建立一个静态循环变量自己累加,速度会快一点.

还有就是结构体访问,东楼的经验,凡是在循环里对一个结构体的两个以上的元素执行了访问,就有必要建立中间变量了(结构这样,那C++的对象呢?想想看),看下面的例子:

旧代码:

total =

a->b->c[4]->aardvark +

a->b->c[4]->baboon +

a->b->c[4]->cheetah +

a->b->c[4]->dog;

新代码:

struct animals * temp = a->b->c[4];

total =

temp->aardvark +

temp->baboon +

temp->cheetah +

temp->dog;

一些老的C语言编译器不做聚合优化,而符合ANSI规范的新的编译器可以自动完成这个优化,看例子:

float a, b, c, d, f, g;

...

a = b / c * d;

f = b * g / c;

这种写法当然要得,但是没有优化

float a, b, c, d, f, g;

...

如果这么写的话,一个符合ANSI规范的新的编译器可以只计算b/c一次,然后将结果代入第二个式子,节约了一次除法运算.

高一十一班数学研究性学习小组

20xx年6月3日


第二篇:基于MATLAB的粒子群优化算法程序设计


第20卷第4期20xx年12月 柳 州 师 专 学 报

JournalofLiuzhouTeachersCollegeVo.l20No.4Dec.2005

基于MATLAB的粒子群优化算法程序设计

吴建生,秦发金

(柳州师范高等专科学校数学与计算机科学系,广西柳州545004)

摘 要:阐述了粒子群算法的基本原理,探讨了在MATLAB环境中实现粒子群算法的编程方法,构建粒子群算法工具箱函数,通过仿真示例验证了该方法的有效性,表明它能够对函数进行全局优化。

关键词:粒子群;优化算法;MATLAB;程序设计

中图分类号:TP301.6 文献标识码:A 文章编号:1003-7020(2005)04-0097-04

1引言

群体智能算法(SwarmIntelligenceAlgorithm,SIA)的研究开始于20世纪90年代,其基本思想是模拟自然界生物的群体行为来构造随机优化算法[1,2,3],通常单个自然界的生物并不是智能的,但是整个生物群体却表现出处理复杂问题的能力,群体

智能算法就是模仿这些生物的团体行为并把它应用在人工智能问题中,其中粒子群优化算法(ParticleSwarmOptimization,PSO)就是群体智能算法的一种,它是由美国社会心理学家JamesKennedy和电气工程师RussellEberhart在19xx年提出的,其基本思想是对鸟群、鱼群的觅食过程中的迁徙和聚集的行为模拟,并利用了生物学家FrankHeppner的生物群体模型[4,5,6]。PSO算法是一类基于群体智能的随机优化技术,相对遗传算法而言,二者都是基于群体的迭代搜索,但是PSO算法没有交叉、变异算子,粒子群优化算法是通过个体之间的协作来搜寻最优解,它利用了生物群体中信息共享的思想,其概念简单、易于实现,同时又有深刻的智能背景,既适合科学研究,又特别适合工程应用。因此,PSO一提出,就引起了众多学者的关注,并在短短几年的时间里出现了大量的研究成果[7,8]。2PSO基本原理

PSO算法是基于群体智能理论的优化算法,群体中的粒子在每次迭代搜索的过程中,通过跟踪群体2个极值:粒子本身所找到的最优解Pbest和群体找到的最优解Gbest来动态调整自己位置和速度[5,6],完成对问题寻优,对于如下的函数优化问题

maxf(x1,x2,,,xn)

s.tR1j[xj[R2j,j=1,2,,,n

其计算步骤如下[1]:

(1)对粒子群中粒子的位置和速度进行随机初始化。设定群体的规模为N,则随机生成如下矩阵

x11x21,xN1

x12x22,xN2

,,,,

x1nx2n,xNn

v11v21,vN1

v12v22,vN2

,,,,

v1nv2n,vN,

(2)(1)

其中{xij,i=1,2,,,N,j=1,2,,,n}表示群体中i粒子的位置为j,vij是对应它的速度,二者均为区间[R1j,R2j]上均匀分布的

随机数。

(2)计算每个粒子的适应度(目标函数值)。

(3)计算粒子所经历的最好位置pbesti(t)=(xi1,xi2,,,xim,也就是粒子所经历过的具有最好适应度的位置,由下式确定

pbesti(t) f(x1(t+1),x2(t+1),,,xn(t+1))<pbesti(t)),

pbesti(t+1)=(3)

xi(t+1) f(x1(t+1),x2(t+1),,,xn(t+1))\pbesti(t)).计算群体中所有粒子经历过最好位置,即全局最好位置

Gbesti(t)=f(Pbest1(t)),f(Pbest2(t)),,,f(PbestN(t)),

(4)依据下式对粒子的速度和位置进行进化

vij(t+1)=vij+c1r1(Pbesti(t)-xij(t))+c2r2(Gbesti(t)-xij(t)),

(4)(5)

收稿日期:2005-09-02

作者简介:吴建生(1974)),陕西咸阳人,硕士,讲师,研究方向:神经网络应用及智能优化算法;秦发金(1967)),男,广西临桂人,副教授。 基金项目:广西教育科学/十五0规划课题

第20卷第4期柳 州 师 专 学 报

x1j(t+1)=xij(t)+vij(t+1),20xx年12月(6)

其中c1,2为加速度常数(学习速率),r1,2为[0,1]均匀分布的随机数。

(5)判断结束条件,目标函数的适应度达到足够好或者进化到预先设定的代数,否则返回步骤(2),继续进行。3用MATLAB实现粒子群算法

MATLAB是MathWorks公司的产品,是一个功能强大的科学与工程计算软件,集成了计算、可视化和程序编制等功能,其使用直观、简洁并符合人们思维习惯的代码给用户提供了一个友好的开发环境[9,10],利用MATLAB矩阵运算的强大功能编写粒子群算法程序有很好的优势。

3.1粒子群的初始化

initpop函数的功能是实现群体的初始化,popsize表示群体的大小,dimsize表示粒子维数,它由变量的维数决定,xmin是变量的下限,xmax是变量的上限。

functionpop=initpop(popsize,dimsize)

pop=unifrnd(xmin,xmax,popsize,2*dimSize);

3.2计算粒子的适应度和确定群体的Pbest和Gbest

Calobjvalue函数的功能是计算目标函数的适应度,其公式是采用本文的示例仿真,用户可以根据不同的优化问题予以修改。

functionobjvalue=calobjvalue(pop)

fori=1:popsize

obfuct1=sin(sqrt(pop(,i1)^2+pop(,i2)^2))^2-0.5;

obfuct2=(1.0+0.001*(sqrt(x(,i1)^2+x(,i2)^2))^2);

objvalue(,i1)=0.5+obfuct1/obfuct2;

end

Pbest=pop(:,1:dimsize);

[ggBest,xindex]=max(objvalue);

xtemp=pop(xindex,1:dimsize);

Gbest=xtemp;

3.3粒子速度和位置的更新

粒子速度和位置的更新是基于式(5)与(6),并生成新的粒子群体.

functionpop2=renew(pop)

fort=1:popsize

fordimIndex=1:dimsize

w=wcmax-(wcmax-wcmin)*(generation/maxgeneration);

sub1=Pbest(t,dimIndex)-pop(t,dimIndex);

sub2=Gbest(1,dimIndex)-pop(t,dimIndex);

tempV=w*pop(t,dimszie+dimIndex)+c1*unifrnd(0,1)*sub1+c2*

iftempV>speedmax

pop(t,dimszie+dimIndex)=speedmax;

elseiftempV<(-speedmax)

pop(t,dimsize+dimIndex)=-speedmax;

else

pop(t,dimszie+dimIndex)=tempV;

end

tempposition=pop(t,dimIndex)+pop(t,dimsize+dimIndex);

iftempposition>xmax

pop(t,dimIndex)=xmax;

elseiftempposition<xmin

pop(t,dimIndex)=xmin;

else

pop(t,dimIndex)=tempposition;

end

end

end

3.4粒子Pbest和Gbest的更新unifrnd(0,1)*sub2;

吴建生,秦发金:基于MATLAB的粒子群优化算法程序设计

粒子在进化过程中依据其适应度,调节个体最好位置Pbest和群体最好位置Gbest

function[Pbest,Gbest]=regulate(pop)

fori=1:popsize

obfuct1=sin(sqrt(x(,i1)^2+x(,i2)^2))^2-0.5;

obfuct2=(1.0+0.001*(sqrt(x(,i1)^2+x(,i2)^2))^2);

objvalue(,i1)=0.5+obfuct1/obfuct2;

obfuct3=sin(sqrt(pBest(,i1)^2+pBest(,i2)^2))^2-0.5;

obfuct4=(1.0+0.001*(sqrt(pBest(,i1)^2+pBest(,i2)^2))^2);

pvaluer(,i1)=0.5+obfuct3/obfuct4;

end

obfuct1=sin(sqrt(gBest(1)^2+gBest(2)^2))^2-0.5;

obfuct2=(1.0+0.001*(sqrt(gBest(1)^2+gBest(2)^2))^2);

objvaluetemp=0.5+obfuct1/obfuct2;

fori=1:popsize

ifobjvaluer(,i1)<pvaluer(,i1)

PBest(,i1:dimszie)=pop(,i1:dimszie);

end

ifobjvaluer(,i1)<objvaluertemp

GBest=pop(,i1:dimszie);

xtemp=pop(i,1:dimsize);

end

end

4示例仿真

利用上述思路在MATLAB中开发PSO工具箱,以J.D.Schaffer提出的函数[11]minf(x1,x2)=0.5+sin2.51+X2-0,22

基于MATLAB的粒子群优化算法程序设计

[1.0+0.001(X1+X2)]2(7)

s.t-100[xi[100(i=1,2)

为示例仿真,按照上述方法编写程序,它的最优解min(f(X*))=f(0,0)=0,此函数在距全局最优点大约3.14范围内存在无穷多个局部极小将其包围,并且该函数强烈振,一般的算法难以得到最优解,利用PSO工具箱计算它,其运行界面如下:

图1 基于MATLAB的PSO算法运行界面

在运行过程中,为了评价算法的性能,采用DeJong提出的在线性能[12](on2lineperformance)和离线性能(off2lineperform2ance)来衡量算法性能的优劣,在环境e下策略s的在线性能Xe(s)定义为:

1Xe(s)=TEf(t),t=1eT(8)

第20卷第4期柳 州 师 专 学 报20xx年12月式中fe(t)是在环境e下第t时刻的平均目标函数值或平均适应度。算法的在线性能指标表示了算法从开始运行一直到现在为止的时间段内算法性能值的平均值,它反映了算法的动态性能。在环境e下策略s的离线性能X*

e(s)定义为:

1X(s)=T*

eTEft=1*e(t),(9)

式中f*

e(t)是在环境e下,在[0,1]时段内最好的目标函数值或最大适应度。算法的离线性能表示了算法运行过程中各进化代的最佳性能的累积平均,它反映了算法的收敛性能。

在示例仿真中我们取种群个数为100,进化代数100,学习因子(加速度常数)2,加权系数上限为0.9和下限为0.1,位置下限为-100,上限100,速度设置与位置相同。图2为本文算法求解J.D.Schaffer函数过程中算法的在线性能和离线性能。算法运行10次,其全部收敛到最优解min(f(X*))=f(0,0)=0,图3是PSO工具箱计算示例仿真函数在进化过中它的适应

基于MATLAB的粒子群优化算法程序设计

度度变化情况。

图2

基于MATLAB的粒子群优化算法程序设计

粒子群进化过程在线和离线性能

5结语图3 粒子进化过程适应度的变化

我们利用MATLAB强大的计算、绘图以及界面设计功能,开发了基于MATLAB的粒子群优化算法工具箱,设计界面友好、操作方便,具有很强的通用性,利用它可以方便地解决一些粒子群算法应用问题,可以很直观地看出各种参数的确定对进化结果有何影响,故对学习和应用粒子群算法可以起到事半功倍的作用。

参考文献:

[1]曾建潮,介婧,崔志华.微粒群算法[M].科学出版社,2004.

[2]E.Bonabeau,M.Dorigo,G.Theraulaz.Inspirationforoptimizationfromsocialinsectbehavior[J].Nature,2000,406(6):39)442.

[3]E.Bonabeau,M.DorigoG.Theraulaz.Swarmintelligence:fromnaturaltoartificialsystems[M].NewYork:OxfordUniv.Press,1999.

[4]J.Kennedy,R.C.Eberhart.Particleswarmoptimization[A].ProceedingIEEEInternationalConferenceonNeuralNetworks[M].1995:1942)1948.

[5]张荣沂.一种新的集群优化方法)))粒子群优化算法[J].黑龙江工程学院学报(自然科学版),2004,18(4):34)37.

[6]杨维,李岐强.粒子群优化算法综述[J].中国工程科学,2004,6(5):87)92.

[7]R.C.E.Scrhart,Y.Sh.iEvolvingArtificialNeuralNetworks[A].ProceedingofInternationalConferenceonNeuralNetworksandBrain[M].Pis2catawayNJIEEEPress,1998:5)13.

[8]李宁,邹彤,孙德宝.带时间窗车辆路径问题的粒子群算法[J].系统工程理论与实践,2004,24(4):131)135.

[9]张志涌.精通MATLAB6.5[M].北京:航空航天大学出版社,2004.

[10]阮沈勇,王永利,桑群芳.MATALAB程序设计[M].北京:电子工业出版社,2004.

[11]王凌.智能优化算法及其应用[M].北京:清华大学出版社,2001.

[12]周明,孙树栋.遗传算法原理及其应用[M].国防工业出版社,2004.

(责任编辑:梁文杰)

ADesignofParticleSwarmOptmiizationwithMATALB

WUJian2sheng,QINFa2jing

(DepartmentofMathematicsandComputerScience,LiuzhouTeachersCollege,Liuzhou,Guangxi545004,China)

Abstract:TheprincipleofparticleswarmoptimizationhasbeenpresentedanditsrealizationwithMATALBhasbeendiscussed,andtheparticleswarmoptimizationtoollibraryfunctionwasmade.Afunctionoptimizationproblemhasbeengiventodemonstratetheglobaloptimizationfunction2abilityoftheMATLABprogram.

Keywords:particleswarmptimization;MATLAB;programming

更多相关推荐:
十大算法总结

数学建模十大经典算法*******************************************************1.蒙特卡罗算法。该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,同…

算法与编程总结报告

算法与编程总结报告姓名陈凡超学号11083136专业信息对抗时间20xx614626目录1统计字母频率代码2指示灯控制代码3数字游戏代码4判断点是否在三角形内代码思路5文件处理通讯录代码思路1统计字母频率代码i...

C程序设计算法总结举例

C程序设计算法总结举例1顺序结构举例该类题目通常输入一些数据再通过使用一个或几个数学公式求解通过赋值表达式得到结果并输出包括求三角形面积相关物体体积求温度解二元一次方程组一元二次方程等11求温度转换华氏摄氏温度...

《程序员编程艺术:面试和算法心得》第二部分算法心得

第四章查找匹配41有序数组的查找题目描述给定一个有序的数组查找某个数是否在数组中请编程实现分析与解法一看到数组本身已经有序我想你可能反应出了要用二分查找毕竟二分查找的适用条件就是有序的那什么是二分查找呢二分查找...

短学期算法与编程实验报告

算法与编程实验报告姓名:学号:班级:专业:指导教师:一统计字母的使用频率1问题详细描述为统计英文字母的使用频率,输入一个不包括空格的由英文字母组成的字符串,长度不超过200个字符。统计26个英文字母的使用频率,…

算法与编程实习报告

算法与编程实习报告第一题统计字母的使用频率一题目统计字母的使用频率目的与要求1目的通过编写程序统计字母的使用频率培养学生综合利用C语言进行程序设计的能力熟悉字符串的操作方法加强函数的运用提高软件系统分析能力和程...

编程算法大全

1求两数的最大公约数functiongcdabintegerintegerbeginifb0thengcdaelsegcdgcdbamodbend2求两数的最小公倍数functionlcmabintegerin...

28个不得不看的经典编程算法

28个不得不看的经典编程算法txt我的优点是我很帅但是我的缺点是我帅的不明显什么是幸福幸福就是猫吃鱼狗吃肉奥特曼打小怪兽令堂可是令尊表姐我是胖人不是粗人28个不得不看的经典编程算法数学软件计算机的进来来源琚敏的...

编程与算法

一intijfori0定序forj0遍历第一个for锁定j变化时当前i的值即定序当前i的值当定序i后j开始从0开始遍历所有符合条件的j的值i0123j0123012301230123遍历结果

Java经典算法编程题目

Java经典算法编程题目,适合面试前进行练习1.定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,然后求出所有元素的最大值,最小值,平均值,和值,并输出出来。classArrayNumber{pu…

28个不得不看的经典编程算法

前十个是来自圣经的十大算法发起人的描述来自圣经的证明收集了数十个简洁而优雅的数学证明迅速赢得了大批数学爱好者的追捧如果还有一本来自圣经的算法哪些算法会列入其中呢第一名Unionfind严格地说并查集是一种数据结...

plc的编程算法

PLC编程算法PLC中无非就是三大量开关量模拟量脉冲量只在搞清楚三者之间的关系你就能熟练的掌握PLC了1开关量也称逻辑量指仅有两个取值0或1ON或OFF它是最常用的控制对它进行控制是PLC的优势也是PLC最基本...

编程算法总结(30篇)