题目:
用遗传算法求函数f(a,b)=2a x sin(8PI x b) + b x cos(13PI x a)最大值,a:[-3,7],b:[-4:10]
实现步骤:
- 初始化种群
- 计算种群中每个个体的适应值
- 淘汰部分个体(这里是求最大值,f值存在正值,所以淘汰所有负值)
- 轮盘算法对种群进行选择
- 进行交配、变异,交叉点、变异点随机
分析:
为了方便,先将自变量范围调整为[0,10]、[0,14]
有两个变量,种群中每个个体用一个列表表示,两个列表项,每项是一个二进制字符串(分别由a、b转化而来)
种群之间交配时需要确定交叉点,先将个体染色体中的两个二进制字符串拼接,再确定一个随机数作为交叉点
为了程序的数据每一步都比较清晰正确,我在select、crossover、mutation之后分别都进行了一次适应值的重新计算
具体代码:
import math
import random
def sum(list):
total = 0.0
for line in list:
total += line
return total
def rand(a, b):
number = random.uniform(a,b)
return math.floor(number*100)/100
PI = math.pi
def fitness(x1,x2):
return 2*(x1-3)*math.sin(8*PI*x2)+(x2-4)*math.cos(13*PI*x1)
def todecimal(str):
parta = str[0:4]
partb = str[4:]
numerical = int(parta,2)
partb = partb[::-1]
for i in range(len(partb)):
numerical += int(partb[i])*math.pow(0.5,(i+1))
return numerical
def tobinarystring(numerical):
numa = math.floor(numerical)
numb = numerical - numa
bina =