《集體智慧型程式設計》 優化演算法

2021-10-23 04:41:14 字數 4520 閱讀 5863

#隨機搜尋domain是序列,costf是定義的成本函式

defrandomoptimize

(domain,costf)

: best=

999999999

bestr=

none

for i in

range(0

,1000):

# 建立乙個隨機解

r=[float

(random.randint(domain[i][0

],domain[i][1

]))for i in

range

(len

(domain))]

# get the cost

cost=costf(r)

# compare it to the best one so far

if costbest=cost

bestr=r

return r

#爬山法,從乙個隨機解開始,到臨近找更好的方法,不會隨機浪費時間

defhillclimb

(domain,costf)

:# create a random solution

sol=

[random.randint(domain[i][0

],domain[i][1

])for i in

range

(len

(domain))]

# main loop

while1:

# create list of neighboring solutions

neighbors=

for j in

range

(len

(domain)):

# one away in each direction

if sol[j]

>domain[j][0

]:0:j]

+[sol[j]+1

]+sol[j+1:

])if sol[j]

]:0:j]

+[sol[j]-1

]+sol[j+1:

])# see what the best solution amongst the neighbors is

current=costf(sol)

best=current

for j in

range

(len

(neighbors)):

cost=costf(neighbors[j]

)if costbest=cost

sol=neighbors[j]

# if there's no improvement, then we've reached the top

if best==current:

break

return sol

(開始階段可以接受較差的解,隨著溫度減少,只會接受更好的解)

#模擬退火演算法,爬山法可能只是區域性最優解,退火會接受較差的解,但是差異越大,概率越低,最後拋棄**

#模擬退火演算法,爬山法可能只是區域性最優解,退火會接受較差的解,但是差異越大,概率越低,最後拋棄

defannealingoptimize

(domain,costf,t=

10000.0

,cool=

0.95

,step=1)

:# initialize the values randomly

vec=

[float

(random.randint(domain[i][0

],domain[i][1

]))for i in

range

(len

(domain))]

while t>

0.1:

# choose one of the indices

i=random.randint(0,

len(domain)-1

)# choose a direction to change it

dir=random.randint(

-step,step)

# create a new list with one of the values changed

vecb=vec[:]

vecb[i]

+=dir

if vecb[i]

]: vecb[i]

=domain[i][0

]elif vecb[i]

>domain[i][1

]: vecb[i]

=domain[i][1

]# calculate the current cost and the new cost

ea=costf(vec)

eb=costf(vecb)

p=pow(math.e,

(-eb-ea)

/t)# is it better, or does it make the probability

# cutoff?

if(eb): vec=vecb

# decrease the temperature

t=t*cool

return vec

先隨機生成一組解,稱為種群。計算整個種群的成本函式。建立新種群:1精英選拔最好的解;2修改題解(變異:微小變化)(交叉配對:題解組合)

#遺傳演算法

defgeneoptimize

(domain,costf,popsize=

50,step=

1,mutprob=

0.2,elite=

0.2,maxiter=

100)

:#maxiter代數,mutprob變異的概率,elite遺傳概率

# mutation operation

defmutate

(vec)

: i=random.randint(0,

len(domain)-1

)if random.random(

)<

0.5and vec[i]

>domain[i][0

]:return vec[

0:i]

+[vec[i]

-step]

+vec[i+1:

]elif vec[i]

]:return vec[

0:i]

+[vec[i]

+step]

+vec[i+1:

]# crossover operation

defcrossover

(r1,r2)

: i=random.randint(1,

len(domain)-2

)return r1[

0:i]

+r2[i:

]# build the initial population

pop=

for i in

range

(popsize)

: vec=

[random.randint(domain[i][0

],domain[i][1

])for i in

range

(len

(domain))]

# how many winners from each generation?

topelite=

int(elite*popsize)

# main loop

for i in

range

(maxiter)

: scores=

[(costf(v)

,v)for v in pop]

scores.sort(

) ranked=

[v for

(s,v)

in scores]

# start with the pure winners

pop=ranked[

0:topelite]

# add mutated and bred forms of the winners

while

len(pop)

if random.random(

)# mutation

c=random.randint(

0,topelite)))

else

:# crossover

c1=random.randint(

0,topelite)

c2=random.randint(

0,topelite)

,ranked[c2]))

# print current best score

print scores[0]

[0]return scores[0]

[1]

集體智慧型程式設計學習筆記之優化

某些情況下,在我們能夠得到乙個更優的解之前轉向乙個更差的解是很有必要的。模擬退火演算法不僅總是會接受乙個更優的解,而且它在退火過程的開始階段會接受表現較差的解。隨著退火過程的不斷進行,演算法越來越不可能接受較差的解,直到最後,它將只會接受更優的解。更高成本的題解,其被接受的概率如下 因為溫度 接受較...

集體智慧型程式設計學習

集體智慧型程式設計學習 概要 文章主要討論一些我遇到的問題,學習到的方法,總結一些演算法的實現過程。注 所參考的版本為2009年出版。書中packages與現在有變化,但是可以通過查閱相關packages文件來找到相關功能 3.相似度排序 4.相似人群加權排名及歸一化 6.構建基於 del.icio...

集體智慧型程式設計 第1章 集體智慧型導言

集體智慧型通常是指為了創造新的想法,而將一群人的行為 偏好或思想結合在一起。完成這項工作的最基礎的方法便是使用調查問卷或普查。從一大群人中搜尋的答案可以使我們得到關於群主的統計結論 組中的個體成員將會被忽視。從獨立的資料提供者那裡得到新的結論,是集體智慧型所真正關注的。機器學習是人工智慧領域中與演算...