您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么使用Python算法技術(shù)”,在日常操作中,相信很多人在怎么使用Python算法技術(shù)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么使用Python算法技術(shù)”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
Python版本:3.6.4
相關(guān)模塊:
numpy模塊;
argparse模塊;
pygame模塊;
以及一些python自帶的模塊。
安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。
遺傳算法,即:
Genetic Algorithm, GA 是一種元啟發(fā)式算法,其核心思想與達(dá)爾文的進(jìn)化理論很相似。簡單而言就是物種在進(jìn)化過程中,好的基因?qū)⒌玫奖A簦缓玫幕驅(qū)⒈惶蕴?。?jīng)過很多代的演變之后,物種當(dāng)前保留下來的基因就可以看作是對當(dāng)前環(huán)境適應(yīng)度最好的基因了。
具體應(yīng)用到我們的小恐龍小游戲上,我們設(shè)計(jì)算法的思路如下。首先,隨機(jī)生成若干個小恐龍(比如100個):
self.dinos = [Dinosaur(cfg.IMAGE_PATHS['dino']) for _ in range(self.population_size)]
每個恐龍的行動由一個小的神經(jīng)網(wǎng)絡(luò)來控制:
self.populations = [Network() for _ in range(self.population_size)]
其中,每個神經(jīng)網(wǎng)絡(luò)都是由兩個全連接層組成,且他們的權(quán)重矩陣都是隨機(jī)生成的:
'''define the network''' class Network(): def __init__(self, fc1=None, fc2=None, **kwargs): self.fc1 = np.random.randn(5, 16) if fc1 is None else fc1 self.fc2 = np.random.randn(16, 2) if fc2 is None else fc2 self.fitness = 0 '''predict the action''' def predict(self, x): x = x.dot(self.fc1) x = self.activation(x) x = x.dot(self.fc2) x = self.activation(x) return x '''activation function''' def activation(self, x): return 0.5 * (1 + np.tanh(0.5 * x))
每個全連接層的輸出結(jié)果由以下函數(shù)激活以保證輸出值的范圍都在0到1之間:
網(wǎng)絡(luò)的輸入值有5個,分別為:
當(dāng)前離小恐龍最近的障礙物與小恐龍的水平距離;
當(dāng)前離小恐龍最近的障礙物離地面的高度;
當(dāng)前離小恐龍最近的障礙物的寬度;
當(dāng)前離小恐龍最近的障礙物的高度;
小恐龍水平方向上的奔跑速度.
畫個示意圖就是:
接著,我們讓這些神經(jīng)網(wǎng)絡(luò)來控制對應(yīng)的小恐龍進(jìn)行游戲:
'''make decision for all dinos''' def makedecision(self, x): threshold = 0.55 actions = self.ai.predict(x) for i in range(len(actions)): action = actions[i] if self.dinos[i].is_dead: continue if action[0] >= threshold: self.dinos[i].jump(self.sounds) elif action[1] >= threshold: self.dinos[i].duck() else: self.dinos[i].unduck() self.ai.populations[i].fitness = self.dinos[i].score
直到所有的神經(jīng)網(wǎng)絡(luò)都讓自己控制的小恐龍因?yàn)樽驳铰飞系恼系K物而死掉。接下來,我們從這些神經(jīng)網(wǎng)絡(luò)中選出幾個讓小恐龍存活的時間最久的(比如選兩個,也就是對應(yīng)控制的小恐龍得分最高的兩個):
def keepbest(self): self.populations.sort(key=lambda x: x.fitness, reverse=True) self.keeped_nets = self.populations[:self.num_keeped_nets]
讓選出的神經(jīng)網(wǎng)絡(luò)的權(quán)重矩陣進(jìn)行交叉和變異,從而生成新的一批神經(jīng)網(wǎng)絡(luò):
'''crossover''' def crossover(self): def crossoverweight(fc1, fc2): assert len(fc1) == len(fc2) crossover_len = int(len(fc1) * random.uniform(0, 1)) for i in range(crossover_len): fc1[i], fc2[i] = fc2[i], fc1[i] return fc1, fc2 nets_new = [] size = min(self.num_keeped_nets * self.num_keeped_nets, self.population_size) for _ in range(size): net_1 = copy.deepcopy(random.choice(self.keeped_nets)) net_2 = copy.deepcopy(random.choice(self.keeped_nets)) for _ in range(self.num_crossover_times): net_1.fc1, net_2.fc1 = crossoverweight(net_1.fc1, net_2.fc1) net_1.fc2, net_2.fc2 = crossoverweight(net_1.fc2, net_2.fc2) nets_new.append(net_1) return nets_new '''mutate''' def mutate(self, net): def mutateweight(fc, prob): if random.uniform(0, 1) < prob: return fc * random.uniform(0.5, 1.5) else: return fc net = copy.deepcopy(net) net.fc1 = mutateweight(net.fc1, self.mutation_prob) net.fc2 = mutateweight(net.fc2, self.mutation_prob) return net
同樣地,這批神經(jīng)網(wǎng)絡(luò)每個都會分別控制一只新的小恐龍來進(jìn)行游戲,直到這批新的神經(jīng)網(wǎng)絡(luò)控制下的小恐龍?jiān)俅稳克赖?。此時,重復(fù)之前的動作,即選擇其中表現(xiàn)最好的幾個神經(jīng)網(wǎng)絡(luò)并進(jìn)行交叉變異,然后再次開始新的游戲,如此反復(fù)循環(huán),直到得到滿意的效果。
到此,關(guān)于“怎么使用Python算法技術(shù)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。