首页 > 编程知识 正文

python算法详解(python粒子群算法包)

时间:2023-05-03 15:10:20 阅读:76459 作者:4654

$n:(5(f1y! G2 T j

% t2 F0 N# p$ x. y! W$ j- o1 o,ppython实现的遗传算法的实例(一) ) ) ) ) ) ) ) ) ) ) ) ) )。

) h # fa # n : p ' AC ' ^ 4g % [ 8i 6至% l # ] $ bs2u ' [ 7b 3360 ] u ]

一、遗传算法介绍

遗传算法通过模拟自然界生物进化的历史来解决问题。 自然中的一个种群经过几代人的自然选择后,剩下的种群一定会适应环境。 把一个问题的所有解都看作一个种群,经历了几次自然选择后,剩下的解中有问题的最优解。 当然,只能说有最佳解的概率很高。 这里,用遗传算法求出一个函数的最大值。 4 ); z: O3 }3 A/b0 a% X/bY

对f(x )=10*sin ) 5x )7*cos ) 4x )、0=x=101和参数x进行编码

假设基因片段的长度为10,则10位二进制位所能表示的范围为0至1023。 基因和自变量的转换公式为x=b2d(individual ) * 10/1023。 构建早期种群pop。 每个个体的基因初始值为[0、1、0、1、0、1、0、1、0、0、1]2,计算目标函数值

根据自变量和基因的变换关系式,求出与每个个体的基因对应的自变量,将自变量代入函数f(x ),求出每个个体的目标函数值。 3、适应度函数

适应度函数是用于评价个体适应环境的能力,是进行自然选择的依据。 本问题的适应度函数使目标函数值中的负值直接为0。 我们求最大值,所以目标函数值为负的个体不适应环境,繁殖后代的能力为0。 适应度函数的作用体现在自然选择上。 4、自然选择

省略自然选择的思想,在操作中使用轮盘赌算法。 其具体步骤:

假设种群中合计计算了5个个体的适应度函数的个体适应度列表为fitvalue=[1、3、0、2、4],totalvalue=10,在圆盘上描绘fitvalue时,值的大小表示圆盘上的面积。 旋转轮盘时,各个模块的面积越大,被选中的概率越高。 的方法。 将fitvalue转换为[ 1,4,4,6,10 ],fitvalue总值=[ 0.1,0.4,0.4,0.6,1.0 ]。 然后生成5个0-1之间的随机数,按照从小到大的顺序对随机数进行排序。 如果是这样,自然选择的结果是种群变得更符合条件。 5、繁殖

个体a、b的基因

a=[ 1,0,0,0,1,1,1,0,0 ]

4杰夫; [8 ]: y

b=[ 0,0,0,1,1,0,1,1,1,1 ]

#0H5CL4U,k8 u

这两个个体发生基因交换的概率是pc=0.6。 发生基因交换时,会产生表示基因交换位置的随机数point,假设point=4,则为:

7 ZX: K2 ~2 Y. v9 d

a=[ 1,0,0,0,0,1,1,1,0,0 ] 3l3z ' q.e/mo6v ' @ : m! LL

b=[ 0,0,0,1,1,0,1,1,1,1 ]

更换后,(RJ3 G3 ~) ) O0 b% T. n; q: _; V/^

a=[ 1,0,0,0,1,0,1,1,1,1 ] 1m! p ) x5d; b- w/_; K

b=[ 0,0,0,1,0,1,1,1,0,0 ] 6,突变

横穿各个个体后,基因的各位发生突变(0为1,1为0 )的概率为0.001。 突变增加了解空间二,代码def b2d(b ) b ) : #,二进制为十进制x[0, 10 ]变换为t=0forjinrange (len ) ) b )的j ) t=t * 10/1023 return tpopsize=50 #种群大小(用遗传算法求函数最大值) #f(x )=10 ) chrom #基因突变的概率results=[ ] bestindividual=[ ] bestfit=0fit value=[ ] tempop=[ ] ] pop=[ 0,1,0,1,0,0

alfitvalue(objvalue); #计算个体的适应值        [bestindividual, bestfit] = best(pop, fitvalue) #选出最好的个体和最好的函数值        results.append([bestfit,b2d(bestindividual)]) #每次繁殖,将最好的结果记录下来        selection(pop, fitvalue) #自然选择,淘汰掉一部分适应性低的个体        crossover(pop, pc) #交叉繁殖        mutation(pop, pc) #基因突变        results.sort()        print(results[-1]) #打印函数最大值和对应的def calfitvalue(objvalue):#转化为适应值,目标函数值越大越好,负值淘汰。    fitvalue = []    temp = 0.0    Cmin = 0;    for i in range(len(objvalue)):        if(objvalue+ Cmin > 0):            temp = Cmin + objvalueelse:            temp = 0.0        fitvalue.append(temp)    return fitvalueimport mathdef decodechrom(pop): #将种群的二进制基因转化为十进制(0,1023)    temp = [];    for i in range(len(pop)):        t = 0;        for j in range(10):            t += pop[j] * (math.pow(2, j))        temp.append(t)    return tempdef calobjvalue(pop): #计算目标函数值    temp1 = [];    objvalue = [];    temp1 = decodechrom(pop)    for i in range(len(temp1)):        x = temp1* 10 / 1023 #(0,1023)转化为 (0,10)        objvalue.append(10 * math.sin(5 * x) + 7 * math.cos(4 * x))    return objvalue #目标函数值objvalue[m] 与个体基因 pop[m] 对应 def best(pop, fitvalue): #找出适应函数值中最大值,和对应的个体        px = len(pop)        bestindividual = []        bestfit = fitvalue[0]        for i in range(1,px):                if(fitvalue> bestfit):                        bestfit = fitvaluebestindividual = popreturn [bestindividual, bestfit]import randomdef sum(fitvalue):    total = 0    for i in range(len(fitvalue)):        total += fitvaluereturn totaldef cumsum(fitvalue):    for i in range(len(fitvalue)):        t = 0;        j = 0;        while(j <= i):            t += fitvalue[j]            j = j + 1        fitvalue= t;def selection(pop, fitvalue): #自然选择(轮盘赌算法)        newfitvalue = []        totalfit = sum(fitvalue)        for i in range(len(fitvalue)):                newfitvalue.append(fitvalue/ totalfit)        cumsum(newfitvalue)        ms = [];        poplen = len(pop)        for i in range(poplen):                ms.append(random.random()) #random float list ms        ms.sort()        fitin = 0        newin = 0        newpop = pop        while newin < poplen:                if(ms[newin] < newfitvalue[fitin]):                        newpop[newin] = pop[fitin]                        newin = newin + 1                else:                        fitin = fitin + 1        pop = newpopimport randomdef crossover(pop, pc): #个体间交叉,实现基因交换    poplen = len(pop)    for i in range(poplen - 1):        if(random.random() < pc):            cpoint = random.randint(0,len(pop[0]))            temp1 = []            temp2 = []            temp1.extend(pop[0 : cpoint])            temp1.extend(pop[i+1][cpoint : len(pop)])            temp2.extend(pop[i+1][0 : cpoint])            temp2.extend(pop[cpoint : len(pop)])            pop= temp1            pop[i+1] = temp2import randomdef mutation(pop, pm): #基因突变    px = len(pop)    py = len(pop[0])        for i in range(px):        if(random.random() < pm):            mpoint = random.randint(0,py-1)            if(pop[mpoint] == 1):                pop[mpoint] = 0            else:                pop[mpoint] = 1

! ]( J9 j7 k( a: v7 K, Q# o- a/ f( Y8 / t* s

' P# c+ |( I" g( Q

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。