精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在Python中用遺傳算法優化垃圾收集策略

開發 后端 大數據 算法
在本文中,我將展示如何在Python中實現一個遺傳算法,在幾個小時內“進化”一個收集垃圾的機器人。

遺傳算法是一個優化技術,在本質上類似于進化過程。這可能是一個粗略的類比,但如果你瞇著眼睛看,達爾文的自然選擇確實大致上類似于一個優化任務,其目的是制造出完全適合在其環境中繁衍生息的有機體。

在本文中,我將展示如何在Python中實現一個遺傳算法,在幾個小時內“進化”一個收集垃圾的機器人。

[[348489]]

背景

我所遇到的遺傳算法原理最好的教程來自Melanie Mitchell寫的一本關于復雜系統的好書《Complexity: A Guided Tour》。

在其中一個章節中,Mitchell介紹了一個名叫Robby的機器人,他在生活中的唯一目的是撿垃圾,并描述了如何使用GA優化Robby的控制策略。下面我將解釋我解決這個問題的方法,并展示如何在Python中實現該算法。有一些很好的包可以用來構造這類算法(比如DEAP),但是在本教程中,我將只使用基本Python、Numpy和TQDM(可選)。

雖然這只是一個玩具的例子,但GAs在許多實際應用中都有使用。作為一個數據科學家,我經常用它們來進行超參數優化和模型選擇。雖然GAs的計算成本很高,但GAs允許我們并行地探索搜索空間的多個區域,并且在計算梯度時是一個很好的選擇。

問題描述

一個名為Robby的機器人生活在一個充滿垃圾的二維網格世界中,周圍有4堵墻(如下圖所示)。這個項目的目標是發展一個最佳的控制策略,使他能夠有效地撿垃圾,而不是撞墻。

Robby只能看到他周圍上下左右四個方塊以及他所在的方塊,每個方塊有3個選擇,空的,有垃圾,或者是一面墻。因此,Robby有3⁵=243種不同的情況。Robby可以執行7種不同的動作:上下左右的移動(4種)、隨機移動、撿拾垃圾或靜止不動。

因此,Robby的控制策略可以編碼為一個“DNA”字符串,由0到6之間的243位數字組成(對應于Robby在243種可能的情況下應該采取的行動)。

方法

任何GA的優化步驟如下:

  1. 生成問題初始隨機解的“種群”
  2. 個體的“擬合度”是根據它解決問題的程度來評估的
  3. 最合適的解決方案進行“繁殖”并將“遺傳”物質傳遞給下一代的后代
  4. 重復第2步和第3步,直到我們得到一組優化的解決方案

在我們的任務中,你創建了第一代Robbys初始化為隨機DNA字符串(對應于隨機控制策略)。然后模擬讓這些機器人在隨機分配的網格世界中運行,并觀察它們的性能。

擬合度

機器人的擬合度取決于它在n次移動中撿到多少垃圾,以及它撞到墻上多少次。在我們的例子中,機器人每撿到一塊垃圾就給它10分,每次它撞到墻上就減去5分。然后,這些機器人以它們的擬合度相關的概率進行“交配”(即,撿起大量垃圾的機器人更有可能繁衍后代),新一代機器人誕生了。

交配

有幾種不同的方法可以實現“交配”。在Mitchell的版本中,她將父母的兩條DNA鏈隨機拼接,然后將它們連接在一起,為下一代創造一個孩子。在我的實現中,我從每一個親本中隨機分配每個基因(即,對于243個基因中的每一個,我擲硬幣決定遺傳誰的基因)。

例如使用我的方法,在前10個基因里,父母和孩子可能的基因如下: 

  1. Parent 1: 1440623161 
  2. Parent 2: 2430661132 
  3. Child:    2440621161 

突變

我們用這個算法復制的另一個自然選擇的概念是“變異”。雖然一個孩子的絕大多數基因都是從父母那里遺傳下來的,但我也建立了基因突變的小可能性(即隨機分配)。這種突變率使我們能夠探索新的可能。

Python實現

