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

📄 acsview.cpp

📁 蚁群算法是解决电力调配系统和商场供货系统问题的有效算法,这里提供了一种蚁群算法,供大家参考
💻 CPP
字号:
// //////////////////////////////////////////////////
//acsView.cpp : implementation of the CAcsView class

#include "stdafx.h"
#include "acs.h"
#include "TspNew.h"
#include "acsDoc.h"
#include "MainFrm.h"
#include "acsView.h"
#include "SetDefaultDlg.h"
#include "AcsTipDlg.h"
#include "time.h"
#include "TimeDialog.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
double startTime,finishTime;
/////////////////////////////////////////////////////////////////////////////
// CAcsView

IMPLEMENT_DYNCREATE(CAcsView, CFormView)

BEGIN_MESSAGE_MAP(CAcsView, CFormView)
	//{{AFX_MSG_MAP(CAcsView)
	ON_COMMAND(ID_MENU_SETDEFAULT, OnMenuSetdefault)
	ON_COMMAND(ID_MENU_RUNSYSTEM, OnMenuRunsystem)
	ON_WM_KEYDOWN()
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAcsView construction/destruction

CAcsView::CAcsView()
	: CFormView(CAcsView::IDD)
{
	m_ptMemDC=new CDC;       //构造内存DC
	m_ptMemBitmap=new CBitmap;  //构造位图对象
	//{{AFX_DATA_INIT(CAcsView)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// TODO: add construction code here

}

CAcsView::~CAcsView()
{
	//析构函数中销毁内存对象和位图;
	delete m_ptMemDC;
	delete m_ptMemBitmap;
}

void CAcsView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAcsView)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

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

	return CFormView::PreCreateWindow(cs);
}

void CAcsView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();

}

/////////////////////////////////////////////////////////////////////////////
// CAcsView diagnostics

#ifdef _DEBUG
void CAcsView::AssertValid() const
{
	CFormView::AssertValid();
}

void CAcsView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}

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


//////////////////////////////////////////
// 响应菜单命令,设置TSP系统的一些初始参数
//////////////////////////////////////////
void CAcsView::OnMenuSetdefault() 
{
	// TODO: Add your command handler code here
	CAcsDoc* pDoc = GetDocument();
	CSetDefaultDlg dlg;
	//从文档类中取出默认的参数值;
	dlg.m_BValue = pDoc->m_BValue;
	dlg.m_Q0Value = pDoc->m_Q0Value;
	dlg.m_AValue = pDoc->m_AValue;
	dlg.m_PValue = pDoc->m_PValue;
	dlg.m_T0Value = pDoc->m_T0Value;
	dlg.m_AntNumber = pDoc->m_AntNumber;
	
    if(dlg.DoModal() == IDOK)
	{
	  //取得输入的各个参数的值,赋给变量;
      pDoc->m_BValue = dlg.m_BValue ;
      pDoc->m_Q0Value = dlg.m_Q0Value ;
      pDoc->m_AValue = dlg.m_AValue ;
      pDoc->m_PValue = dlg.m_PValue ;
      pDoc->m_T0Value = dlg.m_T0Value ;
	  pDoc->m_AntNumber= dlg.m_AntNumber; 
	}
}
////////////////////////////////////////
// 响应菜单命令,运行系统
////////////////////////////////////////


void CAcsView::OnMenuRunsystem() 
{
	// TODO: Add your command handler code here
	CAcsDoc* pDoc = GetDocument();
	//用无模式对话框提示用户选择输入数据文件
	CAcsTipDlg * tipdlg;
	tipdlg = new CAcsTipDlg;
	tipdlg->Create(IDD_TIP_DIALOG,this);
	tipdlg->ShowWindow(SW_SHOW);
	tipdlg->m_strTipText.SetWindowText("请选择城市间距离的数据文件");
	Sleep(800);
	tipdlg->EndDialog(0);
	//声明CTspNew类的实例,初始化参数
	CTspNew tsp;
	tsp.GetCityNumber(); 
	tsp.GetDataFromFile(); 
	tsp.m_BValue = pDoc->m_BValue;
	tsp.m_Q0Value = pDoc->m_Q0Value;
	tsp.m_AValue = pDoc->m_AValue;
	tsp.m_PValue = pDoc->m_PValue;
	tsp.m_T0Value = pDoc->m_T0Value;
	tsp.m_AntNumber = pDoc->m_AntNumber ;
	//用文档类中相应的参数初始化信息素信息
	for(int i=0;i<tsp.m_CityNumber;i++ )
	{
		for(int j=0;j<tsp.m_CityNumber;j++)
		{
			tsp.m_xinxisu[i][j] = pDoc->m_T0Value;  
		}
	}
	//开始优化进程,并计算相应的结果
	startTime = clock();

	tsp.Initialization(); 
	tsp.BeginTour(); 
	tsp.CalculateTourLength(); 
	tsp.CalculateAveragelength();
	tsp.GetBestTour(); 
	tsp.UpdateTourGlobal(); 
	bestant = tsp.bestTourPos ;
	bestlength = tsp.m_bestTourLength ;
	for(int line=0;line<tsp.m_CityNumber;line++)
	{
		for(int column=0;column<tsp.m_CityNumber;column++)
		{
			m_city[line][column] = tsp.m_CityDistance[line][column]; 
		}
	}
	for(int count=0;count<tsp.m_CityNumber;count++)
	{
		cityorder[count]=tsp.order[bestant].GetAt(count);
	}
	//程序运行中,用无模式对话框显示等待信息
	tipdlg->ShowWindow(SW_SHOW);
	tipdlg->m_strTipText.SetWindowText("程序运行中,请等待....");
//	Sleep(800);
    
	//显示运行时间。
    finishTime = clock();
	double  duration = (double)(finishTime-startTime)/CLOCKS_PER_SEC;
    CTimeDialog dlgt;
	dlgt.m_RunTime1=duration;
	dlgt.DoModal();
	UpdateData(FALSE);

	//输出结果到输出文件output.txt中
	tsp.printResultToFile(); 
	pDoc->m_CityNumber = tsp.m_CityNumber;
	avergelength = tsp.averagelength; 
	tipdlg->EndDialog(0);
	delete tipdlg;
	//输出结果到当前屏幕
	DrawToScreen();
}

//////////////////////////////////////////
////接收用户的键盘输入,按ESC键退出全屏模式
//////////////////////////////////////////
void CAcsView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if(nChar == VK_ESCAPE)//如果按下ESC键
	{
		//获取主框架窗口的指针;
		CMainFrame * pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
		//调用主窗口类的自定义函数,退出全屏显示
		pFrame->EndFullScreen(); 
	}
	CFormView::OnKeyDown(nChar, nRepCnt, nFlags);
}
//////////////////////////////////////
//初始化应用程序的界面
//////////////////////////////////////
int CAcsView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CFormView::OnCreate(lpCreateStruct) == -1)
		return -1;
	// TODO: Add your specialized creation code here
	m_nMaxX=GetSystemMetrics(SM_CXSCREEN);
	m_nMaxY=GetSystemMetrics(SM_CYSCREEN);
	CDC *pDC=GetDC();
	m_ptMemDC->CreateCompatibleDC(pDC);
	m_ptMemBitmap->CreateCompatibleBitmap(pDC,m_nMaxX,m_nMaxY);
	CBitmap *pOldBitmap=m_ptMemDC->SelectObject(m_ptMemBitmap);
	CBrush brush;
	brush.CreateStockObject(LTGRAY_BRUSH);
	CRect rect(-1,-1,m_nMaxX,m_nMaxY);
	m_ptMemDC->FillRect(rect,&brush);
	m_ptMemDC->SelectObject(pOldBitmap);
	ReleaseDC(pDC);
	return 0;
}
//////////////////////////////
//窗口重绘时自动调用该函数
//////////////////////////////
void CAcsView::OnDraw(CDC* pDC) 
{
	CAcsDoc* pDoc = GetDocument();
	CBitmap *pOldBitmap=m_ptMemDC->SelectObject(m_ptMemBitmap);
	//将位图内存显示到当前屏幕
	pDC->BitBlt(0,0,m_nMaxX,m_nMaxY,m_ptMemDC,0,0,SRCCOPY);
	m_ptMemDC->SelectObject(pOldBitmap);
	return;
	
}

