您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么使用Python算法技術”,在日常操作中,相信很多人在怎么使用Python算法技術問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么使用Python算法技術”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Python版本:3.6.4
相關模塊:
numpy模塊;
argparse模塊;
pygame模塊;
以及一些python自帶的模塊。
安裝Python并添加到環境變量,pip安裝需要的相關模塊即可。
遺傳算法,即:
Genetic Algorithm, GA 是一種元啟發式算法,其核心思想與達爾文的進化理論很相似。簡單而言就是物種在進化過程中,好的基因將得到保留,不好的基因將被淘汰。經過很多代的演變之后,物種當前保留下來的基因就可以看作是對當前環境適應度最好的基因了。
具體應用到我們的小恐龍小游戲上,我們設計算法的思路如下。首先,隨機生成若干個小恐龍(比如100個):
self.dinos = [Dinosaur(cfg.IMAGE_PATHS['dino']) for _ in range(self.population_size)]
每個恐龍的行動由一個小的神經網絡來控制:
self.populations = [Network() for _ in range(self.population_size)]
其中,每個神經網絡都是由兩個全連接層組成,且他們的權重矩陣都是隨機生成的:
'''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))
每個全連接層的輸出結果由以下函數激活以保證輸出值的范圍都在0到1之間:
網絡的輸入值有5個,分別為:
當前離小恐龍最近的障礙物與小恐龍的水平距離;
當前離小恐龍最近的障礙物離地面的高度;
當前離小恐龍最近的障礙物的寬度;
當前離小恐龍最近的障礙物的高度;
小恐龍水平方向上的奔跑速度.
畫個示意圖就是:
接著,我們讓這些神經網絡來控制對應的小恐龍進行游戲:
'''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
直到所有的神經網絡都讓自己控制的小恐龍因為撞到路上的障礙物而死掉。接下來,我們從這些神經網絡中選出幾個讓小恐龍存活的時間最久的(比如選兩個,也就是對應控制的小恐龍得分最高的兩個):
def keepbest(self): self.populations.sort(key=lambda x: x.fitness, reverse=True) self.keeped_nets = self.populations[:self.num_keeped_nets]
讓選出的神經網絡的權重矩陣進行交叉和變異,從而生成新的一批神經網絡:
'''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
同樣地,這批神經網絡每個都會分別控制一只新的小恐龍來進行游戲,直到這批新的神經網絡控制下的小恐龍再次全部死掉。此時,重復之前的動作,即選擇其中表現最好的幾個神經網絡并進行交叉變異,然后再次開始新的游戲,如此反復循環,直到得到滿意的效果。
到此,關于“怎么使用Python算法技術”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。