GA遗传算法的函数寻优--Python
GA遗传算法的函数寻优--Python:链接:https://pan.baidu.com/s/1EuV2HkC_5oR7G6G-S1bXeA 提取码:cwmo
链接:https://pan.baidu.com/s/1yECy3SICh_8a1QZzmtu5ww 提取码:n4ip
from PIL import Image
from pylab import *
import string
import matplotlib.pyplot as plt
import numpy as np
from numpy import random
import fun
#print random.random()
#
popmax = np.array( )
popmin = np.array( [-1,-1] )
pc = 0.75
pm = 0.05
nVar = 2
maxg = 30
sizepop = 30
#Intial
pop = [ for y in range(sizepop)]
gbest = [ for y in range(sizepop)]
fitness =
fitnessgbest =
zbest =
#init pop
for i in range(sizepop):
pop = fun.code(popmin,popmax);
fitness =fun.funfitness(pop,pop);
gbest = pop
gbest = pop
fitnessgbest = fitness
print(fitness)
fitnesszbest =min(fitness)
index = fun.minIndex(fitness,fitnesszbest)
zbest = pop
zbest = pop
print (zbest)
# plot (range(sizepop),fitness,'r*-')
# plot(fitness,'r*-')
# show
fitness_iter =
# main loop
for i in range(maxg):
# update position
pop = fun.select(sizepop,pop,fitness,popmin,popmax)
pop = fun.cross(sizepop,pc,pop,popmin,popmax)
pop = fun.mut(sizepop,pm,pop,popmin,popmax)
for j in range(sizepop):
fitness = fun.funfitness(pop,pop)
if (fitness < fitnessgbest):
fitnessgbest = fitness
gbest = pop
gbest = pop
if (fitness < fitnesszbest):
fitnesszbest = fitness
zbest = pop;
zbest = pop;
fitness_iter = fitnesszbest
print ("最优解:")
print (zbest)
plt.plot(fitness_iter,'ro-')
plt.show()
相应的fun.py函数如下:包含选择、交叉、变异:
import numpy as np
from numpy import random
import math
def funfitness(x1,x2):
y = (x1-0.5)**2+(x2-0.6)**2;
return y;
def minIndex(fitness, fitnesszbest):
for i in range(len(fitness)):
if(fitness == fitnesszbest):
break;
return i;
def select(sizepop,pop,fitness,popmin,popmax):
#fitness_d =sorted(fitness,reverse=True);
fitness_Index = np.argsort( -np.array( fitness) )
c = np.int32(sizepop/4);
for i in range(c):
pop] = popmin + (popmax-popmin)*random.random();
pop] = popmin + (popmax-popmin)*random.random();
return pop
def mut(sizepop,pm,pop,popmin,popmax):
for i in range(sizepop*2):
if random.random() > pm:
a = 0;
while a == 0:
a = np.int32( random.random()*sizepop );
b=
b = pop
b = pop
if random.random() > 0.5:
pop = pop + (popmax-pop)*random.random();
pop = pop + (popmax-pop)*random.random();
else:
pop = pop + (popmin-pop)*random.random();
pop = pop + (popmin-pop)*random.random();
if pop > popmax or pop < popmin:
pop =b;
if pop > popmax or pop < popmin:
pop =b;
return pop
def cross(sizepop,pc,pop,popmin,popmax):
for j in range(sizepop*2):
if random.random() > pc:
a = np.array( );
while np.min(a.tolist()) == 0:
a = np.int32( random.random()*sizepop );
pop1 =
pop2 =
pop1 = pop]
pop2 = pop]
k = random.random()
pop] = (1-k) * np.array( pop1 ) + k * np.array( pop2 );
pop] = (1-k)*np.array( pop2 ) + k * np.array( pop1 );
if pop] > popmax or pop] < popmin:
pop] =pop1;
if pop] > popmax or pop] < popmin:
pop] =pop2;
return pop
def code(popmin,popmax):
flag = 1
pop =
while flag ==1:
pop = popmin + (popmax-popmin)*random.random();
pop = popmin + (popmax-popmin)*random.random();
flag = test(pop,popmin,popmax)
return pop
def test(pop,popmin,popmax):
if pop < popmin or pop > popmax or pop < popmin or pop > popmax:
flag = 1
else:
flag = 0
return flag
PYTHON的可以操作一下,谢谢
页:
[1]