亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ccontroller.cpp

?? 人工神經網絡實現的掃雷機程序,用遺傳算法進化網絡的權重效果很好
?? CPP
字號:
#include "CController.h"


//these hold the geometry of the sweepers and the mines
const int	 NumSweeperVerts = 16;
const SPoint sweeper[NumSweeperVerts] = {SPoint(-1, -1),
                                         SPoint(-1, 1),
                                         SPoint(-0.5, 1),
                                         SPoint(-0.5, -1),

                                         SPoint(0.5, -1),
                                         SPoint(1, -1),
                                         SPoint(1, 1),
                                         SPoint(0.5, 1),
                                         
                                         SPoint(-0.5, -0.5),
                                         SPoint(0.5, -0.5),

                                         SPoint(-0.5, 0.5),
                                         SPoint(-0.25, 0.5),
                                         SPoint(-0.25, 1.75),
                                         SPoint(0.25, 1.75),
                                         SPoint(0.25, 0.5),
                                         SPoint(0.5, 0.5)};



const int NumMineVerts = 4;
const SPoint mine[NumMineVerts] = {SPoint(-1, -1),
                                   SPoint(-1, 1),
                                   SPoint(1, 1),
                                   SPoint(1, -1)};



//---------------------------------------constructor---------------------
//
//	initilaize the sweepers, their brains and the GA factory
//
//-----------------------------------------------------------------------
CController::CController(HWND hwndMain): m_NumSweepers(CParams::iNumSweepers), 
										                     m_pGA(NULL),
										                     m_bFastRender(false),
										                     m_iTicks(0),
										                     m_NumMines(CParams::iNumMines),
										                     m_hwndMain(hwndMain),
										                     m_iGenerations(0),
                                         cxClient(CParams::WindowWidth),
                                         cyClient(CParams::WindowHeight)
{
	//let's create the mine sweepers
	for (int i=0; i<m_NumSweepers; ++i)
	{
		m_vecSweepers.push_back(CMinesweeper());
	}

	//get the total number of weights used in the sweepers
	//NN so we can initialise the GA
	m_NumWeightsInNN = m_vecSweepers[0].GetNumberOfWeights();

	//initialize the Genetic Algorithm class
	m_pGA = new CGenAlg(m_NumSweepers,
                      CParams::dMutationRate,
	                    CParams::dCrossoverRate,
	                    m_NumWeightsInNN);

	//Get the weights from the GA and insert into the sweepers brains
	m_vecThePopulation = m_pGA->GetChromos();

	for (i=0; i<m_NumSweepers; i++)
	
		m_vecSweepers[i].PutWeights(m_vecThePopulation[i].vecWeights);

	//initialize mines in random positions within the application window
	for (i=0; i<m_NumMines; ++i)
	{
		m_vecMines.push_back(SVector2D(RandFloat() * cxClient,
                                   RandFloat() * cyClient));
	}

	//create a pen for the graph drawing
	m_BluePen  = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
	m_RedPen   = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
	m_GreenPen = CreatePen(PS_SOLID, 1, RGB(0, 150, 0));

	m_OldPen	= NULL;

	//fill the vertex buffers
	for (i=0; i<NumSweeperVerts; ++i)
	{
		m_SweeperVB.push_back(sweeper[i]);
	}

	for (i=0; i<NumMineVerts; ++i)
	{
		m_MineVB.push_back(mine[i]);
	}

}


//--------------------------------------destructor-------------------------------------
//
//--------------------------------------------------------------------------------------
CController::~CController()
{
	if(m_pGA)
  {
    delete		m_pGA;
  }

	DeleteObject(m_BluePen);
	DeleteObject(m_RedPen);
	DeleteObject(m_GreenPen);
	DeleteObject(m_OldPen);
}


//---------------------WorldTransform--------------------------------
//
//	sets up the translation matrices for the mines and applies the
//	world transform to each vertex in the vertex buffer passed to this
//	method.
//-------------------------------------------------------------------
void CController::WorldTransform(vector<SPoint> &VBuffer, SVector2D vPos)
{
	//create the world transformation matrix
	C2DMatrix matTransform;
	
	//scale
	matTransform.Scale(CParams::dMineScale, CParams::dMineScale);
	
	//translate
	matTransform.Translate(vPos.x, vPos.y);

	//transform the ships vertices
	matTransform.TransformSPoints(VBuffer);
}


