📄 acsview.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 + -