【挖坟】从粒子群算法开始
mathcad吧
全部回复
仅看楼主
level 13
LNSZDZG 楼主
应剑客和月城之邀,开始这个话题。
事实上,我也不是太懂,可能班门抡斧,只寄希望于抛砖引玉。
2014年06月22日 09点06分 1
level 13
LNSZDZG 楼主
粒子群算法粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。
PSO同遗传算法类似,是一种基于迭代的优化算法。系统初始化为一组随机解,通过迭代搜寻最优值。但是它没有遗传算法用的交叉(crossover)以及变异(mutation),而是粒子在解空间追随最优的粒子进行搜索。同遗传算法比较,PSO的优势在于简单容易实现并且没有许多参数需要调整。目前已广泛应用于函数优化,神经网络训练,模糊系统控制以及其他遗传算法的应用领域。
PSO模拟鸟群的捕食行为。设想这样一个场景:一群鸟在随机搜索食物。在这个区域里只有一块食物。所有的鸟都不知道食物在那里。但是他们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢。最简单有效的就是搜寻目前离食物最近的鸟的周围区域。PSO从这种模型中得到启示并用于解决优化问题。
PSO中,每个优化问题的解都是搜索空间中的一只鸟。我们称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值(fitness value),每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。
PSO 初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个"极值"来更新自己。第一个就是粒子本身所找到的最优解,这个解叫做个体极值pBest。另一个极值是整个种群目前找到的最优解,这个极值是全局极值gBest。另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。
http://baike.baidu.com/view/1660520.htm?fr=aladdin
2014年06月22日 09点06分 2
请教:这句话,最简单有效的就是搜寻目前离食物最近的鸟的周围区域。应该如何理解?是指最近的鸟是最优解,其余的鸟都按照这个方向更新自己吗?
2015年09月23日 12点09分
level 13
LNSZDZG 楼主
嗯,这是百度百科的解释。从数学的角度讲就是:
求n元函数y=f(x1,x2,x3,....xn)

y=g1(x1,x2,x3,....xn)
y=g2(x1,x2,x3,....xn)
......
y=g2(x1,x2,x3,....xn)
条件的约束下的最优解的一个智能算法。
2014年06月22日 09点06分 3
level 12
求n元函数y=f(x1,x2,x3,....xn)

