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

📄 ga.cpp

📁 开发环境:Visual C++ .net2003 功能:利用遗传算法求解TSP问题。
💻 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 + -