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