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

📄 genetestview.cpp

📁 火力分配的应用
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// genetestView.cpp : implementation of the CGenetestView class
//

#include "stdafx.h"
#include "genetest.h"
//#include "Winbase.h"
#include "genetestDoc.h"
#include "genetestView.h"
#include "DlgInputPara.h"
#include <math.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CGenetestView

IMPLEMENT_DYNCREATE(CGenetestView, CScrollView)

BEGIN_MESSAGE_MAP(CGenetestView, CScrollView)
	//{{AFX_MSG_MAP(CGenetestView)
	ON_COMMAND(ID_GENEParaSet, OnGENEParaSet)
	ON_COMMAND(ID_GENE_Begin, OnGENEBegin)
	ON_COMMAND(ID_GENE_End, OnGENEEnd)
	ON_COMMAND(ID_ShowResult, OnShowResult)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGenetestView construction/destruction

CGenetestView::CGenetestView()
{
	// TODO: add construction code here
	m_oldpop = NULL;
	m_newpop = NULL;
	m_maxfitChrom = NULL;
	m_fcrossover = 0.0f;
	m_ngenerations = 0;
	m_fmutation = 0.0f;
	m_npopulationsize = 0;
	m_ntarget = 0;
	m_nweapon = 0;

	
	m_bInputFlag = FALSE;
	m_nOutputY = 0;
	m_nmaxpp = -1;
	m_nminpp = -1;
	m_fWholeMaxFit = 0.0;
	m_nTestFlag = 0;
	//m_nIndex = -1;
	//m_bDrawFlag = FALSE;
		
	//初始化数组
	for(int i=0;i<maxTarget;i++)
	{
		m_Worthiness[i]=0.0;
		for(int j=0;j<maxWeapon;j++)
		{
			
			m_SuccessArray[i][j]=0.0;
		}
	}
}

CGenetestView::~CGenetestView()
{
	//释放内存,避免内存泄漏
	int nCount = m_WeaponList.GetCount();
	int i;
	if(nCount != 0)
	{
		POSITION pos = m_WeaponList.GetHeadPosition();
		for(i=0;i<nCount;i++)
		{
			CWeapon *Oldnode = m_WeaponList.GetAt(pos);
			delete Oldnode;
			m_WeaponList.GetNext(pos);
		}
	}


	if(m_oldpop!=NULL||m_newpop!=NULL)
	{
		for(i = 0; i < m_npopulationsize; i++)
		{
			free(m_oldpop[i].chrom);
			free(m_newpop[i].chrom);
		}
		free(m_oldpop);
		free(m_newpop);
	}
	if(m_maxfitChrom!=NULL)
	{
		free(m_maxfitChrom);
	}
}

BOOL CGenetestView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CGenetestView drawing

void CGenetestView::OnDraw(CDC* pDC)
{
	CGenetestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	/*if(m_bDrawFlag==TRUE)
	{
		//循环输出遗传算法各代的染色体的值
		int j = 0;
		for(int i=0;i<m_OutstrArray.GetSize();i++)
		{
			pDC->TextOut(0,j,m_OutstrArray.GetAt(m_nIndex));
			j += 30;			
		}
		m_bDrawFlag = FALSE;
	}*/
}

/////////////////////////////////////////////////////////////////////////////
// CGenetestView printing

BOOL CGenetestView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CGenetestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CGenetestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CGenetestView diagnostics

