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

📄 citymap.h

📁 旅行商问题
💻 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 + -