第一步是導入所需的包并為此任務設置參數。我已經選擇了這些參數作為起點,但是它們可以調整,我鼓勵你可以嘗試調整。 

  1. ""
  2. 導入包 
  3. ""
  4. import numpy as np 
  5. from tqdm.notebook import tqdm 
  6.  
  7. ""
  8. 設置參數 
  9. ""
  10. # 仿真設置 
  11. pop_size = 200 # 每一代機器人的數量 
  12. num_breeders = 100 # 每一代能夠交配的機器人數量 
  13. num_gen = 400 # 總代數 
  14. iter_per_sim = 100 # 每個機器人垃圾收集模擬次數 
  15. moves_per_iter = 200 # 機器人每次模擬可以做的移動數 
  16.  
  17. # 網格設置 
  18. rubbish_prob = 0.5 # 每個格子中垃圾的概率 
  19. grid_size = 10 # 0網格大小(墻除外) 
  20.  
  21. # 進化設置 
  22. wall_penalty = -5 # 因撞到墻上而被扣除的擬合點 
  23. no_rub_penalty = -1 # 在空方塊撿垃圾被扣分 
  24. rubbish_score = 10 # 撿垃圾可獲得積分 
  25. mutation_rate = 0.01 # 變異的概率 

接下來,我們為網格世界環境定義一個類。我們用標記“o”、“x”和“w”來表示每個單元,分別對應一個空單元、一個帶有垃圾的單元和一個墻。 

  1. class Environment: 
  2.     ""
  3.     類,用于表示充滿垃圾的網格環境。每個單元格可以表示為: 
  4.     'o': 空 
  5.     'x': 垃圾 
  6.     'w': 墻 
  7.     ""
  8.     def __init__(self, p=rubbish_prob, g_size=grid_size): 
  9.         self.p = p # 單元格是垃圾的概率 
  10.         self.g_size = g_size # 不包括墻 
  11.  
  12.         # 初始化網格并隨機分配垃圾 
  13.         self.grid = np.random.choice(['o','x'], size=(self.g_size+2,self.g_size+2), p=(1 - self.p, self.p)) 
  14.          
  15.         # 設置外部正方形為墻壁 
  16.         self.grid[:,[0,self.g_size+1]] = 'w' 
  17.         self.grid[[0,self.g_size+1], :] = 'w' 
  18.  
  19.     def show_grid(self): 
  20.         # 以當前狀態打印網格 
  21.         print(self.grid) 
  22.  
  23.     def remove_rubbish(self,i,j): 
  24.         # 從指定的單元格(i,j)清除垃圾 
  25.         if self.grid[i,j] == 'o': # 單元格已經是空 
  26.             return False 
  27.         else
  28.             self.grid[i,j] = 'o' 
  29.             return True 
  30.  
  31.     def get_pos_string(self,i,j): 
  32.         # 返回一個字符串,表示單元格(i,j)中機器人“可見”的單元格 
  33.         return self.grid[i-1,j] + self.grid[i,j+1] + self.grid[i+1,j] + self.grid[i,j-1] + self.grid[i,j] 

接下來,我們創建一個類來表示我們的機器人。這個類包括執行動作、計算擬合度和從一對父機器人生成新DNA的方法。 

  1. class Robot: 
  2.     ""
  3.     用于表示垃圾收集機器人 
  4.     ""
  5.     def __init__(self, p1_dna=None, p2_dna=None, m_rate=mutation_rate, w_pen=wall_penalty, nr_pen=no_rub_penalty, r_score=rubbish_score): 
  6.         self.m_rate = m_rate # 突變率 
  7.         self.wall_penalty = w_pen # 因撞到墻上而受罰 
  8.         self.no_rub_penalty = nr_pen # 在空方塊撿垃圾的處罰 
  9.         self.rubbish_score = r_score # 撿垃圾的獎勵 
  10.         self.p1_dna = p1_dna # 父母2的DNA 
  11.         self.p2_dna = p2_dna # 父母2的DNA 
  12.          
  13.         # 生成字典來從場景字符串中查找基因索引 
  14.         con = ['w','o','x'] # 墻,空,垃圾 
  15.         self.situ_dict = dict() 
  16.         count = 0 
  17.         for up in con: 
  18.             for right in con: 
  19.                 for down in con: 
  20.                     for left in con: 
  21.                         for pos in con: 
  22.                             self.situ_dict[up+right+down+left+pos] = count 
  23.                             count += 1 
  24.          
  25.         # 初始化DNA 
  26.         self.get_dna() 
  27.  
  28.     def get_dna(self): 
  29.         # 初始化機器人的dna字符串 
  30.         if self.p1_dna is None: 
  31.             # 沒有父母的時候隨機生成DNA 
  32.             self.dna = ''.join([str(x) for x in np.random.randint(7,size=243)]) 
  33.         else
  34.             self.dna = self.mix_dna() 
  35.  
  36.     def mix_dna(self): 
  37.         # 從父母的DNA生成機器人的DNA 
  38.         mix_dna = ''.join([np.random.choice([self.p1_dna,self.p2_dna])[i] for i in range(243)]) 
  39.  
  40.         #添加變異 
  41.         for i in range(243): 
  42.             if np.random.rand() > 1 - self.m_rate: 
  43.                 mix_dna = mix_dna[:i] + str(np.random.randint(7)) + mix_dna[i+1:] 
  44.  
  45.         return mix_dna 
  46.  
  47.     def simulate(self, n_iterations, n_moves, debug=False): 
  48.         # 仿真垃圾收集 
  49.         tot_score = 0 
  50.         for it in range(n_iterations): 
  51.             self.score = 0 # 擬合度分數 
  52.             self.envir = Environment() 
  53.             self.i, self.j = np.random.randint(1,self.envir.g_size+1, size=2) # 隨機分配初始位置 
  54.             if debug: 
  55.                 print('before'
  56.                 print('start position:',self.i, self.j) 
  57.                 self.envir.show_grid() 
  58.             for move in range(n_moves): 
  59.                 self.act() 
  60.             tot_score += self.score 
  61.             if debug: 
  62.                 print('after'
  63.                 print('end position:',self.i, self.j) 
  64.                 self.envir.show_grid() 
  65.                 print('score:',self.score) 
  66.         return tot_score / n_iterations # n次迭代的平均得分 
  67.  
  68.     def act(self): 
  69.         # 根據DNA和機器人位置執行動作 
  70.         post_str = self.envir.get_pos_string(self.i, self.j) # 機器人當前位置 
  71.         gene_idx = self.situ_dict[post_str] # 當前位置DNA的相關索引 
  72.         act_key = self.dna[gene_idx] # 從DNA中讀取行動 
  73.         if act_key == '5'
  74.             # 隨機移動 
  75.             act_key = np.random.choice(['0','1','2','3']) 
  76.  
  77.         if act_key == '0'
  78.             self.mv_up() 
  79.         elif act_key == '1'
  80.             self.mv_right() 
  81.         elif act_key == '2'
  82.             self.mv_down() 
  83.         elif act_key == '3'
  84.             self.mv_left() 
  85.         elif act_key == '6'
  86.             self.pickup() 
  87.  
  88.     def mv_up(self): 
  89.         # 向上移動 
  90.         if self.i == 1: 
  91.             self.score += self.wall_penalty 
  92.         else
  93.             self.i -= 1 
  94.  
  95.     def mv_right(self): 
  96.         # 向右移動 
  97.         if self.j == self.envir.g_size: 
  98.             self.score += self.wall_penalty 
  99.         else
  100.             self.j += 1 
  101.  
  102.     def mv_down(self): 
  103.         # 向下移動 
  104.         if self.i == self.envir.g_size: 
  105.             self.score += self.wall_penalty 
  106.         else
  107.             self.i += 1 
  108.  
  109.     def mv_left(self): 
  110.         # 向左移動 
  111.         if self.j == 1: 
  112.             self.score += self.wall_penalty 
  113.         else
  114.             self.j -= 1 
  115.  
  116.     def pickup(self): 
  117.         # 撿垃圾 
  118.         success = self.envir.remove_rubbish(self.i, self.j) 
  119.         if success: 
  120.             # 成功撿到垃圾 
  121.             self.score += self.rubbish_score 
  122.         else
  123.             # 當前方塊沒有撿到垃圾 
  124.             self.score += self.no_rub_penalty 

最后是運行遺傳算法的時候了。在下面的代碼中,我們生成一個初始的機器人種群,讓自然選擇來運行它的過程。我應該提到的是,當然有更快的方法來實現這個算法(例如利用并行化),但是為了本教程的目的,我犧牲了速度來實現清晰。 

  1. # 初始種群 
  2. pop = [Robot() for x in range(pop_size)] 
  3. results = [] 
  4.  
  5. # 執行進化 
  6. for i in tqdm(range(num_gen)): 
  7.     scores = np.zeros(pop_size) 
  8.      
  9.     # 遍歷所有機器人 
  10.     for idx, rob in enumerate(pop): 
  11.         # 運行垃圾收集模擬并計算擬合度 
  12.         score = rob.simulate(iter_per_sim, moves_per_iter) 
  13.         scores[idx] = score 
  14.  
  15.     results.append([scores.mean(),scores.max()]) # 保存每一代的平均值和最大值 
  16.  
  17.     best_robot = pop[scores.argmax()] # 保存最好的機器人 
  18.  
  19.     # 限制那些能夠交配的機器人的數量 
  20.     inds = np.argpartition(scores, -num_breeders)[-num_breeders:] # 基于擬合度得到頂級機器人的索引 
  21.     subpop = [] 
  22.     for idx in inds: 
  23.         subpop.append(pop[idx]) 
  24.     scores = scores[inds] 
  25.  
  26.     # 平方并標準化 
  27.     norm_scores = (scores - scores.min()) ** 2  
  28.     norm_scores = norm_scores / norm_scores.sum() 
  29.  
  30.     # 創造下一代機器人 
  31.     new_pop = [] 
  32.     for child in range(pop_size): 
  33.         # 選擇擬合度優秀的父母 
  34.         p1, p2 = np.random.choice(subpop, p=norm_scores, size=2, replace=False
  35.         new_pop.append(Robot(p1.dna, p2.dna)) 
  36.  
  37.     pop = new_pop 

雖然最初大多數機器人不撿垃圾,總是撞到墻上,但幾代人之后,我們開始看到一些簡單的策略(例如“如果與垃圾在一起,就撿起來”和“如果挨著墻,就不要移到墻里”)。經過幾百次的反復,我們只剩下一代不可思議的垃圾收集天才!

結果

下面的圖表表明,我們能夠在400代機器人種群中“進化”出一種成功的垃圾收集策略。 

為了評估進化控制策略的質量,我手動創建了一個基準策略,其中包含一些直觀合理的規則:

  • 如果垃圾在當前方塊,撿起來
  • 如果在相鄰的方塊上可以看到垃圾,移到那個方塊
  • 如果靠近墻,則向相反方向移動
  • 否則,隨意移動

平均而言,這一基準策略達到了426.9的擬合度,但我們最終的“進化”機器人的平均擬合度為475.9。

戰略分析

這種優化方法最酷的一點是,你可以找到反直覺的解決方案。機器人不僅能夠學習人類可能設計的合理規則,而且還自發地想出了人類可能永遠不會考慮的策略。一種先進的技術出現了,就是使用“標記物”來克服近視和記憶不足。

例如,如果一個機器人現在在一個有垃圾的方塊上,并且可以看到東西方方塊上的垃圾,那么一個天真的方法就是立即撿起當前方塊上的垃圾,然后移動到那個有垃圾的方塊。這種策略的問題是,一旦機器人移動(比如向西),他就無法記住東邊還有1個垃圾。為了克服這個問題,我們觀察了我們的進化機器人執行以下步驟:

  • 向西移動(在當前方塊留下垃圾作為標記)
  • 撿起垃圾往東走(它可以看到垃圾作為標記)
  • 把垃圾撿起來,搬到東邊去
  • 撿起最后一塊垃圾 

從這種優化中產生的另一個反直覺策略的例子如下所示。OpenAI使用強化學習(一種更復雜的優化方法)教代理玩捉迷藏。我們看到,這些代理一開始學習“人類”策略,但最終學會了新的解決方案。

結論

遺傳算法以一種獨特的方式將生物學和計算機科學結合在一起,雖然不一定是最快的算法,但在我看來,它們是最美麗的算法之一。

 

責任編輯:未麗燕 來源: segmentfault.com
相關推薦

2025-01-16 07:10:00

2017-10-17 14:25:56

機器學習算法優化

2014-11-28 16:08:33

射頻識別RFID

2009-06-15 16:14:40

Java垃圾收集算法GC

2021-03-10 15:49:20

人工智能遺傳算法

2024-07-03 08:00:00

2017-11-16 15:25:54

Go語言算法代碼

2024-01-15 11:12:28

Go內存開發

2021-03-16 11:30:33

2020-06-11 08:32:50

Python遺傳算法代碼

2009-08-14 09:41:03

C#遺傳算法

2010-02-22 08:58:35

JVM內存模型垃圾收集

2017-09-22 15:03:08

Python遺傳算法GAFT框架

2024-09-12 10:06:21

2024-07-15 08:00:00

2010-01-06 16:33:50

.Net Framew

2017-08-03 10:05:01

Python遺傳算法GAFT

2017-08-21 10:00:23

遺傳算法Python生物學

2025-06-19 02:11:00

2010-05-11 11:00:44

遺傳算法宋詞
點贊
收藏

51CTO技術棧公眾號

天天射综合网视频| 韩国成人在线| 26uuu亚洲| 国产精品视频免费观看www| 波兰性xxxxx极品hd| 日本99精品| 日本国产一区二区| 日本黄色播放器| 婷婷综合激情网| 日本不卡视频在线观看| 欧美激情aaaa| 欧美老女人性生活视频| 51亚洲精品| 欧美视频自拍偷拍| 成人免费aaa| 男人和女人做事情在线视频网站免费观看| 极品尤物av久久免费看| 欧美性做爰毛片| 欧产日产国产v| 欧美日韩伦理在线免费| 亚洲精品999| 最新天堂在线视频| 欧美大片1688| 偷拍一区二区三区四区| 异国色恋浪漫潭| 国产剧情在线观看| 94色蜜桃网一区二区三区| 91久久精品国产91久久| 国产三级理论片| 在线亚洲精品| 性色av一区二区三区在线观看| 任我爽在线视频| 精品亚洲成人| 亚洲人成电影网站色…| 无码一区二区精品| 国产精品久久久久久久久久白浆| 欧美一区国产二区| 日本高清一区二区视频| 99热播精品免费| 色婷婷综合视频在线观看| 日本香蕉视频在线观看| 天使と恶魔の榨精在线播放| 国产精品情趣视频| 亚洲va韩国va欧美va精四季| 欧美女v视频| 91色porny在线视频| 国产精品免费一区二区三区四区 | 91精品国产高清一区二区三区 | 婷婷丁香久久| 欧亚一区二区三区| 精品久久久噜噜噜噜久久图片| 僵尸再翻生在线观看| 午夜精品久久久久久久久久 | 久久视频一区| 日韩69视频在线观看| 国产精品免费精品一区| 国产精品久久久久毛片大屁完整版| 欧美极品少妇xxxxⅹ喷水| 久草成人在线视频| 亚洲高清毛片| 91av在线播放视频| 午夜精品一区二| 蜜臀a∨国产成人精品| 国产一区二区在线播放| 国产精品羞羞答答在线| 精品无人码麻豆乱码1区2区| 91免费电影网站| 国产成人精品免费看视频| 国产成人免费视频网站| 国产伦精品一区二区三区照片 | 久久久99久久| 天堂av一区二区| 国产日产一区二区| 亚洲一区二区三区四区在线免费观看| 无码人妻少妇伦在线电影| 国产中文在线播放| 在线免费不卡电影| 亚洲一二三不卡| 国产日韩三级| 中日韩美女免费视频网址在线观看| 国产又黄又粗又猛又爽的| 中文字幕免费一区二区| 国产做受高潮69| 国产情侣免费视频| 国产精品主播直播| 欧美精彩一区二区三区| 在线播放麻豆| 亚洲超碰精品一区二区| 一区二区三区国产免费| 国产精品色婷婷在线观看| 亚洲国产天堂网精品网站| 日本少妇高潮喷水xxxxxxx| 欧美黄色大片在线观看| 久久久久久久久网站| 国产精品xxxxxx| 国产精品系列在线观看| 欧美性bbwbbwbbwhd| 日本美女高清在线观看免费| 亚洲大片一区二区三区| 三级视频中文字幕| 激情av综合| 日韩中文字幕在线看| 日韩伦理在线视频| 激情图片小说一区| 精品人伦一区二区三区| 九七久久人人| 日本乱人伦aⅴ精品| 韩国三级丰满少妇高潮| 精品国产乱码久久久| 色综合色综合久久综合频道88| 亚洲大片免费观看| 成人av综合在线| 亚洲成人动漫在线| 天天综合网站| 亚洲成avwww人| 国产黄色的视频| 日韩二区三区四区| 国模精品娜娜一二三区| 中文字幕在线三区| 欧美日韩国产影片| 国产一二三四五区| 国产欧美亚洲一区| www.久久艹| 国产激情视频在线| 欧美日韩亚洲另类| 一级黄色性视频| 午夜在线视频观看日韩17c| 高清免费日韩| av在线app| 4438x成人网最大色成网站| 国产精品九九视频| 一区二区视频欧美| 国产精品日韩欧美一区二区三区| www.久久ai| 欧美电影影音先锋| 91香蕉视频污在线观看| 奇米色一区二区| 欧美一区二区三区在线免费观看| 蜜桃麻豆影像在线观看| 精品成人私密视频| 久久综合综合久久| 国产成人在线看| 日韩欧美一级在线| 亚洲三级av| 久久国产色av| 精品人妻一区二区三区麻豆91| 国产精品家庭影院| 天天干天天色天天干| 国产精品久久久久久久免费观看| 国产日韩欧美电影在线观看| 91福利在线视频| 欧美精品18+| 91麻豆免费视频网站| 国产一区二区在线电影| 可以在线看黄的网站| 视频一区中文字幕精品| 色综合男人天堂| 可以免费观看的毛片| 欧美日韩国产一区在线| 精品国产无码在线观看| 日本视频在线一区| 亚洲自拍偷拍二区| 奇米一区二区| 26uuu亚洲伊人春色| 毛片在线播放网址| 欧美日韩一区二区在线观看视频| 日韩一卡二卡在线观看| 国产精品一区二区果冻传媒| 高清无码视频直接看| 激情小说亚洲色图| 国产精品久久久久久久久久免费 | 亚洲av无码乱码国产精品久久| 一区二区三区四区激情| 久久国产精品无码一级毛片| 久久尤物视频| 丰满女人性猛交| 国产精品乱战久久久| 国产www精品| 国产精品扒开做爽爽爽的视频| 精品乱码亚洲一区二区不卡| 久久精品国产成人av| 国产精品欧美综合在线| 99热这里只有精品2| 国产视频一区欧美| 亚洲欧美日韩国产成人综合一二三区| 久久久久久久久久久久电影| 午夜精品一区二区三区视频免费看| 日本大片在线观看| 91麻豆精品国产自产在线| 日韩av在线电影| 中文字幕不卡在线| 国产免费一区二区三区最新6| 日日噜噜夜夜狠狠视频欧美人| 桥本有菜av在线| 亚洲人成网亚洲欧洲无码| 91亚洲精品一区| 在线免费三级电影网站| 久久躁狠狠躁夜夜爽| 三区在线观看| 欧美电视剧在线看免费| 亚洲午夜无码久久久久| 亚洲va欧美va人人爽| 青青操在线播放| 91麻豆.com| 美女又黄又免费的视频| 蜜桃精品在线观看| 久久综合色视频| 欧美不卡在线| 亚洲精品在线免费| 三级精品视频| 99影视tv| 精品国产亚洲一区二区三区在线| 青青草一区二区| 182在线视频观看| 久久精品夜夜夜夜夜久久| 国产乱视频在线观看| 日韩精品在线影院| 欧美熟妇另类久久久久久不卡| 7777精品伊人久久久大香线蕉完整版| 五月婷婷色丁香| 香蕉av福利精品导航| www.超碰在线观看| 中文字幕一区二区5566日韩| 国产人妻一区二区| 久久欧美一区二区| 北岛玲一区二区| 国产**成人网毛片九色| 丰满少妇中文字幕| 国产最新精品免费| 日本中文字幕二区| 蜜臀va亚洲va欧美va天堂| 欧美一级黄色影院| 日本午夜精品视频在线观看 | 日韩成人av电影| 68精品国产免费久久久久久婷婷| 久久不射影院| 欧美精品激情视频| 蜜桃成人365av| 欧美日韩国产二区| 久草在线视频福利| 久久久久久久激情视频| xxxx成人| 91精品国产777在线观看| av资源在线播放| 欧美在线视频a| 日韩影片中文字幕| 国产精品老女人精品视频| 秋霞国产精品| 成人黄色片在线| 婷婷综合国产| 国模精品娜娜一二三区| 婷婷成人综合| 日本欧洲国产一区二区| 日韩一区二区在线| 裸体裸乳免费看| 欧美日韩三级| 无罩大乳的熟妇正在播放| 国产亚洲毛片在线| 日本久久久久久久久久久久| 老汉av免费一区二区三区| 精品亚洲视频在线| 国产99久久久精品| 噜噜噜在线视频| 欧美激情一区二区三区四区| 波多野结衣喷潮| 亚洲一区二区欧美| 国产成人无码av| 欧美裸体bbwbbwbbw| 精品二区在线观看| 日韩电影第一页| aaa日本高清在线播放免费观看| 日韩视频在线观看免费| 欧美性爽视频| 日韩美女福利视频| 美女精品久久| 免费成人看片网址| 99久久婷婷这里只有精品| 性一交一乱一伧国产女士spa| 免费中文字幕日韩欧美| 日本超碰在线观看| 成人国产精品免费观看动漫 | 亚洲乱码国产乱码精品精的特点 | 欧美性受xxxx黑人xyx性爽| 91影院在线播放| 亚洲国产精品字幕| 91这里只有精品| 久久久久女教师免费一区| 色婷婷综合久久久中字幕精品久久| 国产中文日韩欧美| 婷婷精品在线| 国产91视频一区| 久久亚洲精选| 国产精九九网站漫画| 久久精品水蜜桃av综合天堂| 欧美日韩精品亚洲精品| 色婷婷香蕉在线一区二区| 国产丰满美女做爰| 亚洲九九九在线观看| 色yeye免费人成网站在线观看| 国产成人av网| 视频福利一区| 国产成人一二三区| 久久丁香综合五月国产三级网站| 性欧美丰满熟妇xxxx性久久久| 成人欧美一区二区三区黑人麻豆| 亚洲欧美偷拍视频| 91精品国产色综合久久不卡电影| 日av在线播放| 久久久亚洲精选| 精品99re| 自拍偷拍99| 日韩av中文字幕一区二区 | 日韩中文av| 99在线免费视频观看| 蜜臂av日日欢夜夜爽一区| 内射中出日韩无国产剧情| 亚洲最新视频在线播放| 一级片在线观看视频| 亚洲男人的天堂在线| 1区2区在线| 国产传媒欧美日韩| 午夜国产欧美理论在线播放 | 久久久99精品视频| 激情综合色综合久久综合| 我想看黄色大片| 色综合久久久久| 亚洲日本中文字幕在线| 欧美精品久久久久久久| 欧美一级做a| 一区二区在线中文字幕电影视频| 老司机午夜免费精品视频| 青青草视频播放| 精品久久久香蕉免费精品视频| 成人午夜福利视频| 欧美激情视频网址| 91在线一区| 无码熟妇人妻av在线电影| 国产一区二区三区免费看| 麻豆明星ai换脸视频| 制服丝袜日韩国产| 国产网友自拍视频导航网站在线观看 | 日韩精品另类天天更新| 久久高清国产| 成人性生交大免费看| 色先锋aa成人| 成人亚洲综合天堂| 国产精品91久久久久久| 波多野结衣在线播放一区| 免费看污黄网站| 国产精品电影院| 国产情侣自拍小视频| 欧美成人一区在线| 给我免费播放日韩视频| 亚洲熟妇无码一区二区三区| 播五月开心婷婷综合| av黄色在线播放| 国产亚洲免费的视频看| 国产a亚洲精品| 亚洲欧美日韩不卡| 成人一区二区视频| 亚洲午夜18毛片在线看| 尤物九九久久国产精品的分类| 主播大秀视频在线观看一区二区| 亚洲日本理论电影| 国产一区二区女| 国产成人在线播放视频| 亚洲人成电影网站色| 99热这里有精品| 黄色激情在线视频| 91视频你懂的| 一区二区视频免费观看| 欧美精品一二区| 婷婷国产精品| 手机版av在线| 午夜一区二区三区视频| 黄色片视频在线观看| 91精品免费看| 亚洲精品1234| 免费视频91蜜桃| 欧美一级二级三级蜜桃| 九色porny自拍视频在线播放 | 国产午夜精品一区理论片| 国产欧美韩国高清| 国产精品www994| 香蕉视频久久久| 日韩欧美色综合| sis001欧美| 亚洲天堂第一区| 久久中文字幕电影| 国产av精国产传媒| 日本成人在线视频网址| 中文字幕av亚洲精品一部二部| aa一级黄色片| 欧美一级高清片在线观看| 卡通欧美亚洲| 日本精品久久久久久久久久| 欧美国产日韩a欧美在线观看| 亚洲精品久久久蜜桃动漫| 国产精品亚洲精品| 最新国产乱人伦偷精品免费网站|