⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 about the basic GA in the VC++ using GPU to
💻 CPP
📖 第 1 页 / 共 3 页
字号:

	LPD3DXBUFFER    pBuffer = NULL;
	BYTE            *pbyBits = NULL;

	int texElemCount = w*h*4;
	float *texData = new float[texElemCount];
	D3DLOCKED_RECT rfTextureLock;

	LPDIRECT3DSURFACE9 pSurf, pVectorTextureSurface;
	PDIRECT3DTEXTURE9  pTex;

	g_pD3DDevice->CreateTexture(h,w,0, NULL, D3DFMT_A32B32G32R32F, D3DPOOL_SYSTEMMEM, &pTex, NULL);
	pTex->GetSurfaceLevel(0,&pSurf);
	pColorMap->GetSurfaceLevel(0,&pVectorTextureSurface);	
	g_pD3DDevice->GetRenderTargetData(pVectorTextureSurface, pSurf);	
	pTex->LockRect(0, &rfTextureLock, NULL, D3DLOCK_READONLY);	// lock whole region in the vector texture
	float* pfTexture = (float*)rfTextureLock.pBits;
	memcpy(texData,pfTexture,texElemCount*sizeof(float));
	pTex->UnlockRect(0);	
	
	for(int i = 0 ; i < 4 ; i++ )	
		data[i] = texData[i]; 
		
	
	delete texData;

	SafeRelease(pSurf);
	SafeRelease(pTex);
	SafeRelease(pVectorTextureSurface);
	SafeRelease( pBuffer );

}


bool RenderResult(LPDIRECT3DSURFACE9 &pSurface,int i,LPDIRECT3DVERTEXBUFFER9 &pBuffer,char * strTechName)
{
		
	UINT            nPasses;
	if(g_pD3DDevice->SetRenderTarget(0,pSurface)!= D3D_OK )		
		MessageBox(NULL,"Failed!","Info",IDOK);
	g_pD3DDevice->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 0);
	g_pD3DDevice->BeginScene(); 
	g_pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
	g_pD3DDevice->SetStreamSource(0, pBuffer,0, sizeof(CUSTOMVERTEX));
	D3DXHANDLE hTechnique = g_pEffect->GetTechniqueByName( strTechName );
	g_pEffect->SetTechnique( hTechnique );
	g_pEffect->SetTexture("ColorMapBestGene", g_pBestGene[i]);
	g_pEffect->Begin( &nPasses, 0 );
	g_pEffect->BeginPass(0);
	g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
	g_pEffect->EndPass();
	g_pEffect->End();
	g_pD3DDevice->EndScene(); 
	
	return true;

}


bool RenderResult()
{
	float resultData[DIM];
	float fit[4];
	for(int i = 0 ; i < DIM / 4 ; i++ )
	{
		RenderResult(g_pResultSurface[i],i,g_pBestBuffer,"TShader_ResultGene");
		SaveResultTexture(resultData + i * 4,1,1,g_pResultTexture[i]);
	}
	SaveResultTexture(fit,1,1,g_pResultBestFitTexture);

	FILE* flog = fopen("C:\\result.txt","a++");
	if(FUCTION == FUCTION_1)
		fprintf(flog,"测试函数:函数(1)\n");
	else
		fprintf(flog,"测试函数:函数(2)\n");
	fprintf(flog,"种群大小:	%d,		实际种群大小:%d,	维数%d\n",g_nPopSize, g_nHeight * g_nWidth,DIM);
	fprintf(flog,"迭代次数:	%d		编码长度:	%d\n",g_nGeneration,g_nLChrom);
	fprintf(flog,"交叉率:		%0.2f,		变异率:%0.2f\n\n",g_pCross,g_pMutation);
	
	for(i = 0 ; i < DIM ; i++)
	{
		fprintf(flog,"基因%d	:	%0.4f\n",i,resultData[i]);
	}
	fprintf(flog,"\n适应值: %0.4f		运行时间:%d\n\n\n",fit[0],t2 - t1);
	fclose(flog);

	return true;
}
bool Display()
{ 

	
	if( g_bRender)
    { 	
		t1 = GetTickCount();
		
		RenderFit();
		RenderBest();
		
		for(int j = 1 ; j < g_nGeneration ; j++ )
		{

			RenderSelect();	

			RenderCross();	

			RenderMutation();

			RenderFit();

			RenderBest();

			//RenderResult();
		}
		t2 = GetTickCount();
		RenderResult();
		g_pD3DDevice->Present(0, 0, 0, 0);
		char str[40];
		sprintf(str,"%d",t2 - t1);
		MessageBox(NULL,str,"Info",IDOK);
		g_bRender = false;
	}
	else
	{
		g_pD3DDevice->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 0);
		g_pD3DDevice->BeginScene(); 
		g_pD3DDevice->EndScene();
		g_pD3DDevice->Present(0, 0, 0, 0);	
	}
    return true;
}