//-------------------------------------Update-----------------------------
//
//	This is the main workhorse. The entire simulation is controlled from here.
//
//	The comments should explain what is going on adequately.
//-------------------------------------------------------------------------
bool CController::Update()
{
	//run the sweepers through CParams::iNumTicks amount of cycles. During
  //this loop each sweepers NN is constantly updated with the appropriate
  //information from its surroundings. The output from the NN is obtained
  //and the sweeper is moved. If it encounters a mine its fitness is
  //updated appropriately,
	if (m_iTicks++ < CParams::iNumTicks)
	{
		for (int i=0; i<m_NumSweepers; ++i)
		{
			//update the NN and position
			if (!m_vecSweepers[i].Update(m_vecSweepers,i))
			{
				//error in processing the neural net
				MessageBox(m_hwndMain, "Wrong amount of NN inputs!", "Error", MB_OK);

				return false;
			}
				
			//see if it's found a mine
     // int GrabHit = m_vecSweepers[i].CheckForMine(m_vecMines,
                                     //             CParams::dMineScale);
//
	//		if (GrabHit >= 0)
    //  {
        //we have discovered a mine so increase fitness
    //    m_vecSweepers[i].IncrementFitness();

        //mine found so replace the mine with another at a random 
			  //position
		//	  m_vecMines[GrabHit] = SVector2D(RandFloat() * cxClient,
      //                                  RandFloat() * cyClient);
     // }/
			int GrabHit=m_vecSweepers[i].Check(m_vecSweepers);
			if(GrabHit)
			{m_vecSweepers[i].IncrementFitness();}
			//update the chromos fitness score
			m_vecThePopulation[i].dFitness = m_vecSweepers[i].Fitness();

		}
	}

	//Another generation has been completed.
  
	//Time to run the GA and update the sweepers with their new NNs
	else
	{
		//update the stats to be used in our stat window
		m_vecAvFitness.push_back(m_pGA->AverageFitness());
		m_vecBestFitness.push_back(m_pGA->BestFitness());

		//increment the generation counter
		++m_iGenerations;

		//reset cycles
		m_iTicks = 0;

		//run the GA to create a new population
		m_vecThePopulation = m_pGA->Epoch(m_vecThePopulation);
			
		//insert the new (hopefully)improved brains back into the sweepers
    //and reset their positions etc
    for (int i=0; i<m_NumSweepers; ++i)
		{
			m_vecSweepers[i].PutWeights(m_vecThePopulation[i].vecWeights);
		
			m_vecSweepers[i].Reset();
		}
	}

	return true;
}
//------------------------------------Render()--------------------------------------
//
//----------------------------------------------------------------------------------
void CController::Render(HDC surface)
{
	//render the stats
	string s = "Generation:          " + itos(m_iGenerations);
	TextOut(surface, 5, 0, s.c_str(), s.size());

	//do not render if running at accelerated speed
	if (!m_bFastRender)
	{
		//keep a record of the old pen
     m_OldPen = (HPEN)SelectObject(surface, m_GreenPen);

    //render the mines
		for (int i=0; i<m_NumMines; ++i)
		{
			//grab the vertices for the mine shape
			vector<SPoint> mineVB = m_MineVB;

			WorldTransform(mineVB, m_vecMines[i]);

			//draw the mines
			MoveToEx(surface, (int)mineVB[0].x, (int)mineVB[0].y, NULL);

			for (int vert=1; vert<mineVB.size(); ++vert)
			{
				LineTo(surface, (int)mineVB[vert].x, (int)mineVB[vert].y);
			}

			LineTo(surface, (int)mineVB[0].x, (int)mineVB[0].y);
			
		}
       		
    //we want the fittest displayed in red
    SelectObject(surface, m_RedPen);

		//render the sweepers
		for (i=0; i<m_NumSweepers; i++)
		{
			if (i == CParams::iNumElite)
      {
        SelectObject(surface, m_OldPen);
      }
      
      //grab the sweeper vertices
			vector<SPoint> sweeperVB = m_SweeperVB;

			//transform the vertex buffer
			m_vecSweepers[i].WorldTransform(sweeperVB);

			//draw the sweeper left track
			MoveToEx(surface, (int)sweeperVB[0].x, (int)sweeperVB[0].y, NULL);

			for (int vert=1; vert<4; ++vert)
			{
				LineTo(surface, (int)sweeperVB[vert].x, (int)sweeperVB[vert].y);
			}

      LineTo(surface, (int)sweeperVB[0].x, (int)sweeperVB[0].y);

      //draw the sweeper right track
			MoveToEx(surface, (int)sweeperVB[4].x, (int)sweeperVB[4].y, NULL);

			for (vert=5; vert<8; ++vert)
			{
				LineTo(surface, (int)sweeperVB[vert].x, (int)sweeperVB[vert].y);
			}

      LineTo(surface, (int)sweeperVB[4].x, (int)sweeperVB[4].y);

      MoveToEx(surface, (int)sweeperVB[8].x, (int)sweeperVB[8].y, NULL);
      LineTo(surface, (int)sweeperVB[9].x, (int)sweeperVB[9].y);

      MoveToEx(surface, (int)sweeperVB[10].x, (int)sweeperVB[10].y, NULL);

      for (vert=11; vert<16; ++vert)
			{
				LineTo(surface, (int)sweeperVB[vert].x, (int)sweeperVB[vert].y);
			}

		}

    //put the old pen back
    SelectObject(surface, m_OldPen);

	}//end if

  else
  {
    PlotStats(surface);
  }

}
//--------------------------PlotStats-------------------------------------
//
//  Given a surface to draw on this function displays stats and a crude
//  graph showing best and average fitness
//------------------------------------------------------------------------
void CController::PlotStats(HDC surface)
{
    string s = "Best Fitness:       " + ftos(m_pGA->BestFitness());
	  TextOut(surface, 5, 20, s.c_str(), s.size());

     s = "Average Fitness: " + ftos(m_pGA->AverageFitness());
	  TextOut(surface, 5, 40, s.c_str(), s.size());
    
    //render the graph
    float HSlice = (float)cxClient/(m_iGenerations+1);
    float VSlice = (float)cyClient/((m_pGA->BestFitness()+1)*2);

    //plot the graph for the best fitness
    float x = 0;
    
    m_OldPen = (HPEN)SelectObject(surface, m_RedPen);

    MoveToEx(surface, 0, cyClient, NULL);
    
    for (int i=0; i<m_vecBestFitness.size(); ++i)
    {
       LineTo(surface, x, cyClient - VSlice*m_vecBestFitness[i]);

       x += HSlice;
    }

    //plot the graph for the average fitness
    x = 0;

    SelectObject(surface, m_BluePen);

    MoveToEx(surface, 0, cyClient, NULL);
    
    for (i=0; i<m_vecAvFitness.size(); ++i)
    {
       LineTo(surface, (int)x, (int)(cyClient - VSlice*m_vecAvFitness[i]));

       x += HSlice;
    }

    //replace the old pen
    SelectObject(surface, m_OldPen);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
老司机免费视频一区二区| 欧美色图天堂网| 欧洲日韩一区二区三区| 26uuu精品一区二区三区四区在线| 日本一区二区三区国色天香 | 性做久久久久久免费观看欧美| 久久狠狠亚洲综合| 欧美三级日韩三级| 国产精品情趣视频| 国产在线播放一区| 欧美麻豆精品久久久久久| 亚洲人成网站色在线观看| 国产精品一区二区在线观看网站| 91超碰这里只有精品国产| 亚洲一区二区三区自拍| 99久久综合精品| 国产精品免费久久久久| 国产成人无遮挡在线视频| 欧美一区二区在线播放| 日韩精品色哟哟| 欧美丰满美乳xxx高潮www| 亚洲另类在线视频| 99国产精品国产精品毛片| 亚洲国产精品成人综合| 国产呦萝稀缺另类资源| 精品国产一区二区三区四区四| 日本不卡中文字幕| 91精品国产综合久久精品| 午夜精品成人在线视频| 欧美日韩久久一区二区| 亚洲国产一区二区三区青草影视| 欧美在线一二三四区| 亚洲色图在线播放| 色噜噜狠狠色综合中国| 一区二区三区在线观看动漫| 色婷婷综合久久久久中文一区二区 | 欧美日韩成人综合天天影院| 亚洲激情欧美激情| 欧美一区二区视频免费观看| 青青草视频一区| 日韩网站在线看片你懂的| 久久精品国产亚洲aⅴ| 精品久久99ma| 成人午夜视频福利| 亚洲美女免费视频| 欧美精品乱码久久久久久按摩| 日韩vs国产vs欧美| 久久久久久99久久久精品网站| 国产aⅴ综合色| 亚洲精品免费在线播放| 欧美理论电影在线| 国产毛片精品一区| 亚洲人成在线观看一区二区| 欧美中文字幕不卡| 国模娜娜一区二区三区| 国产精品久久久久久久久免费相片 | 91黄色小视频| 日本免费新一区视频| 久久午夜国产精品| 色综合久久久网| 六月丁香综合在线视频| 国产精品系列在线| 欧美视频中文一区二区三区在线观看 | 毛片av一区二区| 国产农村妇女精品| 欧美日韩一区二区三区四区| 激情久久五月天| 亚洲日韩欧美一区二区在线| 5858s免费视频成人| 成人综合在线观看| 日日夜夜免费精品| 国产精品午夜在线| 日韩欧美一二三四区| 92国产精品观看| 久久国产乱子精品免费女| 亚洲人123区| 久久久99精品久久| 欧美日韩国产在线观看| 成人app软件下载大全免费| 日日夜夜精品视频天天综合网| 国产精品网站一区| 日韩美女在线视频| 欧美日韩你懂得| 色综合久久久网| 懂色av中文一区二区三区| 五月天中文字幕一区二区| 国产精品女主播在线观看| 91精品国产入口| 欧美综合视频在线观看| 国产.欧美.日韩| 开心九九激情九九欧美日韩精美视频电影 | 欧美精品 日韩| 91美女视频网站| 成人久久18免费网站麻豆| 久草精品在线观看| 天堂午夜影视日韩欧美一区二区| 成人欧美一区二区三区在线播放| 26uuu久久综合| 欧美一卡二卡在线观看| 欧美日韩精品系列| 欧美午夜电影网| 91小视频免费看| 成人黄色软件下载| 成人小视频在线| 国产真实乱子伦精品视频| 日本大胆欧美人术艺术动态| 亚洲第一成年网| 亚洲一区二区三区爽爽爽爽爽| 中文字幕av一区二区三区高| 久久久亚洲高清| 久久久蜜臀国产一区二区| 久久先锋影音av鲁色资源网| 欧美成人video| 精品国产乱码久久久久久1区2区| 欧美疯狂性受xxxxx喷水图片| 欧美日韩免费一区二区三区视频| 精品视频123区在线观看| 欧美日韩一区二区三区在线看 | 国产精品久久久久久福利一牛影视| 久久午夜国产精品| 久久久久久电影| 中文字幕欧美三区| 亚洲人妖av一区二区| 一区二区欧美视频| 日韩精品欧美精品| 久久国产精品色婷婷| 国产久卡久卡久卡久卡视频精品| 国产精品一区二区视频| 丁香六月综合激情| 91九色最新地址| 91精品国产综合久久福利软件 | 国产拍欧美日韩视频二区| 国产精品国产三级国产有无不卡 | 日韩免费观看高清完整版| 亚洲精品一区二区三区精华液 | 91精品国产色综合久久ai换脸| 欧美一三区三区四区免费在线看| 亚洲精品一线二线三线| 亚洲丝袜美腿综合| 五月婷婷综合在线| 国产精品亚洲综合一区在线观看| 99re这里只有精品视频首页| 欧美网站一区二区| 久久综合九色综合欧美亚洲| 国产精品美女久久福利网站| 亚洲一区在线视频观看| 久久精品国产一区二区三区免费看| 国产精品一线二线三线精华| 色播五月激情综合网| 91麻豆精品国产91久久久资源速度 | 欧美国产精品一区二区| 亚洲国产美女搞黄色| 国产又黄又大久久| 欧美无砖专区一中文字| 久久精品在线免费观看| 亚洲国产精品一区二区久久 | 久久蜜桃av一区精品变态类天堂| 亚洲久草在线视频| 激情文学综合网| 精品国产电影一区二区| 亚洲欧美福利一区二区| 黑人精品欧美一区二区蜜桃| 色国产精品一区在线观看| 精品精品国产高清a毛片牛牛| 亚洲男人的天堂网| 国产精品主播直播| 欧美一区二区在线观看| 一区二区免费在线播放| 丰满亚洲少妇av| 精品少妇一区二区三区在线视频| 一区二区三区在线影院| 国产成人精品午夜视频免费| 91精品欧美久久久久久动漫| 亚洲人成网站色在线观看| 国产裸体歌舞团一区二区| 欧美精品乱码久久久久久| 亚洲伦在线观看| 丁香啪啪综合成人亚洲小说| 精品国产乱子伦一区| 免费在线观看不卡| 欧美精品自拍偷拍| 一区二区三区不卡视频| 成人动漫中文字幕| 久久久久99精品国产片| 久88久久88久久久| 欧美电影在线免费观看| 一区二区三区欧美日| 99久久免费视频.com| 国产精品免费av| 高清不卡一区二区| 久久综合九色综合欧美就去吻 | 亚洲成av人片在www色猫咪| 成人av在线看| 日本一区二区三区视频视频| 国产乱一区二区| 日韩精品一区二区三区视频播放 | 91福利在线观看| 亚洲欧洲制服丝袜| 91麻豆蜜桃一区二区三区| 综合久久给合久久狠狠狠97色|