📄 ga.cpp
字号:
// GA.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "WSRandom.h"
#include "WSTSP.h"
#include "WSGenAlogrith.h"
VOID Test1();
VOID Test2();
VOID Test3();
VOID Test4();
VOID Test5();
VOID Test6();
VOID Command(PCHAR _CmdString[], INT _PareNum);
VOID Help();
typedef std::vector<PCHAR> CmdParaments;
int _tmain(int argc, _TCHAR* argv[])
{
/*printf("%d\n" , sizeof(CityOrderDef));
CityOrderDef dd;
dd.push_back(15);
printf("%d\n" , sizeof(dd));*/
// printf("Parement Numbers: %d \n", argc);
//Test6();
if(argc == 1)
{
Help();
getchar();
}
else Command(argv, argc);
//getchar();
return 0;
}
VOID Test1()
{
CString str;
USHORT l_Cnt = 0;
WSRandom::Initial();
for(int i = 0; i < 20; ++i)
{
//if(WSRandom::JudgeEven(0.984))
// l_Cnt++;
l_Cnt = WSRandom::GenRand(15, 98);
printf("%d\n", l_Cnt);
}
}
VOID Test2()
{
printf("%f \n", WSTSP::CityDistance(0.1,6.0, 3, 4));
}
VOID Test3()
{
//WSTSP::GenCityInfoToFile("City.txt", 30);
CityInfo tt;
WSTSP::ReadCityInfoFromFile("City.txt",tt);
//WSTSP::GenRandCityOrder(tt);
WSTSP::ReverseSubOrder(tt.m_pCityOrder);
INT i;
for(i = 0; i < tt.m_CityNum; ++i)
{
printf("%d %f %f\n", tt.m_pCityOrder[i], tt.m_pCities[i].x, tt.m_pCities[i].y);
}
}
VOID Test4()
{
CityOrderDef a, b;
a.push_back(1);
a.push_back(2);
a.push_back(3);
a.push_back(4);
b = a;
printf("%d %d \n", b[1], b[3]);
INT TMP = b[1];
b[1] = b[3];
b[3] = TMP;
printf("%d %d \n", b[1], b[3]);
printf("%d %d \n", a[1], a[3]);
b.pop_back();
printf("%d %d \n", a.capacity(), b.capacity());
printf("%d %d \n", a.size(), b.size());
}
VOID Test5()
{
CityInfo Pa, Pb, Sa, Sb;
int i;
for(i = 0; i < 10; ++i)
{
Pa.m_pCityOrder.push_back(i);
Pb.m_pCityOrder.push_back(i);
}
WSRandom::Initial();
WSTSP::GenRandCityOrder(Pa.m_pCityOrder);
WSTSP::GenRandCityOrder(Pb.m_pCityOrder);
printf("Pa==>");
for(i = 0; i < 10; ++i) printf("%d ",Pa.m_pCityOrder[i]);
printf("\n");
printf("Pb==>");
for(i = 0; i < 10; ++i) printf("%d ",Pb.m_pCityOrder[i]);
printf("\n");
WSTSP::CrossSubOrder(Pa.m_pCityOrder, Pb.m_pCityOrder, Sa.m_pCityOrder, Sb.m_pCityOrder);
printf("Sa==>");
for(i = 0; i < 10; ++i) printf("%d ",Sa.m_pCityOrder[i]);
printf("\n");
printf("Sb==>");
for(i = 0; i < 10; ++i) printf("%d ",Sb.m_pCityOrder[i]);
printf("\n");
WSTSP::ReverseSubOrder(Sa.m_pCityOrder);
printf("Sa==>");
for(i = 0; i < 10; ++i) printf("%d ",Sa.m_pCityOrder[i]);
printf("\n");
}
VOID Test6()
{
Help();
WSGeneticAlogrith l_GA;
//WSTSP::GenCityInfoToFile("GAData.txt", 5);
//模式:计时终止、计数终止、自然终止
//交叉率、变异率的设定
l_GA.Initial(2, "GAData.txt", "Result.txt", 10, 0, 0.9, 0.5);
//模式:适配种群模式、交叉模式、变异模式
l_GA.StartCompute(3,2,1);
}
VOID Command(PCHAR _CmdString[], INT _PareNum)
{
CmdParaments l_paras;
l_paras.clear();
INT i;
//_CmdString[0]为程序名。
for(i = 1; i < _PareNum; ++i)
{
l_paras.push_back(_CmdString[i]);
}
//检查有无帮助,先处理帮助信息
_PareNum = l_paras.size();
for(i = 0; i < _PareNum; ++i)
{
if(strcmp(l_paras[i], "/?") == 0 || strcmp(strlwr(l_paras[i]), "-h") == 0)
{
l_paras.clear();
Help();
return ;
}
}
//检查是否是要求生成城市坐标文件
for(i = 0; i < _PareNum; ++i)
{
if(strcmp(strlwr(l_paras[i]), "-gc") == 0)
{
l_paras.erase(l_paras.begin() + i);
PCHAR l_pOutFileName = "GAData.txt";
INT l_CityNum = 30;
_PareNum = l_paras.size();
/*if(_PareNum) printf("发现不可识别的参数表示。%d\n", _PareNum);*/
if(_PareNum & 0x01)
{
printf("发现不可识别的参数表示。\n");
return;
}
/*for(i = 0; i < _PareNum; ++i)
{
printf("1====>%s \n", l_paras[i]);
}*/
for(i = 0; i < _PareNum; i += 2)
{
if(strcmp(strlwr(l_paras[i]), "-ofn") == 0)
{
l_pOutFileName = l_paras[i + 1];
l_paras.erase( l_paras.begin() + i, l_paras.begin() + i + 2);
break ;
}
}
_PareNum = l_paras.size();
for(i = 0; i < _PareNum; i += 2)
{
if(strcmp(strlwr(l_paras[i]), "-n") == 0)
{
l_CityNum = atoi(l_paras[i + 1]);
if(l_CityNum < 0) l_CityNum = 30;
l_paras.erase( l_paras.begin() + i, l_paras.begin() + i + 2);
break ;
}
}
_PareNum = l_paras.size();
if(_PareNum) printf("发现不可识别的参数表示:");
for(i = 0; i < _PareNum; ++i) printf("%s ", l_paras[i]);
WSTSP::GenCityInfoToFile(l_pOutFileName, l_CityNum);
return ;
}
}
//接下来处理程序的各个参数配置
INT l_TerminateMode = 2;
PCHAR l_pInFileName = "GAData.txt";
PCHAR l_pOutFileName = "Result.txt";
INT l_Generates_Time_NatureTimes = 10;//默认10秒
INT l_MemberNum = 0;
FLOAT m_CrossProbability = 0.8;
FLOAT m_VarProbability = 0.05;
INT l_AdaptMode = 3;
INT l_CrossMode = 2;
INT l_VariateMode = 1;
_PareNum = l_paras.size();
if(_PareNum & 0x01)
{
printf("发现不可识别的参数表示。\n");
return ;
}
for(i = 0; i < _PareNum; i += 2)
{
if(strcmp(strlwr(l_paras[i]), "-tm") == 0)
{
l_TerminateMode = atoi(l_paras[i + 1]);
if(l_TerminateMode < 1 || l_TerminateMode > 3) l_TerminateMode = 2;
l_paras.erase( l_paras.begin() + i, l_paras.begin() + i + 2);
break ;
}
}
_PareNum = l_paras.size();
for(i = 0; i < _PareNum; i += 2)
{
if(strcmp(strlwr(l_paras[i]), "-ifn") == 0)
{
l_pInFileName = l_paras[i + 1];
l_paras.erase( l_paras.begin() + i, l_paras.begin() + i + 2);
break ;
}
}
_PareNum = l_paras.size();
for(i = 0; i < _PareNum; i += 2)
{
if(strcmp(strlwr(l_paras[i]), "-ofn") == 0)
{
l_pOutFileName = l_paras[i + 1];
l_paras.erase( l_paras.begin() + i, l_paras.begin() + i + 2);
break ;
}
}
_PareNum = l_paras.size();
for(i = 0; i < _PareNum; i += 2)
{
if(strcmp(strlwr(l_paras[i]), "-pn") == 0)
{
l_Generates_Time_NatureTimes = atoi(l_paras[i + 1]);
if(l_Generates_Time_NatureTimes < 0) l_Generates_Time_NatureTimes = 0;
l_paras.erase( l_paras.begin() + i, l_paras.begin() + i + 2);
break ;
}
}
_PareNum = l_paras.size();
for(i = 0; i < _PareNum; i += 2)
{
if(strcmp(strlwr(l_paras[i]), "-cn") == 0)
{
l_MemberNum = atoi(l_paras[i + 1]);
if(l_MemberNum < 0) l_MemberNum = 0;
l_paras.erase( l_paras.begin() + i, l_paras.begin() + i + 2);
break ;
}
}
_PareNum = l_paras.size();
for(i = 0; i < _PareNum; i += 2)
{
if(strcmp(strlwr(l_paras[i]), "-cp") == 0)
{
m_CrossProbability = atof(l_paras[i + 1]);
if(m_CrossProbability < 0) m_CrossProbability = 0.8;
l_paras.erase( l_paras.begin() + i, l_paras.begin() + i + 2);
break ;
}
}
_PareNum = l_paras.size();
for(i = 0; i < _PareNum; i += 2)
{
if(strcmp(strlwr(l_paras[i]), "-vp") == 0)
{
m_VarProbability = atof(l_paras[i + 1]);
if(m_VarProbability < 0) m_VarProbability = 0.05;
l_paras.erase( l_paras.begin() + i, l_paras.begin() + i + 2);
break ;
}
}
_PareNum = l_paras.size();
for(i = 0; i < _PareNum; i += 2)
{
if(strcmp(strlwr(l_paras[i]), "-am") == 0)
{
l_AdaptMode = atoi(l_paras[i + 1]);
if(l_AdaptMode < 0 || l_AdaptMode >3) l_AdaptMode = 3;
l_paras.erase( l_paras.begin() + i, l_paras.begin() + i + 2);
break ;
}
}
_PareNum = l_paras.size();
for(i = 0; i < _PareNum; i += 2)
{
if(strcmp(strlwr(l_paras[i]), "-cm") == 0)
{
l_CrossMode = atoi(l_paras[i + 1]);
if(l_CrossMode < 0 || l_CrossMode > 2) l_CrossMode = 2;
l_paras.erase( l_paras.begin() + i, l_paras.begin() + i + 2);
break ;
}
}
_PareNum = l_paras.size();
for(i = 0; i < _PareNum; i += 2)
{
if(strcmp(strlwr(l_paras[i]), "-vm") == 0)
{
l_VariateMode = atoi(l_paras[i + 1]);
if(l_VariateMode < 0 || l_VariateMode > 1) l_VariateMode = 1;
l_paras.erase( l_paras.begin() + i, l_paras.begin() + i + 2);
break ;
}
}
_PareNum = l_paras.size();
if(_PareNum) printf("发现不可识别的参数表示:");
for(i = 0; i < _PareNum; ++i) printf("%s ", l_paras[i]);
WSGeneticAlogrith l_GA;
l_GA.Initial(l_TerminateMode, l_pInFileName, l_pOutFileName, l_Generates_Time_NatureTimes, l_MemberNum, m_CrossProbability, m_VarProbability);
//模式:适配种群模式、交叉模式、变异模式
l_GA.StartCompute(l_AdaptMode, l_CrossMode, l_VariateMode);
l_GA.ShowBestRouteInfo();
}
VOID Help()
{
//INT _MemberNum = 50, FLOAT _CrossProbability = 0.8, FLOAT _VarProbability = 0.05);
printf("==================================================================\n");
printf("* This is Genetic Alogrithm Deom help *\n");
printf("* GA.exe [-tm TERMINATEMODENUM] [-ifn FILENAME] [-ofn FILENAME] *\n");
printf("* [-pn GENERATES_OR_NATURETIMES_TIMES] [-cn COMMUNITYNUM] *\n");
printf("* [-cp CROSSOVERPROBABILITY] [-vp VARIATIONPROBABILITY] *\n");
printf("* [-am ADAPTMODE] [-cm CROSSMODE] [-vm VARIATIONMODE] *\n");
printf("* GA.exe -h | /? *\n");
printf("* GA.exe -gc [-ofn FILENAME] [-n CITYNUM] *\n");
printf("==================================================================\n");
printf("\n");
printf("-tm TERMINATEMODENUM: 设置终止模式。默认值:2。\n");
printf(" TERMINATEMODENUM = 1 限定计算代数; \n");
printf(" TERMINATEMODENUM = 2 限定计算时间;\n");
printf(" TERMINATEMODENUM = 3 自然终止。\n");
printf("\n");
printf("-ifn FILENAME:指定输入城市坐标的文件名。默认值:GAData.txt。\n");
printf(" 文件格式要求:第一行为城市数;以后各行是城市编号和城市坐标。\n");
printf("\n");
printf("-ofn FILENAME:指定输出结果的文件名。默认值:Result.txt。\n");
printf("\n");
printf("-pn GENERATES_OR_NATURETIMES_TIMES:输入的参数值。为整数类型。默认值:10。\n");
printf(" 当终止模式为1时(限制遗传代数),该参数为最大遗传代数;\n");
printf(" 当终止模式为2时(限制遗传时间),该参数为最大遗传时间(单位:秒);\n");
printf(" 当终止模式为3时(自然终止),默认是500代最佳值相同终止。\n");
printf("\n");
printf("-cn COMMUNITYNUM:制定种群大小,为整数类型。当为0(默认)时,按城市数的两倍计算。\n");
printf("\n");
printf("-cp CROSSOVERPROBABILITY:设定交叉概率,为浮点类型。当设为0时,按0.8处理(默认)。\n");
printf("\n");
printf("-vp VARIATIONPROBABILITY:设定变异概率,为浮点类型。当设为0时,按0.05处理(默认)。\n");
printf("\n");
printf("-am ADAPTMODE:设定适应算法类型。默认值:3。\n");
printf(" ADAPTMODE = 0 选取种群中比较好的个体;那些差的个体均被删除/淘汰;\n");
printf(" ADAPTMODE = 1 执行自己定义的轮赌法,更侧重于较好的个体选择;\n");
printf(" ADAPTMODE = 2 执行比较标准的轮赌法,稍侧重于较好的个体选择;\n");
printf(" ADAPTMODE = 3 加入移民,防止早熟。\n");
printf("\n");
printf("-cm CROSSMODE:设置交叉算法的类型。默认值:2。\n");
printf(" CROSSMODE = 0 产生的新个体将直接添加到种群中,不会删除双亲;\n");
printf(" CROSSMODE = 1 将产生的个体替代双亲;\n");
printf(" CROSSMODE = 2 使用了贪心的交叉算法。\n");
printf("\n");
printf("-vm VARIATIONMODE:设定变异算法的类型。默认值:1。\n");
printf(" VARIATIONMODE = 0 使用新产生的变异个体替代原个体;\n");
printf(" VARIATIONMODE = 1 采用贪心的算法,先判断变异的个体是否要好。\n");
printf(" 若好,这替代原个体;否则,不替换。\n");
printf("\n");
printf("-h: HELP,显示帮助信息。\n");
printf("/?: HELP,显示帮助信息。\n");
printf("\n");
printf("-gc:随即生成城市坐标组,并输出到指定文件。\n");
printf("-ofn FILENAME:指定输出文件名。默认值:GAData.txt。\n");
printf("-n CITYNUM:设定城市数目。默认值:30。\n");
printf("\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -