亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++實現遺傳算法

2020-01-26 14:47:24
字體:
來源:轉載
供稿:網友

本文實例講述了C++實現簡單遺傳算法。分享給大家供大家參考。具體實現方法如下:

// CMVSOGA.h : main header file for the CMVSOGA.cpp//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #if !defined(AFX_CMVSOGA_H__45BECA_61EB_4A0E_9746_9A94D1CCF767__INCLUDED_)#define AFX_CMVSOGA_H__45BECA_61EB_4A0E_9746_9A94D1CCF767__INCLUDED_ #if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include "Afxtempl.h"#define variablenum 14class CMVSOGA{public: CMVSOGA(); ~CMVSOGA(); void selectionoperator(); void crossoveroperator(); void mutationoperator(); void initialpopulation(int, int ,double ,double,double *,double *);      //種群初始化 void generatenextpopulation();     //生成下一代種群 void evaluatepopulation();      //評價個體,求最佳個體 void calculateobjectvalue();     //計算目標函數值 void calculatefitnessvalue();     //計算適應度函數值 void findbestandworstindividual();     //尋找最佳個體和最差個體 void performevolution();   void GetResult(double *); void GetPopData(CList <double,double>&); void SetFitnessData(CList <double,double>&,CList <double,double>&,CList <double,double>&);private: struct individual { double chromosome[variablenum];     //染色體編碼長度應該為變量的個數 double value;      double fitness;       //適應度 }; double variabletop[variablenum];     //變量值 double variablebottom[variablenum];     //變量值 int popsize;       //種群大小// int generation;       //世代數 int best_index;  int worst_index; double crossoverrate;      //交叉率 double mutationrate;      //變異率 int maxgeneration;       //最大世代數 struct individual bestindividual;     //最佳個體 struct individual worstindividual;     //最差個體 struct individual current;       //當前個體 struct individual current1;       //當前個體 struct individual currentbest;     //當前最佳個體 CList <struct individual,struct individual &> population;  //種群 CList <struct individual,struct individual &> newpopulation; //新種群 CList <double,double> cfitness;     //存儲適應度值 //怎樣使鏈表的數據是一個結構體????主要是想把種群作成鏈表。節省空間。};#endif   執行文件: // CMVSOGA.cpp : implementation file// #include "stdafx.h"http://#include "vld.h"#include "CMVSOGA.h"#include "math.h"#include "stdlib.h"  #ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CMVSOGA.cppCMVSOGA::CMVSOGA(){ best_index=0;  worst_index=0; crossoverrate=0;      //交叉率 mutationrate=0;      //變異率 maxgeneration=0;}CMVSOGA::~CMVSOGA(){ best_index=0;  worst_index=0; crossoverrate=0;      //交叉率 mutationrate=0;      //變異率 maxgeneration=0; population.RemoveAll();  //種群 newpopulation.RemoveAll(); //新種群 cfitness.RemoveAll(); }void CMVSOGA::initialpopulation(int ps, int gen ,double cr ,double mr,double *xtop,double *xbottom) //第一步,初始化。{ //應該采用一定的策略來保證遺傳算法的初始化合理,采用產生正態分布隨機數初始化?選定中心點為多少? int i,j; popsize=ps; maxgeneration=gen; crossoverrate=cr; mutationrate =mr; for (i=0;i<variablenum;i++) { variabletop[i] =xtop[i]; variablebottom[i] =xbottom[i]; } //srand( (unsigned)time( NULL ) ); //尋找一個真正的隨機數生成函數。 for(i=0;i<popsize;i++) {  for (j=0;j<variablenum ;j++) {  current.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j]; } current.fitness=0; current.value=0; population.InsertAfter(population.FindIndex(i),current);//除了初始化使用insertafter外,其他的用setat命令。 }}void CMVSOGA::generatenextpopulation()//第三步,生成下一代。{ //srand( (unsigned)time( NULL ) ); selectionoperator(); crossoveroperator(); mutationoperator();}//void CMVSOGA::evaluatepopulation()  //第二步,評價個體,求最佳個體//{// calculateobjectvalue();// calculatefitnessvalue();  //在此步中因該按適應度值進行排序.鏈表的排序.// findbestandworstindividual();//}void CMVSOGA:: calculateobjectvalue() //計算函數值,應該由外部函數實現。主要因為目標函數很復雜。{ int i,j;  double x[variablenum]; for (i=0; i<popsize; i++) { current=population.GetAt(population.FindIndex(i));  current.value=0; //使用外部函數進行,在此只做結果的傳遞。 for (j=0;j<variablenum;j++) {  x[j]=current.chromosome[j];  current.value=current.value+(j+1)*pow(x[j],4); } ////使用外部函數進行,在此只做結果的傳遞。 population.SetAt(population.FindIndex(i),current); }} void CMVSOGA::mutationoperator() //對于浮點數編碼,變異算子的選擇具有決定意義。     //需要guass正態分布函數,生成方差為sigma,均值為浮點數編碼值c。{// srand((unsigned int) time (NULL)); int i,j; double r1,r2,p,sigma;//sigma高斯變異參數  for (i=0;i<popsize;i++) { current=population.GetAt(population.FindIndex(i));  //生成均值為current.chromosome,方差為sigma的高斯分布數 for(j=0; j<variablenum; j++) {    r1 = double(rand()%10001)/10000;  r2 = double(rand()%10001)/10000;  p = double(rand()%10000)/10000;  if(p<mutationrate)  {  double sign;  sign=rand()%2;  sigma=0.01*(variabletop[j]-variablebottom [j]);  //高斯變異  if(sign)  {   current.chromosome[j] = (current.chromosome[j]    + sigma*sqrt(-2*log(r1)/0.4323)*sin(2*3.1415926*r2));  }  else  {   current.chromosome[j] = (current.chromosome[j]    - sigma*sqrt(-2*log(r1)/0.4323)*sin(2*3.1415926*r2));  }  if (current.chromosome[j]>variabletop[j])  {   current.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j];  }  if (current.chromosome[j]<variablebottom [j])  {   current.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j];  }  } } population.SetAt(population.FindIndex(i),current); }}void CMVSOGA::selectionoperator()  //從當前個體中按概率選擇新種群,應該加一個復制選擇,提高種群的平均適應度{ int i,j,pindex=0; double p,pc,sum; i=0; j=0; pindex=0; p=0; pc=0; sum=0.001; newpopulation.RemoveAll(); cfitness.RemoveAll(); //鏈表排序// population.SetAt (population.FindIndex(0),current); //多余代碼 for (i=1;i<popsize;i++) {  current=population.GetAt(population.FindIndex(i)); for(j=0;j<i;j++)  //從小到大用before排列。 {  current1=population.GetAt(population.FindIndex(j));//臨時借用變量  if(current.fitness<=current1.fitness)   {  population.InsertBefore(population.FindIndex(j),current);  population.RemoveAt(population.FindIndex(i+1));  break;  } }// m=population.GetCount(); } //鏈表排序 for(i=0;i<popsize;i++)//求適應度總值,以便歸一化,是已經排序好的鏈。 { current=population.GetAt(population.FindIndex(i)); //取出來的值出現問題. sum+=current.fitness; } for(i=0;i<popsize; i++)//歸一化 { current=population.GetAt(population.FindIndex(i)); //population 有值,為什么取出來的不正確呢?? current.fitness=current.fitness/sum; cfitness.InsertAfter (cfitness .FindIndex(i),current.fitness); }  for(i=1;i<popsize; i++)//概率值從小到大; { current.fitness=cfitness.GetAt (cfitness.FindIndex(i-1))  +cfitness.GetAt(cfitness.FindIndex(i));  //歸一化 cfitness.SetAt (cfitness .FindIndex(i),current.fitness); population.SetAt(population.FindIndex(i),current); } for (i=0;i<popsize;)//輪盤賭概率選擇。本段還有問題。 { p=double(rand()%999)/1000+0.0001; //隨機生成概率 pindex=0; //遍歷索引 pc=cfitness.GetAt(cfitness.FindIndex(1)); //為什么取不到數值???20060910 while(p>=pc&&pindex<popsize) //問題所在。 {  pc=cfitness.GetAt(cfitness .FindIndex(pindex));  pindex++; } //必須是從index~popsize,選擇高概率的數。即大于概率p的數應該被選擇,選擇不滿則進行下次選擇。 for (j=popsize-1;j<pindex&&i<popsize;j--) {  newpopulation.InsertAfter (newpopulation.FindIndex(0),  population.GetAt (population.FindIndex(j)));  i++; } } for(i=0;i<popsize; i++) { population.SetAt (population.FindIndex(i),  newpopulation.GetAt (newpopulation.FindIndex(i))); }// j=newpopulation.GetCount();// j=population.GetCount(); newpopulation.RemoveAll();} //current  變化后,以上沒有問題了。  void CMVSOGA:: crossoveroperator()  //非均勻算術線性交叉,浮點數適用,alpha ,beta是(0,1)之間的隨機數     //對種群中兩兩交叉的個體選擇也是隨機選擇的。也可取beta=1-alpha;     //current的變化會有一些改變。{ int i,j; double alpha,beta; CList <int,int> index; int point,temp; double p;// srand( (unsigned)time( NULL ) ); for (i=0;i<popsize;i++)//生成序號 { index.InsertAfter (index.FindIndex(i),i); } for (i=0;i<popsize;i++)//打亂序號 { point=rand()%(popsize-1); temp=index.GetAt(index.FindIndex(i)); index.SetAt(index.FindIndex(i),  index.GetAt(index.FindIndex(point)));  index.SetAt(index.FindIndex(point),temp); } for (i=0;i<popsize-1;i+=2) {//按順序序號,按序號選擇兩個母體進行交叉操作。 p=double(rand()%10000)/10000.0; if (p<crossoverrate) {    alpha=double(rand()%10000)/10000.0;  beta=double(rand()%10000)/10000.0;  current=population.GetAt(population.FindIndex(index.GetAt(index.FindIndex(i))));  current1=population.GetAt(population.FindIndex(index.GetAt(index.FindIndex(i+1))));//臨時使用current1代替  for(j=0;j<variablenum;j++)  {   //交叉  double sign;  sign=rand()%2;  if(sign)  {   current.chromosome[j]=(1-alpha)*current.chromosome[j]+   beta*current1.chromosome[j];  }  else  {   current.chromosome[j]=(1-alpha)*current.chromosome[j]-   beta*current1.chromosome[j];  }  if (current.chromosome[j]>variabletop[j]) //判斷是否超界.  {   current.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j];  }  if (current.chromosome[j]<variablebottom [j])  {   current.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j];  }  if(sign)  {   current1.chromosome[j]=alpha*current.chromosome[j]+   (1- beta)*current1.chromosome[j];  }  else  {   current1.chromosome[j]=alpha*current.chromosome[j]-   (1- beta)*current1.chromosome[j];  }  if (current1.chromosome[j]>variabletop[j])  {   current1.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j];  }  if (current1.chromosome[j]<variablebottom [j])  {   current1.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j];  }  }  //回代 } newpopulation.InsertAfter (newpopulation.FindIndex(i),current); newpopulation.InsertAfter (newpopulation.FindIndex(i),current1); } ASSERT(newpopulation.GetCount()==popsize); for (i=0;i<popsize;i++) { population.SetAt (population.FindIndex(i),  newpopulation.GetAt (newpopulation.FindIndex(i))); } newpopulation.RemoveAll(); index.RemoveAll();}void CMVSOGA:: findbestandworstindividual( ) { int i; bestindividual=population.GetAt(population.FindIndex(best_index)); worstindividual=population.GetAt(population.FindIndex(worst_index)); for (i=1;i<popsize; i++) { current=population.GetAt(population.FindIndex(i)); if (current.fitness>bestindividual.fitness) {  bestindividual=current;  best_index=i; } else if (current.fitness<worstindividual.fitness) {  worstindividual=current;  worst_index=i; } } population.SetAt(population.FindIndex(worst_index), population.GetAt(population.FindIndex(best_index))); //用最好的替代最差的。 if (maxgeneration==0) { currentbest=bestindividual; } else { if(bestindividual.fitness>=currentbest.fitness) {  currentbest=bestindividual; } }}void CMVSOGA:: calculatefitnessvalue() //適應度函數值計算,關鍵是適應度函數的設計     //current變化,這段程序變化較大,特別是排序。{ int i; double temp;//alpha,beta;//適應度函數的尺度變化系數 double cmax=100; for(i=0;i<popsize;i++) { current=population.GetAt(population.FindIndex(i)); if(current.value<cmax) {  temp=cmax-current.value; } else {  temp=0.0; } /* if((population[i].value+cmin)>0.0) {temp=cmin+population[i].value;} else {temp=0.0;  } */ current.fitness=temp; population.SetAt(population.FindIndex(i),current);  }}void CMVSOGA:: performevolution() //演示評價結果,有冗余代碼,current變化,程序應該改變較大{ if (bestindividual.fitness>currentbest.fitness) { currentbest=population.GetAt(population.FindIndex(best_index)); } else { population.SetAt(population.FindIndex(worst_index),currentbest); }}void CMVSOGA::GetResult(double *Result){ int i; for (i=0;i<variablenum;i++) { Result[i]=currentbest.chromosome[i]; } Result[i]=currentbest.value;} void CMVSOGA::GetPopData(CList <double,double>&PopData) { PopData.RemoveAll(); int i,j; for (i=0;i<popsize;i++) { current=population.GetAt(population.FindIndex(i)); for (j=0;j<variablenum;j++) {  PopData.AddTail(current.chromosome[j]); } }}void CMVSOGA::SetFitnessData(CList <double,double>&PopData,CList <double,double>&FitnessData,CList <double,double>&ValueData){ int i,j; for (i=0;i<popsize;i++) {  current=population.GetAt(population.FindIndex(i)); //就因為這一句,出現了很大的問題。  for (j=0;j<variablenum;j++) {  current.chromosome[j]=PopData.GetAt(PopData.FindIndex(i*variablenum+j)); } current.fitness=FitnessData.GetAt(FitnessData.FindIndex(i)); current.value=ValueData.GetAt(ValueData.FindIndex(i)); population.SetAt(population.FindIndex(i),current); } FitnessData.RemoveAll(); PopData.RemoveAll(); ValueData.RemoveAll();} # re: C++遺傳算法源程序/********************************************************************Filename: aiWorld.hPurpose: 遺傳算法,花朵演化。Id:Copyright:Licence:*********************************************************************/#ifndef AIWORLD_H_#define AIWORLD_H_ #include <iostream>#include <ctime>#include <cstdlib>#include <cmath> #define kMaxFlowers 10 using std::cout;using std::endl; class ai_World{public:ai_World(){srand(time(0));}~ai_World() {} int temperature[kMaxFlowers]; //溫度int water[kMaxFlowers]; //水質int sunlight[kMaxFlowers]; //陽光int nutrient[kMaxFlowers]; //養分int beneficialInsect[kMaxFlowers]; //益蟲int harmfulInsect[kMaxFlowers]; //害蟲 int currentTemperature;int currentWater;int currentSunlight;int currentNutrient;int currentBeneficialInsect;int currentHarmfulInsect; /**第一代花朵*/void Encode(); /**花朵適合函數*/int Fitness(int flower); /**花朵演化*/void Evolve(); /**返回區間[start, end]的隨機數*/inline int tb_Rnd(int start, int end){if (start > end)return 0;else{//srand(time(0));return (rand() % (end + 1) + start);}} /**顯示數值*/void show();};// ----------------------------------------------------------------- //void ai_World::Encode()// ----------------------------------------------------------------- // {int i; for (i=0;i<kMaxFlowers;i++){temperature[i]=tb_Rnd(1,75);water[i]=tb_Rnd(1,75);sunlight[i]=tb_Rnd(1,75);nutrient[i]=tb_Rnd(1,75);beneficialInsect[i]=tb_Rnd(1,75);harmfulInsect[i]=tb_Rnd(1,75);} currentTemperature=tb_Rnd(1,75);currentWater=tb_Rnd(1,75);currentSunlight=tb_Rnd(1,75);currentNutrient=tb_Rnd(1,75);currentBeneficialInsect=tb_Rnd(1,75);currentHarmfulInsect=tb_Rnd(1,75); currentTemperature=tb_Rnd(1,75);currentWater=tb_Rnd(1,75);currentSunlight=tb_Rnd(1,75);currentNutrient=tb_Rnd(1,75);currentBeneficialInsect=tb_Rnd(1,75);currentHarmfulInsect=tb_Rnd(1,75); }// ----------------------------------------------------------------- //int ai_World::Fitness(int flower)// ----------------------------------------------------------------- // {int theFitness;  theFitness=abs(temperature[flower]-currentTemperature);theFitness=theFitness+abs(water[flower]-currentWater);theFitness=theFitness+abs(sunlight[flower]-currentSunlight);theFitness=theFitness+abs(nutrient[flower]-currentNutrient);theFitness=theFitness+abs(beneficialInsect[flower]-currentBeneficialInsect);theFitness=theFitness+abs(harmfulInsect[flower]-currentHarmfulInsect); return (theFitness); }// ----------------------------------------------------------------- //void ai_World::Evolve()// ----------------------------------------------------------------- // {int fitTemperature[kMaxFlowers];int fitWater[kMaxFlowers];int fitSunlight[kMaxFlowers];int fitNutrient[kMaxFlowers];int fitBeneficialInsect[kMaxFlowers];int fitHarmfulInsect[kMaxFlowers];int fitness[kMaxFlowers];int i;int leastFit=0;int leastFitIndex; for (i=0;i<kMaxFlowers;i++)if (Fitness(i)>leastFit){leastFit=Fitness(i);leastFitIndex=i;} temperature[leastFitIndex]=temperature[tb_Rnd(0,kMaxFlowers - 1)];water[leastFitIndex]=water[tb_Rnd(0,kMaxFlowers - 1)];sunlight[leastFitIndex]=sunlight[tb_Rnd(0,kMaxFlowers - 1)];nutrient[leastFitIndex]=nutrient[tb_Rnd(0,kMaxFlowers - 1)];beneficialInsect[leastFitIndex]=beneficialInsect[tb_Rnd(0,kMaxFlowers - 1)];harmfulInsect[leastFitIndex]=harmfulInsect[tb_Rnd(0,kMaxFlowers - 1)]; for (i=0;i<kMaxFlowers;i++){fitTemperature[i]=temperature[tb_Rnd(0,kMaxFlowers - 1)];fitWater[i]=water[tb_Rnd(0,kMaxFlowers - 1)];fitSunlight[i]=sunlight[tb_Rnd(0,kMaxFlowers - 1)];fitNutrient[i]=nutrient[tb_Rnd(0,kMaxFlowers - 1)];fitBeneficialInsect[i]=beneficialInsect[tb_Rnd(0,kMaxFlowers - 1)];fitHarmfulInsect[i]=harmfulInsect[tb_Rnd(0,kMaxFlowers - 1)];} for (i=0;i<kMaxFlowers;i++){temperature[i]=fitTemperature[i];water[i]=fitWater[i];sunlight[i]=fitSunlight[i];nutrient[i]=fitNutrient[i];beneficialInsect[i]=fitBeneficialInsect[i];harmfulInsect[i]=fitHarmfulInsect[i];} for (i=0;i<kMaxFlowers;i++){if (tb_Rnd(1,100)==1)temperature[i]=tb_Rnd(1,75);if (tb_Rnd(1,100)==1)water[i]=tb_Rnd(1,75);if (tb_Rnd(1,100)==1)sunlight[i]=tb_Rnd(1,75);if (tb_Rnd(1,100)==1)nutrient[i]=tb_Rnd(1,75);if (tb_Rnd(1,100)==1)beneficialInsect[i]=tb_Rnd(1,75);if (tb_Rnd(1,100)==1)harmfulInsect[i]=tb_Rnd(1,75);} }void ai_World::show(){// cout << "/t temperature water sunlight nutrient beneficialInsect harmfulInsect/n";cout << "current/t " << currentTemperature << "/t " << currentWater << "/t ";cout << currentSunlight << "/t " << currentNutrient << "/t ";cout << currentBeneficialInsect << "/t " << currentHarmfulInsect << "/n";for (int i=0;i<kMaxFlowers;i++){cout << "Flower " << i << ": ";cout << temperature[i] << "/t ";cout << water[i] << "/t ";cout << sunlight[i] << "/t ";cout << nutrient[i] << "/t ";cout << beneficialInsect[i] << "/t ";cout << harmfulInsect[i] << "/t ";cout << endl;}}#endif // AIWORLD_H_ //test.cpp#include <iostream>#include "ai_World.h" using namespace std; int main(){ai_World a;a.Encode();// a.show();for (int i = 0; i < 10; i++){cout << "Generation " << i << endl;a.Evolve();a.show();} system("PAUSE");return 0;}

希望本文所述對大家的C++程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品欧美日韩久久| 国产精品自拍偷拍视频| 久久九九有精品国产23| 欧美性猛交丰臀xxxxx网站| 精品国产一区久久久| 日韩精品丝袜在线| 色悠悠国产精品| 欧美极品少妇与黑人| 亚洲一区二区久久久久久久| 久久精品2019中文字幕| 91免费看国产| 91地址最新发布| 欧美一级bbbbb性bbbb喷潮片| 日韩中文视频免费在线观看| 精品亚洲永久免费精品| 91视频国产一区| 精品久久久久久久久久久久久久| 亚洲人成啪啪网站| 精品久久久久久| 这里只有精品久久| 91免费看片网站| 欧美成人精品一区二区| 亚洲视频在线免费看| 欧美视频在线观看 亚洲欧| 亚洲肉体裸体xxxx137| 日本欧美黄网站| 国产91色在线播放| 91精品国产综合久久香蕉最新版| 欧美性xxxx在线播放| 亚洲色图五月天| 亚洲午夜久久久久久久| 久久久成人精品视频| 亚洲香蕉成人av网站在线观看| 国产成人亚洲综合91| 日韩国产欧美区| 亚洲bt天天射| 欧美电影免费看| 久久久精品亚洲| 国产精品久久久久久超碰| 最新国产成人av网站网址麻豆| 国产成人av网址| 国产91精品久久久| 国产热re99久久6国产精品| 欧美中文字幕在线观看| 日韩欧美在线看| 国产一区二区色| 欧美乱人伦中文字幕在线| 欧美性猛交xxxx乱大交蜜桃| 国产aaa精品| 国产精品av网站| www.日韩.com| 国内久久久精品| 国产欧美一区二区三区在线看| 亚洲日本欧美日韩高观看| 亚洲人免费视频| 人体精品一二三区| 日韩hd视频在线观看| 久久久久久久香蕉网| 国产精品免费久久久久久| 欧美一性一乱一交一视频| 日韩精品丝袜在线| 久久天天躁狠狠躁夜夜躁| 成人网在线免费观看| 国产精品福利在线观看网址| 日本韩国欧美精品大片卡二| 中文字幕最新精品| 亚洲国产中文字幕在线观看| 亚洲精品资源美女情侣酒店| 啪一啪鲁一鲁2019在线视频| 欧美性xxxxxxxxx| 日韩中文字幕欧美| 中文字幕在线成人| 91国产精品视频在线| 日韩综合视频在线观看| 亚洲一区久久久| 国产小视频国产精品| 最近中文字幕2019免费| 日韩美女视频免费在线观看| 亚洲福利在线视频| 永久免费看mv网站入口亚洲| 国产剧情久久久久久| 精品久久久久久久久久久久| 国产精品美女网站| 国产精品中文在线| 中国人与牲禽动交精品| 在线观看国产欧美| 亚洲欧美自拍一区| 亚洲a在线观看| 亚洲欧美日韩在线一区| 欧美性色视频在线| 欧美午夜丰满在线18影院| 亚洲精品白浆高清久久久久久| 亚洲成人在线网| 日韩欧美精品在线观看| 成人午夜黄色影院| 午夜精品久久17c| 日韩精品在线观看一区| 日韩精品在线视频| 欧美性开放视频| 欧美区在线播放| 午夜精品久久久久久久男人的天堂| 亚洲激情久久久| 精品成人乱色一区二区| 亚洲成在人线av| 清纯唯美亚洲激情| 国产一区二中文字幕在线看| 久久99视频免费| 色综合伊人色综合网站| 欧美有码在线视频| 欧美一区三区三区高中清蜜桃| 亚洲欧洲高清在线| 欧美成人精品在线播放| 国内伊人久久久久久网站视频| 黑人巨大精品欧美一区免费视频| 91在线视频九色| 一道本无吗dⅴd在线播放一区| 国产欧美日韩亚洲精品| 亚洲一区二区三区乱码aⅴ蜜桃女| 成人激情视频网| 岛国精品视频在线播放| 91精品国产91久久久久久吃药| 国产成人精品电影| 91po在线观看91精品国产性色| 日韩影视在线观看| 丰满岳妇乱一区二区三区| 亚洲精品电影网站| 亚洲国产91精品在线观看| 91国内揄拍国内精品对白| 国产欧美中文字幕| 欧美日韩国产中字| 久久精品久久精品亚洲人| 欧美激情视频免费观看| 欧美性20hd另类| 国产一区二区日韩| 青青草原一区二区| 高清欧美性猛交xxxx| 国产精品色婷婷视频| 国产成人拍精品视频午夜网站| 欧美视频裸体精品| 国产成人精品999| 国产亚洲精品综合一区91| 欧美成人午夜视频| 国产日韩专区在线| 久久久av免费| 久久久久九九九九| 国产精品久久久久久久久久东京| 日韩成人在线免费观看| 精品视频在线导航| 在线视频欧美日韩| 狠狠色香婷婷久久亚洲精品| 久久香蕉国产线看观看av| 亚洲国产成人一区| 在线免费看av不卡| 欧美高跟鞋交xxxxxhd| 欧美日韩成人免费| 国产精品成人va在线观看| 国产精品啪视频| 国产精品吹潮在线观看| 国产精品成人v| 91高潮在线观看| 国产伦精品一区二区三区精品视频| 国产91色在线免费| 一区二区三区精品99久久| 欧美一区二区三区精品电影|