Re: [問題] genetic algorithm 函數最大值
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://www.ptt.cc/bbs/Python/M.1401724452.A.ED9.html
推
06/03 00:05, , 1F
06/03 00:05, 1F
※ 編輯: beatitude (111.251.144.158), 06/04/2014 20:37:59
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
Python 近期熱門文章
PTT數位生活區 即時熱門文章