y=g1(x1,x2,x3,....xn)
y=g2(x1,x2,x3,....xn)
......
y=g2(x1,x2,x3,....xn)
条件的约束下的最优解
其中最后一个y应该是gn(x1,x2,x3,....xn)吧?也就是说对这个函数的约束数量要等于这个函数变量数量。是么?
2014年06月22日 10点06分 4
写错了,是y=gm(x1,x2,x3,....xn) 有m个约束条件,当然m可以为0(无约束条件),也可以为n,甚至大于n
2014年06月22日 10点06分
level 12
实话说就是看了百度的那个介绍之后,我才更加一头雾水的。
他说第一步是提供若干的随机值,我想这个随机值的分布应该不是随意的吧?
比如一个极端的情况,如果我要找一个类似于sin(x)的极值,但我的随机数分布在10^100±10^-100。
还有就是这个函数优化,是不是就是指找极值点呢?
2014年06月22日 10点06分 5
level 12
原来没参加也没接触过数学建模比赛,倒是看了一些相关的热闹,貌似数学建模里有很多套路算法的实现问题。
你找找看,能否给出一道应用题,说明这样的情况下,使用这种算法就比较有效。
2014年06月22日 10点06分 6
level 13
LNSZDZG 楼主
PSO的做法是:
1、随机选取满足约束条件的k个点(粒子)X1=(x11,x12,x13,......x1n),X2=(x21,x22,x23,......x2n),......Xk=(xk1,xk2,xk3,......xkn),
2、计算f(X1),f(X2),......f(Xk)取by1=min(f(X1),f(X2),......f(Xk))作为当前最优解;
3、km=1
4、粒子群开始移动到新的位置X'1,X'2,X'3......X'k,计算f(X‘1),f(X’2),......f(X‘k)取by‘1=min(f(X’1),f(X‘2),......f(X’k))作为当前最优解;取gy=min(by1,by‘1)整体最优解;
5、km=km+1
6、直到km到指定值或误差小于指定值
2014年06月22日 10点06分 7
level 12
你的意识是在约束范围内遍地撒网,所有的随机点都是在“待优化函数”上的。
这个看上有两个好处,一个是减少了计算量,一个是当函数不是连续的情况下,也可以得到相应的计算值。
那么第二次产生随机点,也就是你说的“粒子群开始移动到新的位置”,有什么规定么?比如说将这些随机点局限在了第一次的最优点周围的半径r以内,是这样的么?
2014年06月22日 10点06分 8
粒子群开始移动到新的位置分两步走: 第一步:更新粒子速度:Vj,i=w*Vj,i+[c1*rnd(1)*(bx1-Xj,i)]+ [c2*rnd(1)*(gx1-Xj,i)] 第二步:更新位置:Xj,i=Xj,i+beta*Vj,i
2014年06月22日 11点06分
level 12
这个是从“算法吧”来找到的资料下载链接,[无效] http://pan.baidu.com/s/1i3C9VoT
但还是太学术了。
用大白话讲一些基本思路就那么难么?
我记得好几年前,我有一个 同事搞弦论,我当时也挺感兴趣,就从网络上找了一些资料看,结果被里面的乱七八糟的数学公式闹晕了。倒是欧姆社出的那本儿《漫画量子力学》我看明白了,里面说到了弦论,说它本来是很出色的理论,结果现在被各种复杂的数学所代替了,弄得几乎没办法深入研究。后来我问我的那个同事什么是弦论,要他说的直白点儿,他就用筷子夹起了一箸子菠菜,菠菜长长的垂下来慢慢摇晃,他说你看看这个,这就是弦论的基础。我就大概有点儿明白了,然后再看那些写得不咋地的科普,也多少有了点儿心得。
2014年06月22日 11点06分 9
level 13
LNSZDZG 楼主
粒子群开始移动到新的位置分两步走:
第一步:更新粒子速度:Vj,i=w*Vj,i+[c1*rnd(1)*(bx1-Xj,i)]+ [c2*rnd(1)*(gx1-Xj,i)]
这里w是惯性因子,c1,c2是学习因子(c1是个体学习因子,c2是群体学习因子),bx1是个体当前最优位置,gx1是群体当前最优位置,Xj,i是当前位置。
第二步:更新位置:Xj,i=Xj,i+beta*Vj,i (beta速度限制因子。过大则飞行太快,有可能掠过最优位置,过慢则运算过大)
就是说第二次的位置不是随机的,而是与第一次的位置和群体当前最优位置有关系的。
显然,当(bx1-Xj,i)>0表示个体当前最优位置在Xj,i的右侧,粒子就会向右飞;(gx1-Xj,i)同理。
2014年06月22日 11点06分 10
level 12
为什么还要给出移动速度呢?还有,是不是第一次随机分布点的时候,就已经给每个点一个移动速度了?那么第一次分布点的速度方向应该也是随机的了。
还有一个问题,如果如果一个函数在一个区间内振荡剧烈的话,频率非常高,那么我感觉很有可能会发生判断失误的情况。
2014年06月22日 12点06分 11
是的,第一次就给每个点一个随机的速度(大小和方向都是随机的); ”如果如果一个函数在一个区间内振荡剧烈的话,。。。。。 “有这种可能。这个算法是一个随机算法,每次运行的结果都可能不同,但是它每次都能给出一个解(有可能不是全局最优解,但至少是局部最优解)
2014年06月22日 12点06分
level 13
LNSZDZG 楼主
剑客啊,教育把大家教育成这样了,都成了符号和公式的奴隶了,离开符号和公式似乎不会说话了。
简单点就是:
用k个点计算函数值,将最优的一个标记出来,作为当前最好的(也许日后没有更好的,这个就是最好的)
将这k个点移动一下,再计算和标记
直到满足一定的要求停止。
2014年06月22日 12点06分 12
level 13
LNSZDZG 楼主
移动速度有两个好处
1、当前粒子移动时要依赖当前的位置和当前群体最优解的位置,偏离不要太大;
2、当离最优解比较远时移动速度比较快,以增加收敛速度,减少运算;当离最优解近时速度比较慢,搜索比较仔细,容易找到最优解。
2014年06月22日 12点06分 13
写了点读后心得,又被删帖了。奈何?
2014年06月22日 13点06分
回复 月城公寓寓公 :接着发,别怕度娘。
2014年06月22日 14点06分
level 12
我刚才大概翻看了一下“算法吧”的那套“传家宝”,都是讲C语言的,多少有点儿后悔,里面有一个清华大学的计算机系讲稿,11个G!有点儿坑爹。
里面还有一篇讲分形几何的,我想说数学家们(或者说数学工作者们)走过的路真是很有一定之规,按照一定的研究法,才会铺出一条路,才能有路走,可以深入的去发现新世界。
算法一般都是背后有一定的数学基础的,如果要探讨数学基础的事儿,确实没完没了。而且我感觉无益于自己的创造或者说是折腾。我上班儿的这几年的经验是,遇到实际应用了,搬理论东西或者说数学家们的东西都太远了,除非是找到了一个恰好对口的论文,否则真不如了解一个大概思路之后,自己摸索的来得快——有时候从已有的数学成果中连思路都找不到,完全是自己找思路。
一开始用很笨的方法,比如说全值域遍历,让电脑算上个一两个礼拜,累死丫的。或者先出一个概念的,袖珍的,迷你的模型,试试看自己想的这套思路行不行得通。然后再一点点的优化自己的蠢笨的算法,让它精明起来,从中自己也就有了些经验,下次再搞的时候,就不会那么蠢笨了。
MC中有好多现成的数学工具涉及到了很多的数学背景知识,比如说对信号的快速傅里叶分析——我大学时学的是四类数学,老师就教了我们啥叫微积分,然后就没了,线性代数都是我自学的——傅里叶分析我还是看欧姆社的《漫画傅里叶解析》知道的这个是干啥用的了。工程数学面儿更广,如果不知道背景知识的话,看到的确实都是一堆无意义的符号和公式了。可国内这种大白话背景知识的书籍、文献真的是太少太少了。我在工作中遇到的专业知识都是和相应的工程师、设计师喝酒聊天儿的时候,乱喷得到的,倒真的比看书还要管用得多,因为我可以根据他们的思路,用MC建立一套我能够理解的处理过程,不管是否专业,是否有术语,是否中规中矩吧,总之把实际问题解决了就对了。
所以,我才想到希望你大概向我和大家介绍一些你接触过的数学——我感觉你确实对数学问题感兴趣,从你的程序里也能看出来。
我还觉得如果咱们可以先从最简单的应用题入手,形成一个思路,再处理复杂一些的,从而循序渐进的来,或许会建立咱们自己的算法库呢,哈哈,太乐观了是吧。
2014年06月22日 13点06分 14
level 15
认真看了LNSZDZG老师的文章和与朱老师的对话,还是似懂非懂,只能了解大致的路数。所以,插不上话。现在新概念,新算法,不拘一格,千奇百怪,与传统教材讲的东西相比,确有从旧观念中突围的必要。但,从程序结构的眼光来看,似乎仍然少不了:确定初值-步长-循环-满足条件跳出循环-结果,这样的结构。关键是,这种算法,与相类似的算法,在编程时,有什么相同和不同的地方。用经典程序和结构作对照,也许入门要容易一些。静等LNSZDZG老师徐徐道来。有一两个例子能与其它程序相比较,就再好不过了。——门外汉的梦话
2014年06月22日 13点06分 15
level 12
嗯,还有一些数论上的问题,不过我觉得整Project Euler的时候我已经恶补得差不多了哈。用MC搞数论的worksheet很多,所以我就不引了。
2014年06月22日 13点06分 17
level 13
LNSZDZG 楼主
最小树就是
A,B,....H是一些村镇,j,k,l,....v是这些村镇之间的距离。
1、现在要修一条连接所有村镇的公路,使总路程最短。这是最小树问题(可以间接相连)
2、最短回路就是”邮递员问题“:遍历所有点,每个点只经过一次。
2014年06月22日 14点06分 18
TSP问题?:P
2014年06月22日 14点06分
level 12
分形的:fc(x)=x^2+c,中的c是什么意思?你说的z又是什么呢?
2014年06月22日 14点06分 20
level 13
LNSZDZG 楼主
还是剑客的“撒豆子”形象。
PSO对于一元函数的优势并不是太大,但对于多元函数的优势比较明显。
这里以一元函数的最小值为例。
如图,要求函数的最小值。
第一次,撒豆子,A,B,C,D,E,F
计算函数值f(A),f(B),....
发现f(B)在几个值中最小,这是第一次计算,是一个局部最小。
将这一信息传递给其他豆子,于是其他豆子向B移动(注意速度的表达式,越远速度越快,越近越慢——有一点阻尼的意思),出现下图
2014年06月23日 01点06分 23
level 13
LNSZDZG 楼主
再次计算计算函数值f(A),f(B),....
发现f(E)最小,同样将这一信息学共享之后,豆子向E移动
继续
在继续
最后,豆子都集中在山谷附近,移动速度越来越慢——可能都滑落进山谷的底部。
2014年06月23日 01点06分 24
1 2 3 尾页