#ifdef _DEBUG
void CGenetestView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CGenetestView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CGenetestDoc* CGenetestView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGenetestDoc)));
	return (CGenetestDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CGenetestView message handlers
/*参数设置菜单响应函数*/
void CGenetestView::OnGENEParaSet() 
{
	// TODO: Add your command handler code here
	
	CDlgInputPara dlg;
	if(dlg.DoModal()==IDOK)
	{
		m_fcrossover = dlg.m_fcrossover;
		m_ngenerations = dlg.m_ngenerations;
		m_fmutation = dlg.m_fmutation;
		m_npopulationsize = dlg.m_npopulationsize;
		m_ntarget = dlg.m_ntarget;
		m_nweapon = dlg.m_nweapon;
		m_bInputFlag = TRUE;
	}
	//m_OutstrArray.SetSize((m_npopulationsize+1)*(m_ngenerations+1));
	
}

void CGenetestView::OnGENEBegin() 
{
	// TODO: Add your command handler code here
	int gen = 0;
	CIndividual *temp;
	if(m_bInputFlag==FALSE)
	{
		MessageBox("请先输入遗传算法的控制参数!");
		return;
	}
	Initialize();
	while(gen < m_ngenerations)
	{
		gen += 1;
		Generation(gen);
		Statistics(m_newpop);
		temp = m_oldpop;
		m_oldpop = m_newpop;
		m_newpop = temp;
	}
	
}

void CGenetestView::OnGENEEnd() 
{
	// TODO: Add your command handler code here
	/*InitPheromone();
	WritePheromone();
	CWinThread *antThread[2];
	g_nIndex = 0;
	
	antThread[1] = AfxBeginThread(AntThreadProcTest, this,THREAD_PRIORITY_HIGHEST);
	
	Sleep(1000);//必须进行延时且大于600ms,否则两个线程的效果相同,因为随机数是根据时间产生的
	antThread[2] = AfxBeginThread(AntThreadProcTest, this,THREAD_PRIORITY_HIGHEST);*/
	
	//设定测试标志
	//m_nTestFlag = 1;
	//初始化迹,让迹等于打击概率
	/*int i,j;
	for(i=0;i<m_ntarget;i++)
	{
		for(j=0;j<m_nweapon;j++)
		{
			m_PheromoneArray[i][j] = m_SuccessArray[i][j];
		}
		
	}	
	WriteLog("蚂蚁算法测试,将打击成功概率赋值给迹:");

	//InitAntList();
	CString str;
	float maxFitness = (float)0.0;
	float OldmaxFitness = maxFitness;
	float Sub;
	for(i = 0; i<m_nRepeat;i++)
	{
		Sub = maxFitness - OldmaxFitness;
		if(i>0&&Sub<0.001)
		{
			break;
		}
		else OldmaxFitness = maxFitness;
		POSITION pos = g_antList.GetHeadPosition();
		str.Format("蚂蚁第%d次迭代:",i+1);
		WriteLog(str);
		WritePheromone();
		int nIndex = 1;
		while(pos!=NULL)
		{
			CAllocationAnt *ant = g_antList.GetAt(pos);
			ant->SetAllocArray();
			ant->ReadTargetLimit();
			ant->SearchPath();
			ant->m_fFitness = ant->ComputePathLength();
			if(ant->m_fFitness > maxFitness)
				maxFitness = ant->m_fFitness;
			ant->WriteResult();
			str.Format("第%d只蚂蚁的适应度为:%f",nIndex,ant->m_fFitness);
			WriteLog(str);
			g_antList.GetNext(pos);
			nIndex++;
		}
		UpdatePheromoneTestUsed();
	}
	str.Format("最大适应度为:%f",maxFitness);
	WriteLog(str);
	str += "m_nTestFlag=1 以成功概率为迹无遗传算法结果的蚂蚁算法运行结束!";
	MessageBox(str);*/
}

void CGenetestView::Initpop()
{
	int i,j,k,lchrom;
	lchrom = m_nweapon*m_ntarget;
	int n/*c,*/;
	char c;
	CString str = "初始群体:目标数:";
	CString str1;
	str1.Format("%d",m_ntarget);
	str += str1;
	str += "武器数:";
	str1.Format("%d",m_nweapon);
	str += str1;
	CClientDC dc(this);
	dc.TextOut(0,m_nOutputY,str);
	ReleaseDC(&dc);
	WriteLog(str);
	m_nOutputY += 30;
	//m_nIndex++;
	//m_OutstrArray.SetAt(m_nIndex,str);
	for(i=0;i<m_npopulationsize;i++)//群体规模
	{
		for(j=0;j<m_ntarget;j++)//目标数,代表子串的树木
		{
			POSITION pos;
			pos = m_WeaponList.GetHeadPosition();
			for(k=0;k<m_nweapon;k++)//武器数,代表子串的长度
			{
				int temp = rand();
				c = temp%2;
				
				//给武器增加分配标志
				if(j==0)//第一个子串,代表对第一个目标的分配情况
				{
					m_WeaponList.GetAt(pos)->m_bFBBZ = c;
					if(c==1)
					{
						//分配目标号
						m_WeaponList.GetAt(pos)->m_nFBMBH = j;
					}
					
				//	ResetWeaponState(pos,c);

				}
				else//其他目标的分配情况
				{
					if(m_WeaponList.GetAt(pos)->m_bFBBZ==1)
					{
						c = 0;
					}
					else if(c==1)
					{
						m_WeaponList.GetAt(pos)->m_bFBBZ = c;
						m_WeaponList.GetAt(pos)->m_nFBMBH = j;//分配目标号
					}
				}
				n = j*m_nweapon+k;
				m_oldpop[i].chrom[n] = c;//出错处,原因是未曾分配内存
				m_WeaponList.GetNext(pos);
			}
		}

		/*//Objfunc(&(m_oldpop[i]));//计算个体适应度,若用此函数,必须放在ResetWeaponList()之前
	
		//重新初始化武器的状态,为下一个的个体做准备
		if(i!=m_npopulationsize-1)
		{
			ResetWeaponList();
		}*/
		OutputResult(m_oldpop[i]);	
		ObjFunction(&(m_oldpop[i]));
	}
}
//系统初始化
void CGenetestView::Initialize()
{
	time_t t;
	srand((unsigned) time(&t));//设置rand函数所用的启始种子值,以期每次产生的随机数序列均不相同。
	
	InitWeaponList();
	SetWTAArray();
	InitMalloc();
	Initpop();
	Statistics(m_oldpop);//统计数据
}
//统计函数,计算种群统计数据,这样统计出来的是当前代(也就是最终是最后一代的染色体代表的数据)
//应改进,是否应该可以统计出所有迭代过程中的最优个体的适应度??
void CGenetestView::Statistics(CIndividual *pop)
{
	//CString str;
	float max = pop[0].fitness;
	m_nmaxpp = 0;
	m_nminpp = 0;
	float min = pop[0].fitness;
	float Sum = 0.0;
	for(int i=0;i<m_npopulationsize;i++)
	{
		Sum += pop[i].fitness;            
        if(pop[i].fitness > max)
		{
			max = pop[i].fitness;     
			m_nmaxpp = i;
		}
        if(pop[i].fitness < min) 
		{
			min = pop[i].fitness;
			m_nminpp = i;
		}
		//str.Format("%f",pop[i].fitness);
		//MessageBox(str);
	}
	m_fsumfitness = Sum;
	m_fmax = max;
	m_fmin = min;
	m_favg = Sum/m_npopulationsize;
	//统计全局(也就是所有代中)最优染色体
	if(m_fmax > m_fWholeMaxFit)
	{
		m_fWholeMaxFit = m_fmax;
		for(int l = 0;l<m_ntarget*m_nweapon;l++)
		{
			m_maxfitChrom[l] = pop[m_nmaxpp].chrom[l]; 
		}
	}
}

void CGenetestView::InitWeaponList()
{
	int i;
	POSITION pos;
	pos = m_WeaponList.GetHeadPosition();
	for(i=0;i<m_nweapon;i++)
	{
		CWeapon *node = new CWeapon;
		node->m_bFBBZ = FALSE;
		node->m_nDYXHL = 0;
		node->m_nFBMBH = -1;
		node->m_nSJJL = 0;
		node->m_strLSDW = "";
		node->m_nMaxWeapon = 1;   //暂时设为每个目标最多允许分配一个武器
		pos = m_WeaponList.InsertAfter(pos,node);
	}
}

void CGenetestView::ResetWeaponList()
{
	int nCount = m_WeaponList.GetCount();
	int i;
	POSITION pos;
	pos = m_WeaponList.GetHeadPosition();
	for(i=0;i<nCount;i++)
	{
		CWeapon *Oldnode = m_WeaponList.GetAt(pos);
		Oldnode->m_bFBBZ = 0;
		Oldnode->m_nDYXHL = 0;
		Oldnode->m_nFBMBH = -1;
		Oldnode->m_nSJJL = 0;
		Oldnode->m_strLSDW = "";
		
		m_WeaponList.GetNext(pos);
	}
}
//此函数用于更改一个武器的状体,暂时没用到
void CGenetestView::ResetWeaponState(POSITION &pos, int c)
{
	CWeapon *Oldnode = m_WeaponList.GetAt(pos);
	CWeapon *Newnode = new CWeapon;
	Newnode->m_bFBBZ = c;
	Newnode->m_nDYXHL = 0;
	Newnode->m_nFBMBH = 0;
	Newnode->m_nSJJL = 0;
	Newnode->m_strLSDW = "";
	m_WeaponList.SetAt(pos,Newnode);
	delete Oldnode;

}
//分配内存
void CGenetestView::InitMalloc()
{
	int nbytes;
	int j;
	/* 分配给当前代和新一代种群内存空间 */
	nbytes = m_npopulationsize*sizeof(struct CIndividual);
	if((m_oldpop = (struct CIndividual *) malloc(nbytes)) == NULL)
	{
		MessageBox("内存分配失败!");
		return;
	}
	if((m_newpop = (struct CIndividual *) malloc(nbytes)) == NULL)
	{
		MessageBox("内存分配失败!");
		return;
	}
	/*if((m_p1 = (struct CIndividual *) malloc(sizeof(struct CIndividual))) == NULL)
	{
		MessageBox("内存分配失败!");
		return;
	}*/
	/* 分配给染色体内存空间 */
	nbytes = m_ntarget*m_nweapon*sizeof(char);
	for(j = 0; j < m_npopulationsize; j++)
    {
		if((m_oldpop[j].chrom = (char*) malloc(nbytes)) == NULL)
		{
			MessageBox("内存分配失败!");
			return;
		}
		if((m_newpop[j].chrom = (char*) malloc(nbytes)) == NULL)
		{
			MessageBox("内存分配失败!");

⌨️ 快捷键说明

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