作者beatitude (python fan)
看板Python
标题Re: [问题] genetic algorithm 函数最大值
时间Mon Jun 2 23:54:08 2014
Hi,
我写了一个比较简单的版本,
给你参考看看, thanks
# genetic algorithm
from numpy import random
import matplotlib.pyplot as plt
# environment
err = 0.5 # error tolerance
ns = 5 # number of survivor
nc = 20 # number of child
gens = 100 # generation
def get_childs(parents):
return [parent + random.randn()*err
for _ in range(nc)
for parent in parents]
def get_survivors(offsprings, f):
return sorted(offsprings, key=f, reverse=True)[:ns]
def ga(f, guess=0, lb=0):
parents = [guess]
history = []
for _ in range(gens):
offsprings = [child for child in get_childs(parents)
if child > lb]
survivors = get_survivors(offsprings, f)
parents = survivors
history.append(max(survivors))
return history
if __name__ == '__main__':
# problem
f = lambda x: -x**2 + 16*x
history = ga(f, guess=1)
plt.plot(history)
plt.show()
※ 引述《sariel0322 (sariel)》之铭言:
: python新手
: 这个是我要解的数学方程式: f(x) = –x*x + 16x
: 要在区间(0,63)中找出其最大值
: 参考了一个网站的人写的code
: 网站来源:
: http://johnisacoolboy.pixnet.net/blog/post/89324086-%E5%9F%BA%E5%9B%A0%E6%BC%94%E7%AE%97%E6%B3%95in-python
: 想改他原本函数方程式的部分却一直怎麽改都有问题
: 觉得是我个人理解他程式码有问题(虽然他已经有加注解了,但目标程式码那边我怎麽改都错)
: 因此还想请问大家一下应该怎麽改
: 该网站code:
: # -*- coding: utf8 -*-
: '''
: ------------题目--------------
: y=
: sin(1* x1*x2 )
: -sin(2* x3*x4 )
: +sin(3* x5*x6 )
: -sin(4* x7*x8 )
: ..
: ..
: +sin(15*x29*x30)
: 有30个整数,[1,2,3,.....,30]
: 分别指定给 x1,x2,x3......., x30
: 要如何指定,会使得 y --> max
: ------------题目--------------
: '''
: '设定环境变数'
: alive = 5 #每代留下几个最好的基因
: child = 10 #一个基因生下几个孩子
: t = 500 #你要玩弄他几次
: from numpy import *
: from random import *
: from time import time
: t0 = time()
: '目标方程式'
: def fun(F):
: sum = 0
: for i in xrange(15):
: sum += (-1)**i * sin((i+1)*F[(i+1)*2 - 2] * F[(i+1)*2 - 1])
: return sum
: '排序方程式,越大的排前面'
: def sort_by_last(A, B):
: if A[-1]: return 1
: elif A[-1] > B[-1]: return -1
: else: return 0
: '产生第一代的基因'
: S = range(1,31) #第一个基因
: mother = [] #母体储存位置
: for i in xrange(alive*child + alive):
: fir = int(random() * 30)
: sec = int(random() * 30)
: while fir == sec:
: fir = int(random() * 30)
: sec = int(random() * 30)
: tmp = S[fir]
: S[fir] = S[sec]
: S[sec] = tmp
: save = S[:]
: save.append(fun(save))
: mother.append(save)
: '开始玩弄他'
: for i in xrange(t):
: tmp = mother[:]
: tmp.sort(sort_by_last)
: mother = []
: if (i%10) == 0:
: print 'the',i,'th Times ,MAX=',fun(tmp[0])
: for j in xrange(alive):
: mother.append(tmp[j])
: ttt = tmp[j][:]
: for k in xrange(child):
: fir = int(random() * 30)
: sec = int(random() * 30)
: while fir == sec:
: fir = int(random() * 30)
: sec = int(random() * 30)
: kkk = ttt[fir]
: ttt[fir] = ttt[sec]
: ttt[sec] = kkk
: save = ttt[:]
: save[-1] = fun(save)
: mother.append(save)
: mother.sort(sort_by_last)
: print '---------------------------------------'
: print 'Times = ', t
: print 'take', time()-t0, 'sec'
: print 'MAX = ', fun(mother[0])
: print 'ANS:', mother[0]
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.240.210.60
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Python/M.1401724452.A.ED9.html
1F:推 sariel0322:非常感谢你,我会详加去了解你的写法的 06/03 00:05
※ 编辑: beatitude (111.251.144.158), 06/04/2014 20:37:59