溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么使用Python算法技術(shù)

發(fā)布時間:2021-11-23 16:50:24 來源:億速云 閱讀:169 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“怎么使用Python算法技術(shù)”,在日常操作中,相信很多人在怎么使用Python算法技術(shù)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么使用Python算法技術(shù)”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

開發(fā)工具

Python版本:3.6.4

相關(guān)模塊:

numpy模塊;

argparse模塊;

pygame模塊;

以及一些python自帶的模塊。


環(huán)境搭建

安裝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之間:

怎么使用Python算法技術(shù)

網(wǎng)絡(luò)的輸入值有5個,分別為:

  1. 當(dāng)前離小恐龍最近的障礙物與小恐龍的水平距離;

  2. 當(dāng)前離小恐龍最近的障礙物離地面的高度;

  3. 當(dāng)前離小恐龍最近的障礙物的寬度;

  4. 當(dāng)前離小恐龍最近的障礙物的高度;

  5. 小恐龍水平方向上的奔跑速度.

畫個示意圖就是: 怎么使用Python算法技術(shù)

接著,我們讓這些神經(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í)用的文章!

向AI問一下細(xì)節(jié)

免責(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)容。

AI