////////////////////////////////////////
// 将数据显示到屏幕窗口
////////////////////////////////////////
void CAcsView::DrawToScreen()
{
	CAcsDoc* pDoc = GetDocument();
	CBitmap *pOldBitmap;
	CFont NewFont;
	NewFont.CreateFont(10,8,0,0,FW_DONTCARE,FALSE,FALSE,FALSE,
		DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS,
		DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,
		"Times New Roman ");
	CFont *pOldFont;
	pOldFont = m_ptMemDC->SelectObject(&NewFont);
   
    m_ptMemDC->SetBkColor(RGB(192,192,192)); 
    m_ptMemDC->SetTextColor(RGB(0,0,255));
	CString str;//定义输出字符串
	if (!m_ptMemBitmap)
		m_ptMemBitmap=NULL;//清空上一次的输入.  
	pOldBitmap=m_ptMemDC->SelectObject(m_ptMemBitmap);
	//定义输出字符串格式
	str.Format("* * * * * * * * * * * * * * * * * * * * * * "); 
	m_ptMemDC->TextOut(40,5,str);
	m_ptMemDC->TextOut(60,20,"蚂蚁群落系统的输出结果如下所示:\n");
	str.Format("* * * * * * * * * * * * * * * * * * * * * * "); 
	m_ptMemDC->TextOut(40,35,str);
	str.Format("TSP问题中城市数目:%5d",pDoc->m_CityNumber ); 
	m_ptMemDC->TextOut(40,50,str);
	str.Format("TSP问题中蚂蚁数目:%5d",pDoc->m_AntNumber);
	m_ptMemDC->TextOut(40,70,str);
	str.Format("TSP问题的各参数设置如下:");
	m_ptMemDC->TextOut(40,85,str);
	str.Format("信息素与距离相对参数β:%6.2f",pDoc->m_BValue);
	m_ptMemDC->TextOut(40,100,str);
	str.Format("寻路随机变量q0:%6.2f",pDoc->m_Q0Value);
	m_ptMemDC->TextOut(40,115,str);
	str.Format("信息素腐化参数α:%6.2f",pDoc->m_AValue);
	m_ptMemDC->TextOut(40,130,str);
	str.Format("局部更新规则的参数ρ:%6.2f",pDoc->m_PValue);
	m_ptMemDC->TextOut(40,145,str);
	str.Format("初始状态下信息素水平τ0:%6.2f",pDoc->m_T0Value);
	m_ptMemDC->TextOut(40,160,str);
	str.Format("平均路径长度为:%15.4f",avergelength); 
	m_ptMemDC->TextOut(40,180,str);
	str.Format("最优路径的长度为:%15.4f",bestlength ); 
	m_ptMemDC->TextOut(40,200,str);
	str.Format("最优路径的顺序如下:\n"); 
	m_ptMemDC->TextOut(40,220,str);
	for(int counter=0;counter<pDoc->m_CityNumber;counter++)
	{
		str.Format("%4d",cityorder[counter]+1); 
		m_ptMemDC->TextOut(180,235+10*counter,str);
	}
    //恢复内存DC和位图 ,调用OnDraw函数.
	m_ptMemDC->SelectObject(pOldFont);
	m_ptMemDC->SelectObject(pOldBitmap);  
	Invalidate(FALSE);   
	return;
}

⌨️ 快捷键说明

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