void CleanUp()
{
	
	SafeRelease(g_pD3D);
	SafeRelease(g_pD3DDevice);
	SafeRelease(g_pBuffer);	
	SafeRelease(g_pEffect);
	SafeRelease(g_pBackBuffer);	
	for(int i = 0 ; i < 20 ; i++)
	{
		SafeRelease(g_pSubBuffer[i]);
		SafeRelease(g_pSubTexture[i]);
		SafeRelease(g_pSubSurface[i]);
	}
	for(i = 0 ; i < DIM / 4 ; i++)
	{
		SafeRelease(g_pGeneTexture1[i]);
		SafeRelease(g_pGeneTexture2[i]);
		SafeRelease(g_pGeneSurface1[i]);
		SafeRelease(g_pGeneSurface2[i]);
		SafeRelease(g_pBestGeneTexture1[i]);
		SafeRelease(g_pBestGeneSurface1[i]);
		SafeRelease(g_pResultSurface[i]);
		SafeRelease(g_pResultTexture[i]);
	}
	SafeRelease(g_pFitTexture);
	SafeRelease(g_pFitSurface);
	SafeRelease(g_pBestFitTexture1);
	SafeRelease(g_pBestFitSurface1);
	SafeRelease(g_pBestFitSurface2);
	SafeRelease(g_pBestFitTexture2);
	SafeRelease(g_pBestBuffer);
	SafeRelease(g_pCrossCtrBuffer);

	SafeRelease(g_pSelCtrSurface);
	SafeRelease(g_pSelCtrTexture);
	SafeRelease(g_pRandTexture);
	SafeRelease(g_pCrsCtrSurface);
	SafeRelease(g_pCrsCtrTexture);
	SafeRelease(g_pPosTexture);
	
}

void  Reset()
{
	g_nHeight = 1;
	g_nWidth = 1;	
	Num = 0;	
	SafeRelease(g_pBuffer);	

	for(int i = 0 ; i < 20 ; i++)
	{
		SafeRelease(g_pSubBuffer[i]);
		SafeRelease(g_pSubTexture[i]);
		SafeRelease(g_pSubSurface[i]);
	}
	for(i = 0 ; i < DIM / 4 ; i++)
	{
		SafeRelease(g_pGeneTexture1[i]);
		SafeRelease(g_pGeneTexture2[i]);
		SafeRelease(g_pGeneSurface1[i]);
		SafeRelease(g_pGeneSurface2[i]);
		SafeRelease(g_pBestGeneTexture1[i]);
		SafeRelease(g_pBestGeneSurface1[i]);

		SafeRelease(g_pBestGeneTexture2[i]);
		SafeRelease(g_pBestGeneSurface2[i]);

		SafeRelease(g_pResultSurface[i]);
		SafeRelease(g_pResultTexture[i]);
	}
	SafeRelease(g_pFitTexture);
	SafeRelease(g_pFitSurface);
	SafeRelease(g_pBestFitTexture1);
	SafeRelease(g_pBestFitSurface1);
	SafeRelease(g_pBestFitSurface2);
	SafeRelease(g_pBestFitTexture2);
	SafeRelease(g_pBestBuffer);
	SafeRelease(g_pCrossCtrBuffer);

	SafeRelease(g_pSelCtrSurface);
	SafeRelease(g_pSelCtrTexture);
	SafeRelease(g_pRandTexture);
	SafeRelease(g_pCrsCtrSurface);
	SafeRelease(g_pCrsCtrTexture);
	SafeRelease(g_pPosTexture);
}
void GameLoop()
{
	//Enter the game loop
	MSG msg; 
	BOOL fMessage;

	PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);

	while(msg.message != WM_QUIT)
	{
		fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);

		if(fMessage)
		{
			//Process message
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else
		{  

			Display();
			if(g_bStopRun == false)
				SendMessage(g_hWnd,WM_COMMAND,ID_RUN,NULL);
		}

	}
}
//The windows message handler
LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

	
	switch(msg)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
		break;
	case WM_KEYUP: 
		switch (wParam)
		{ 
		case VK_ESCAPE:
			//User has pressed the escape key, so quit
			DestroyWindow(hWnd);
			return 0;
			break;
		}
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{   
			
		case ID_EXIT:
			DestroyWindow(hWnd);
			return 0;
		case ID_RUN:
			//g_bRender = true;
			
			DialogBox(g_hInstance, (LPCTSTR)IDD_DIALOG  ,hWnd,  (DLGPROC)SetParamProc);			
			
			if(g_bRender == true)
			{	
				Reset();			
				InitGA();
				InitBuffer();
			}

			break;

		}
	}

	return DefWindowProc(hWnd, msg, wParam, lParam);
}



INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
	//Register the window class
	WNDCLASSEX wc = {sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0L, 0L, 
		GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
		"SobleShader", NULL};
	RegisterClassEx(&wc);
	g_hInstance = hInst;
	//Create the application's window
	HWND hWnd = CreateWindow("SobleShader", "shader test program", 
		WS_OVERLAPPEDWINDOW, 300, 200, 400 , 300,
		GetDesktopWindow(), NULL, wc.hInstance, NULL);
	HMENU hMenu = LoadMenu(wc.hInstance,MAKEINTRESOURCE(IDR_MENU1));

	SetMenu(hWnd,hMenu);

	g_hWnd = hWnd;

	//Initialize Direct3D
	if(SUCCEEDED(InitialiseD3D(hWnd)))
	{ 
		//Show our window
		ShowWindow(hWnd, SW_SHOWDEFAULT);
		UpdateWindow(hWnd);
		
		
		GameLoop();

	}
	CleanUp();
	UnregisterClass("DX Project 3", wc.hInstance);
	return 0;
}
char  sPopsize[20], sGeneration[20],sPcross[20],sMutation[20];
int  recordFuction = IDC_FUCTION_1;
int  bFirst = true;

LRESULT CALLBACK SetParamProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_INITDIALOG:	
		if(bFirst)
		{
			strcpy(sPopsize,"200");
			strcpy(sGeneration,"100");
			strcpy(sPcross,"0.4");
			strcpy(sMutation,"0.05");
			bFirst = false;
		}
		SetWindowText(GetDlgItem(hDlg,IDC_DIM),"8");
		SetWindowText(GetDlgItem(hDlg,IDC_LCHROM),"24");
		SetWindowText(GetDlgItem(hDlg,IDC_POPSIZE),sPopsize);
		SetWindowText(GetDlgItem(hDlg,IDC_GENERATION),sGeneration);
		SetWindowText(GetDlgItem(hDlg,IDC_PCROSS),sPcross);
		SetWindowText(GetDlgItem(hDlg,IDC_PMUTATION),sMutation);
			
		CheckRadioButton (hDlg, IDC_FUCTION_1, IDC_FUCTION_2,   recordFuction) ;
		
		return TRUE;

	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDOK:
			GetWindowText(GetDlgItem(hDlg,IDC_POPSIZE),sPopsize,20);
			GetWindowText(GetDlgItem(hDlg,IDC_GENERATION),sGeneration,20);
			GetWindowText(GetDlgItem(hDlg,IDC_PCROSS),sPcross,20);
			GetWindowText(GetDlgItem(hDlg,IDC_PMUTATION),sMutation,20);			
			
			g_nPopSize = StrToInt(sPopsize);
			g_nGeneration = StrToInt(sGeneration);
			g_pCross = (float)atof(sPcross);
			g_pMutation = (float)atof(sMutation);

			EndDialog(hDlg, LOWORD(wParam));
			g_bStopRun = false;
			g_bRender = true;
			return TRUE;
		case IDCANCEL:
			EndDialog(hDlg, LOWORD(wParam));
			g_bStopRun = true;
			g_bRender = false;
			return TRUE;
		case IDC_FUCTION_1:
			FUCTION = FUCTION_1;
			recordFuction = IDC_FUCTION_1;
			CheckRadioButton (hDlg, IDC_FUCTION_1, IDC_FUCTION_2,   IDC_FUCTION_1) ;
			break;
		case IDC_FUCTION_2:
			FUCTION = FUCTION_2;
			recordFuction = IDC_FUCTION_2;
			CheckRadioButton (hDlg, IDC_FUCTION_1, IDC_FUCTION_2,   IDC_FUCTION_2) ;
			break;
			
		};		
		break;
	}
	return FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -