遺傳演算法(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 ...