📄 ccontroller.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 NumObjectVerts = 42;
const SPoint objects[NumObjectVerts] = {SPoint(80, 60),
SPoint(200,60),
SPoint(200,60),
SPoint(200,100),
SPoint(200,100),
SPoint(160,100),
SPoint(160,100),
SPoint(160,200),
SPoint(160,200),
SPoint(80,200),
SPoint(80,200),
SPoint(80,60),
SPoint(250,100),
SPoint(300,40),
SPoint(300,40),
SPoint(350,100),
SPoint(350,100),
SPoint(250, 100),
SPoint(220,180),
SPoint(320,180),
SPoint(320,180),
SPoint(320,300),
SPoint(320,300),
SPoint(220,300),
SPoint(220,300),
SPoint(220,180),
SPoint(12,15),
SPoint(380, 15),
SPoint(380,15),
SPoint(380,360),
SPoint(380,360),
SPoint(12,360),
SPoint(12,360),
SPoint(12,340),
SPoint(12,340),
SPoint(100,290),
SPoint(100,290),
SPoint(12,240),
SPoint(12,240),
SPoint(12,15)};
//---------------------------------------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_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();
//calculate the neuron placement in the weight vector
vector<int> SplitPoints = m_vecSweepers[0].CalculateSplitPoints();
//initialize the Genetic Algorithm class
m_pGA = new CGenAlg(m_NumSweepers,
CParams::dMutationRate,
CParams::dCrossoverRate,
m_NumWeightsInNN,
SplitPoints);
//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);
}
//create the pens 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, 255, 0));
m_GreyPenDotted = CreatePen(PS_DOT, 1, RGB(200, 200, 200));
m_RedPenDotted = CreatePen(PS_DOT, 1, RGB(250, 200, 200));
m_OldPen = NULL;
//and the brushes
m_BlueBrush = CreateSolidBrush(RGB(0,0,244));
m_RedBrush = CreateSolidBrush(RGB(150,0,0));
//fill the vertex buffers
for (i=0; i<NumSweeperVerts; ++i)
{
m_SweeperVB.push_back(sweeper[i]);
}
for (i=0; i<NumObjectVerts; ++i)
{
m_ObjectsVB.push_back(objects[i]);
}
}
//--------------------------------------destructor-------------------------------------
//
//--------------------------------------------------------------------------------------
CController::~CController()
{
if(m_pGA)
{
delete m_pGA;
}
DeleteObject(m_BluePen);
DeleteObject(m_RedPen);
DeleteObject(m_GreenPen);
DeleteObject(m_OldPen);
DeleteObject(m_GreyPenDotted);
DeleteObject(m_RedPenDotted);
DeleteObject(m_BlueBrush);
DeleteObject(m_RedBrush);
}
//---------------------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,
double rotation,
double scale)
{
//create the world transformation matrix
C2DMatrix matTransform;
//scale
matTransform.Scale(scale, scale);
//rotate
matTransform.Rotate(rotation);
//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_ObjectsVB))
{
//error in processing the neural net
MessageBox(m_hwndMain, "Wrong amount of NN inputs!", "Error", MB_OK);
return false;
}
}
}
//**We have completed another generation.
//Time to run the GA and update the sweepers with their new NNs
else
{
int BestCellCoverage = 0;
for (int swp=0; swp<m_vecSweepers.size(); ++swp)
{
//add up all the penalties and calculate a fitness score
m_vecSweepers[swp].EndOfRunCalculations();
//update the fitness score stored in the GA with this score
m_vecThePopulation[swp].dFitness = m_vecSweepers[swp].Fitness();
if (m_vecSweepers[swp].NumCellsVisited() > BestCellCoverage)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -