Halcom 发表于 2019-3-27 23:45:17

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






大娱乐家 发表于 2020-7-1 10:25:56

PYTHON的可以操作一下,谢谢
页: [1]
查看完整版本: GA遗传算法的函数寻优--Python