📄 citymap.h
字号:
#pragma once
#include "time.h"
#include "dpoint.h"
#include "trendline.h"
#include "atlimage.h"
#define CM_ROOM_CREATE_SIZE 10
#define CM_CITY_DRAW_SIZE 2
#define CM_OFFSET 8
typedef struct stru_gene
{
int * index;
double mark;
int killRate;
}GENE;
class CCityMap
{
public:
CCityMap(void);
~CCityMap(void);
public:
// 平均分趋势线指针
CTrendLine * m_pAVGTrendLine;
// 最大分趋势线指针
CTrendLine * m_pMaxTrendLine;
protected:
// 城市坐标存储空间指针
CDPoint * m_pDPCitySites;
// 空间大小
int m_iRoomSize;
// 城市个数
int m_iCityNum;
// 是否在计算
bool m_bCompute;
// 终止信号
bool m_bKillMsg;
// 距离矩阵
double ** m_ppdDistanceM;
// 矩阵大小
int m_iDMSize;
// 最佳序列
int * m_piBestIndex;
// 当前最佳序列
int * m_piCurrBestIndex;
// 最佳分数
double m_dBestMark;
// 群体平均分
double m_dAVGMark;
// 代数
__int64 m_i64GenNum;
// 最优代
__int64 m_i64BestGen;
// 跳跃倒计数
int m_iJumpCountdown;
// 跳跃次数
int m_iJumpCount;
// 所用时间
CTimeSpan m_tsTimeUsed;
// 程序路径
CString m_sProPath;
// 全局参数
// 种子数量
static int CM_SEED_NUM;
// 子女数量
static int CM_CHILDREN_NUM;
// 最大转移数
static int CM_MAX_TRANS_NUM;
// 灾变初始值
static int CM_JUMP_COUNTDOWN_INIT;
// 灾变倍增值
static double CM_JUMP_COUNTDOWN_INC;
// 图片日志
static bool CM_IMG_LOG;
protected:
// 变异函数
static void Variant(GENE & gsource, GENE & gdest, int * ptemp, int size, int varate);
// 辅助线程
static UINT ThreadProc( LPVOID pParam );
// 销毁距离矩阵
void DestroyDistanceMatrix();
// 计算距离矩阵
void ComputeDistanceMatrix();
// 打分
void Mark(GENE & gene);
// 四边形优化
void QuadrangleOptimise(GENE & gene);
public:
// 取得程序路径
inline CString GetProPath()
{
return this->m_sProPath;
}
// 读取参数设置
void ReadSetting();
// 保存参数设置
void SaveSetting();
// 保存为图像文件
void SaveAsImage(CString fileName);
// 取得当前状态描述
inline CString GetStateDescription()
{
CString s;
s.Format( "%03d个城市 第%08I64d代 最优产生于第%08I64d代 分数%lf "
"里程%lf 灾变倒计数%04d 灾变计数%03d 群体平均分%lf 用时%s",
m_iCityNum, m_i64GenNum, m_i64BestGen, m_dBestMark,
1.0 / m_dBestMark, m_iJumpCountdown, m_iJumpCount, m_dAVGMark,
m_tsTimeUsed.Format("%D-%H:%M:%S"));
return s;
}
// 取得当前状态简单描述
inline CString GetStateSimpleDescription()
{
CString s;
s.Format( "第%I64d代 用时%s",
m_i64GenNum,
m_tsTimeUsed.Format("%D-%H:%M:%S"));
return s;
}
// 开始计算
bool StartCompute();
// 停止计算
bool StopCompute();
// 是否正在计算
inline bool IsComputing()
{
return m_bCompute;
}
// 取得群体平均分
inline double GetAVGMark()
{
return this->m_dAVGMark;
}
// 取得最优分数
inline double GetBestMark()
{
return this->m_dBestMark;
}
// 写到文件
bool WriteFile(CString fileName);
// 读取文件
bool ReadFile(CString fileName);
// 绘制城市
void Draw(CDC * pDC, CRect rect, int highLight, int highLight2);
// 清空
void Clear();
// 添加城市
void AddCity(double x, double y);
// 删除城市
void DeleteCity(int index);
// 点击测试,返回城市序号或者-1
int HitTest(double x, double y, double dx, double dy);
// 取得城市个数
inline int GetCityNum()
{
return this->m_iCityNum;
}
// 取得城市坐标
inline CDPoint GetCitySite(int index)
{
if(index >= 0 && index < this->m_iCityNum)
{
return this->m_pDPCitySites[index];
}
return CDPoint(0.0, 0.0);
}
// 设置城市坐标
inline void SetCitySite(int index , double x, double y)
{
if(!m_bCompute && index >= 0 && index < this->m_iCityNum)
{
this->m_pDPCitySites[index].x = x;
this->m_pDPCitySites[index].y = y;
}
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -