📄 tsp.cpp
字号:
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <time.h>
#include <stdlib.h>
#include "def.h"
#include "TSP.h"
//static DISTANCE dist[_CITY_AMOUNT][_CITY_AMOUNT];
char strFilename[100];
void funLoadData(DISTANCE distance[_CITY_AMOUNT][_CITY_AMOUNT]);
void main()
{
string str = strFilename;
int nPos;
clock_t start, finish;
n=0;
cout << " |=========用鼠标拖入TSP文件,按回车键。=======|" << endl ;
gets(strFilename);
nPos = str.find("\\");
while (nPos != -1) {
str = str.substr(0,nPos) + "\\" + str.substr(nPos) ;
nPos = str.find("\\",nPos+2);
}
if (str.find("\"") != -1)
{
str = str.substr(1,str.length()-2);
}
cout << strFilename << endl;
printf("输入进化代数:");
scanf("%d",&_TIMES);
start=clock();
DISTANCE distance[_CITY_AMOUNT][_CITY_AMOUNT];
funLoadData(distance);
Csga<_CONTAINER, _CONTAINER_P> CUnit((DISTANCE *)distance); //初始化
//开始遗传算法
if(!CUnit.fnCreateRandomGene()) //产生随机的基因
{
exit(0);
}
// CUnit.funSortDist();
//循环基因编译,杂交,淘汰过程
CUnit.fnEvalAll();
for ( int i = 0; i < _TIMES; ++i )
{
CUnit.fnDispProbability();
CUnit.fnGeneAberrance(); //基因变异
CUnit.fnDispProbability();
CUnit.fnGeneMix(); //基因杂交
CUnit.fnEvalAll();
//每隔_DISP_INTERVAL显示一次结果
if ( (i+1)%_DISP_INTERVAL == 0 || i == 0)
{
cout << "第" << i+1 << "代" << std::endl;
CUnit.fnDispProbability();
CUnit.fnDispHistoryMin();
}
}
CUnit.fnOutputFile();
finish=clock();
float nTime=(float)(finish-start)/CLOCKS_PER_SEC;
cout << endl << "OK ! It took " << nTime << " seconds." << endl;
getchar();
}
/*从文件中读取数据*/
void funLoadData(DISTANCE distance[_CITY_AMOUNT][_CITY_AMOUNT])
{
FILE *fp;
int i=0,j;
char sTemp[64];
// if (!(fp = fopen("TSP_china30.txt","r"))) return;
// if (!(fp = fopen("NODES.txt","r"))) return;
if (!(fp = fopen(strFilename,"r"))) return;
while (i<3)
{
fgets(szTspInfo[i++],1024,fp);
// fgets(sTemp,1024,fp);
// strcpy(szTspInfo[i++],sTemp);
}
fscanf(fp,"%s",sTemp);
fscanf(fp,"%d",&n);
i = 0;
while (i++<5)
{
fgets(sTemp,1024,fp);
}
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
fscanf(fp,"%s",sTemp);
distance[i][j] = atoi(sTemp);
} //for (j=0;j<n;j++)
} //for (i=0;i<n;i++)
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -