機器學習基礎(四十六) 遺傳演算法(GA)

2021-07-11 02:42:01 字數 1476 閱讀 8073

遺傳演算法(genetic algorithms)也是受自然科學的啟發。該類演算法的執行過程是先隨機生成一組解,稱之為種群(population)。在優化過程中的每一步,演算法會計算整個種群的成本函式,從而得到乙個有關題解的有序列表

其三個主要特性在於:

在對題解進行排序之後,乙個新的種群——我們稱之為下一代——被建立出來了。首先,我們將當前種群中位於最頂端的題解加入其所在的新種群中。我們稱這一過程為精英選拔(elitism)。新種群的餘下部分是由修改最優解後形成的全新解所組成的。

有兩種修改題解的方法。

演算法設計中可能涉及的引數主要有,

遺傳演算法的程式還是比較好寫的,因為流程非常固定;

def

geneticalgo

(domains, costf, popsize=100,

mutprob=.2, elite=.2, maxiter=100):

defmutable

(c):

i = random.randint(0, len(domains)-1)

if random.random() < 0.5

and c[i] > domains[i][0]:

c[i] -= 1

elif c[i] < domains[i][1]:

c[i] += 1

return c

defcrossover

(r1, r2):

i = random.randint(1, len(domains)-2)

return r1[:i] + r2[i:]

pop =

for i in range(popsize):

r = [random.randint(domains[i][0], domains[i][1]) for i range(len(domains))]

topelite = int(popsize*elite)

for i in range(maxiter):

scores = [(costf(r), r) for r in pop]

scores.sort()

randked = [v for c, v in scores]

pop = ranked[:topelite]

while (len(pop) < popsize):

if random.random() < mutprob:

r = random.randint(0, topelite-1)

else:

c1 = random.randint(0, topelite-1)

c2 = random.randint(0, topelite-1)

print(scores[0][1])

return scores[0][0]

JavaScript學習筆記 四十六 門面

門面是一種簡單的模式 它僅僅是給物件提供可選的介面。它是一種很好實踐,讓你的 簡短且不會處理太多的事情。遵循這個實踐,你最終將獲得比使用帶有很多引數的超級方法 uber methods 更多的方法。有時2個或更多方法可能通常一起被呼叫。在這種情況下,額外建立乙個方法包裹重複的呼叫時有意義的。比如,當...

愛情四十六課,創造對的人

於千萬人之中,遇見你要遇見的人。於千萬年之中,時間無涯的荒野裡,沒有早一步,也沒有遲一步,遇上了也只能輕輕地說一句 你也在這裡嗎?這是張愛玲女士 愛 中,最經典的一句話,被渴愛的人奉為聖經。破除mr right的神話 我們一生中可以遇見很多 對的人 這並不像我們常規認定的 一輩子只有乙個人是正確的另...

四十六 氣泡排序C語言實現

include intmain for i 1 i n 1 i n個數排序需要n 1趟 for i 1 i n i 輸出排序結果 用氣泡排序實現考試名次的排序 include intmain 建立結構體儲存姓名和分數 struct student a 100 t int i,j,n scanf d ...