遺傳算法

利用遺傳算法計(jì)算x10+ex=100的解

照例,import一些必要的庫(kù)

%matplotlib inline 
import numpy as np
import matplotlib.pyplot as plt
import random

不管怎么著,先把圖畫(huà)出來(lái),看一下大概的取值區(qū)間

x=np.linspace(0,2,100)
def y(x):
    return np.abs(x**10+np.exp(x)-100)

plt.plot(x,y(x))
plt.show()

為了方便編碼(其實(shí)是我懶)强胰,決定取值區(qū)間為[0,2]。

下面進(jìn)行編碼妹沙,采用32位的編碼偶洋。也就是將[0,2]分割成2^32個(gè)小區(qū)段。

比如[0,0,0,...,0]是0距糖,[1,0,0,...0]是2^(-31)

sons=np.zeros([100,32])
values=np.zeros([100])
results=np.zeros([100])
sort_index=np.zeros([100])

初始化函數(shù)玄窝,先隨機(jī)生成100個(gè)點(diǎn)。

def init():
    global sons
    for i in range(100):
        for j in range(32):
            sons[i][j]=random.randint(0,1)

計(jì)算函數(shù)悍引,將對(duì)應(yīng)的編碼轉(zhuǎn)換成相應(yīng)的數(shù)值

def cmp(son):
    value=0
    temp=2**(-31)
    for i in son:
        value+=i*temp
        temp*=2
    return value

更新數(shù)值的函數(shù)

def update():
    global sons,values
    for i in range(100):
        values[i]=cmp(sons[i])

遺傳算法的核心函數(shù)恩脂,首先找出最接近解的10個(gè)值,然后利用這十個(gè)值的編碼產(chǎn)生其余九十個(gè)值的編碼趣斤。

具體操作是俩块,隨機(jī)選取前十個(gè)中的兩個(gè),分別將他們的奇數(shù)編碼和偶數(shù)編碼組合生成一個(gè)新的編碼浓领。

為了能夠進(jìn)化玉凯,也就是不局限于起初產(chǎn)生的編碼,加入了突變這一因素联贩。

同時(shí)為了確保函數(shù)的收斂速度漫仆,針對(duì)不同的編碼提供不同的突變。

較接近解的編碼泪幌,不允許出現(xiàn)大突變盲厌,其余允許大突變,防止陷入局部最優(yōu)解祸泪。(在求最大值最小值的時(shí)候)

def gen():
    global values,sort_index,results,sons
    results=np.abs(values**10+np.exp(values)-100)
    sort_index=np.argsort(results)
    for i in range(100):
        if i in sort_index[:10]:
            continue
        else:
            sam=random.sample(list(sort_index[:10]),2)
            sons[i][::2]=sons[sam[0]][::2]
            sons[i][1::2]=sons[sam[1]][1::2]
    for i in range(500):
        index=random.randint(0,99)
        if index in sort_index[0:3]:
            flag=random.randint(0,1)
            sons[index][flag]=1-sons[index][flag]
        elif index in sort_index[3:10]:
            flag=random.randint(0,7)
            sons[index][flag]=1-sons[index][flag]
        else:
            flag=random.randint(0,31)
            sons[index][flag]=1-sons[index][flag]   
    return(results[sort_index[0]],values[sort_index[0]])
    

main函數(shù)

def main():
    init()
    for i in range(1001):
        update()
        a,b=gen()
        if i%250==0:
            print(a,b)
            plt.plot(values,y(values),'.',x,y(x))
            plt.show()
main()
4.53816371162 1.58435669821
0.000244704122139 1.57704925584
0.000244420886716 1.57704925537
0.000244420886716 1.57704925537
2.94243349686e-07 1.57704885304

可以看到吗浩,函數(shù)迅速收斂,最后的誤差已經(jīng)很小了浴滴,只有10^(-7)這個(gè)數(shù)量級(jí)拓萌。

如果想要更精確的結(jié)果可以多迭代幾次岁钓,可以很快地找出在32位精度下的最優(yōu)解升略。

請(qǐng)不要在意那些離散在外面的點(diǎn)微王,那是因?yàn)樵试S大的突變而產(chǎn)生的,在有多個(gè)極值的情況下品嚣,它們的作用就大了炕倘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市翰撑,隨后出現(xiàn)的幾起案子罩旋,更是在濱河造成了極大的恐慌,老刑警劉巖眶诈,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涨醋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡逝撬,警方通過(guò)查閱死者的電腦和手機(jī)浴骂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)宪潮,“玉大人溯警,你說(shuō)我怎么就攤上這事〗葡啵” “怎么了梯轻?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)尽棕。 經(jīng)常有香客問(wèn)我喳挑,道長(zhǎng),這世上最難降的妖魔是什么滔悉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任蟀悦,我火速辦了婚禮,結(jié)果婚禮上氧敢,老公的妹妹穿的比我還像新娘日戈。我一直安慰自己,他們只是感情好孙乖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布浙炼。 她就那樣靜靜地躺著,像睡著了一般唯袄。 火紅的嫁衣襯著肌膚如雪弯屈。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天恋拷,我揣著相機(jī)與錄音资厉,去河邊找鬼。 笑死蔬顾,一個(gè)胖子當(dāng)著我的面吹牛宴偿,可吹牛的內(nèi)容都是我干的湘捎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼窄刘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼窥妇!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起娩践,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤活翩,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后翻伺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體材泄,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年吨岭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脸爱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡未妹,死狀恐怖簿废,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情络它,我是刑警寧澤族檬,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站化戳,受9級(jí)特大地震影響单料,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜点楼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一扫尖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掠廓,春花似錦换怖、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至悦污,卻和暖如春铸屉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背切端。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工彻坛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓昌屉,卻偏偏與公主長(zhǎng)得像钙蒙,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怠益,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 遺傳算法(Genetic Algorithm, GA)是一種進(jìn)化計(jì)算(Evolutionary Computing...
    佩鴻PH閱讀 9,575評(píng)論 0 1
  • 姓名:張藝倫 學(xué)號(hào):17011210282 轉(zhuǎn)載自:https://www.zhihu.com/question...
    DZNGGZGY閱讀 1,297評(píng)論 0 0
  • 遺傳算法簡(jiǎn)單介紹與MATLAB實(shí)現(xiàn)(二) 引入題目一 上一篇文章中我們簡(jiǎn)單的介紹了一了一下遺傳算法,其中提到了多元...
    老梁家的風(fēng)子閱讀 4,104評(píng)論 1 9
  • 厚重如山瘾婿,深沉似海蜻牢,大概沒(méi)有比這兩個(gè)更有分量的詞語(yǔ)來(lái)形容父愛(ài)了吧。 坐落在魯北平原的這個(gè)小村莊此刻依舊多么的安詳偏陪,...
    夢(mèng)淵_聽(tīng)濤閱讀 527評(píng)論 0 1
  • 有時(shí)候抢呆,你是不是會(huì)因?yàn)橐粋€(gè)眼神就愛(ài)上一個(gè)。 有時(shí)候笛谦,你會(huì)不會(huì)因?yàn)橐粋€(gè)小小的動(dòng)作就愛(ài)上一個(gè)人抱虐。 有時(shí)候,你會(huì)不會(huì)因?yàn)?..
    紫海兒閱讀 134評(píng)論 0 1