// AntColony.cpp : 定义控制台应用程序的入口点。
//
#include<iostream>
#include<math.h>
#include<time.h>
#include<stdio.h>
#include <fstream>
#include <string>
#include <iostream>
#include <vector>
using namespace std;
#include <fstream>
#include <sstream> //使用stringstream需要引入这个头文件
//打印系列
//GD-E-B-AC-HF-FG-EGJ-DI-CIJ
//孔坐标
double HoleA[660][2] = { (0, 0) };
double HoleB[788][2] = { (0, 0) };
double HoleC[270][2] = { (0, 0) };
double HoleD[212][2] = { (0, 0) };
double HoleE[95][2] = { (0, 0) };
double HoleF[34][2] = { (0, 0) };
double HoleG[20][2] = { (0, 0) };
double HoleH[6][2] = { (0, 0) };
double HoleI[10][2] = { (0, 0) };
double HoleJ[28][2] = { (0, 0) };
int N = 0;
int L_n = 0;
double Hole[1500][2] = { (0, 0) };
double holeLength = 0; //定义数组长度。
int HoleLength[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //记录读入数组的长度
//从1-10,分别对应A,B-到-J
//double C[N][2] = {0 };
struct Point
{
int x;
int y;
};
FILE *fp;
char buf[256];
char *p;
char X[10] = { '\0' };
char Y[10] = { '\0' };
int CoorX;
int CoorY;
char HolePattern = '0';
//----------上面参数是固定的,下面的参数是可变的-----------
//蚂蚁数量
#define M 75
//最大循环次数NcMax
int NcMax = 1;
//信息启发因子,期望启发式因子,全局信息素挥发参数,局部信息素挥发参数, 状态转移公式中的q0
double alpha = 2, beta = 5, rou = 0.1, alpha1 = 0.1, qzero = 0.1;
//-----------问题三结束------------------------------------------------------------------------
//===========================================================================================================
//局部更新时候使用的的常量,它是由最近邻方法得到的一个长度
//什么是最近邻方法?:)就是从源节点出发,每次选择一个距离最短的点来遍历所有的节点得到的路径
//每个节点都可能作为源节点来遍历
double Lnn;
//矩阵表示两孔之间的距离
double allDistance[1500][1500];
//===========================================================================================================
//计算两个孔之间的距离
double calculateDistance(double Hole[][2], int i, int j)
{
return sqrt(pow((Hole[i][0] - Hole[j][0]), 2.0) + pow((Hole[i][1] - Hole[j][1]), 2.0));
}
//===========================================================================================================
//由矩阵表示两两城市之间的距离
void calculateAllDistance()
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (i != j)
{
allDistance[i][j] = calculateDistance(Hole, i, j);
allDistance[j][i] = allDistance[i][j];
}
}
}
}
//获得经过n个城市的路径长度
double calculateSumOfDistance(int* tour)
{
double sum = 0;
for (int i = 0; i< N; i++)
{
int row = *(tour + 2 * i);
int col = *(tour + 2 * i + 1);
sum += allDistance[row][col];
}
return sum;
}
class ACSAnt;
class AntColonySystem
{
private:
double info[1500][1500], visible[1500][1500]; //节点之间的信息素强度,节点之间的能见度
public:
AntColonySystem()
{
}
//计算当前节点到下一节点转移的概率
double Transition(int i, int j);
//局部更新规则
void UpdateLocalPathRule(int i, int j);
//初始化
void InitParameter(double value);
//全局信息素更新
void UpdateGlobalPathRule(int* bestTour, int globalBestLength);
};
//计算当前节点到下一节点转移的概率
double AntColonySystem::Transition(int i, int j)
{
if (i != j)
{
return (pow(info[i][j], alpha) * pow(visible[i][j], beta));
}
else
{
return 0.0;
}
}
//局部更新规则
void AntColonySystem::UpdateLocalPathRule(int i, int j)
{
info[i][j] = (1.0 - alpha1) * info[i][j] + alpha1 * (1.0 / (N * Lnn));
info[j][i] = info[i][j];
}
//初始化
void AntColonySystem::InitParameter(double value)
{
//初始化路径上的信息素强度tao0
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
info[i][j] = value;
info[j][i] = value;
if (i != j)
{
visible[i][j] = 1.0 / allDistance[i][j];
visible[j][i] = visible[i][j];
}
}
}
}
//全局信息素更新
void AntColonySystem::UpdateGlobalPathRule(int* bestTour, int globalBestLength)
{
for (int i = 0; i < N; i++)
{
int row = *(bestTour + 2 * i);
int col = *(bestTour + 2 * i + 1);
info[row][col] = (1.0 - rou) * info[row][col] + rou * (1.0 / globalBestLength);
info[col][row] = info[row][col];
}
}
class ACSAnt
{
private:
AntColonySystem* antColony;
protected:
int startCity, cururentCity;//初始城市编号,当前城市编号
int allowed[1500];//禁忌表
int Tour[1500][2];//当前路径
int currentTourIndex;//当前路径索引,从0开始,存储蚂蚁经过城市的编号
public:
ACSAnt(AntColonySystem* acs, int start)
{
antColony = acs;
startCity = start;
}
//开始搜索
int* Search();
//选择下一节点
int Choose();
//移动到下一节点
void MoveToNextCity(int nextCity);
};
//开始搜索
int* ACSAnt::Search()
{
cururentCity = startCity;
int toCity;
currentTourIndex = 0;
for (int i = 0; i < N; i++)
{
allowed[i] = 1;
}
allowed[cururentCity] = 0;
int endCity;
int count = 0;
do
{
count++;
endCity = cururentCity;
toCity = Choose();
if (toCity >= 0)
{
MoveToNextCity(toCity);
antColony->UpdateLocalPathRule(endCity, toCity);
cururentCity = toCity;
}
} while (toCity >= 0);
MoveToNextCity(startCity);
antColony->UpdateLocalPathRule(endCity, startCity);
return *Tour;
}
//选择下一节点
int ACSAnt::Choose()
{
int nextCity = -1;
double q = rand() / (double)RAND_MAX;
//如果 q <= q0,按先验知识,否则则按概率转移,
if (q <= qzero)
{
double probability = -1.0;//转移到下一节点的概率
for (int i = 0; i < N; i++)
{
//去掉禁忌表中已走过的节点,从剩下节点中选择最大概率的可行节点
if (1 == allowed[i])
{
double prob = antColony->Transition(cururentCity, i);
if (prob > probability)
{
nextCity = i;
probability = prob;
}
}
}
}
else
{
//按概率转移
double p = rand() / (double)RAND_MAX;//生成一个随机数,用来判断落在哪个区间段
double sum = 0.0;
double probability = 0.0;//概率的区间点,p 落在哪个区间段,则该点是转移的方向
//计算概率公式的分母的值
for (int i = 0; i < N; i++)
{
if (1 == allowed[i])
{
sum += antColony->Transition(cururentCity, i);
}
}
for (int j = 0; j < N; j++)
{
if (1 == allowed[j] && sum > 0)
{
probability += antColony->Transition(cururentCity, j) / sum;
if (probability >= p || (p > 0.9999 && probability > 0.9999))
{
nextCity = j;
break;
}
}
}
}
return nextCity;
}
//移动到下一节点
void ACSAnt::MoveToNextCity(int nextCity)
{
allowed[nextCity] = 0;
Tour[currentTourIndex][0] = cururentCity;
Tour[currentTourIndex][1] = nextCity;
currentTourIndex++;
cururentCity = nextCity;
}
//------------------------------------------
//选择下一个节点,配合下面的函数来计算的长度
int ChooseNextNode(int currentNode, int visitedNode[])
{
int nextNode = -1;
double shortDistance = 0.0;
for (int i = 0; i < N; i++)
{
//去掉已走过的节点,从剩下节点中选择距离最近的节点
if (1 == visitedNode[i])
{
if (shortDistance == 0.0)
{
shortDistance = allDistance[currentNode][i];
nextNode = i;
}
if (shortDistance < allDistance[currentNode][i])
{
nextNode = i;
}
}
}
return nextNode;
}
//给一个节点由最近邻距离方法计算长度
double CalAdjacentDistance(int node)
{
double sum = 0.0;
int visitedNode[1500];
for (int j = 0; j < N; j++)
{
visitedNode[j] = 1;
}
visitedNode[node] = 0;
int currentNode = node;
int nextNode;
do
{
nextNode = ChooseNextNode(currentNode, visitedNode);
if (nextNode >= 0)
{
sum += allDistance[currentNode][nextNode];
currentNode = nextNode;
visitedNode[currentNode] = 0;
}
} while (nextNode >= 0);
sum += allDistance[currentNode][node];
return sum;
}
//---------------------------------结束---------------------------------------------
//---------------------------------测试----------------------------------------------
/********************************************************************************************************/
//函数名称:合并二维数组
//参数1,2。要合并的两个二维数组,参数3,合并数组1的长度。参数4,合并数组2的长度。
//返回:二维数组的首地址。
/********************************************************************************************************/
void combineArray(double arr_one[][2], double arr_two[][2], int combinelength_one, int combinelength_two, double Hole[][2])
{
//申请空间
//double ** combine_array = new double *[combinelength_one + combinelength_two];
//for (int i = 0; i < (combinelength_one + combinelength_two); i++)
//{
// combine_array[i] = new double[2];
//}
//使用空间
for (int j = 0; j < combinelength_one + combinelength_two; j++)
{
for (int k = 0; k < 2; k++)
{
if (j < combinelength_one)
{
Hole[j][k] = arr_one[j][k];
}
else
{
Hole[j][k] = arr_two[j - combinelength_one][k];
}
}
}
}
/********************************************************************************************************/
void printCombineArray(double Hole[][2], int length)
{
cout << length << endl;
for (int i = 0; i < length; i++)
{
for (int k = 0; k < 2; k++)
{
cout << i << "-" << k << " = " << Hole[i][k] << " ";
}
cout << endl;
}
}
/********************************************************************************************************/
void combineTest()
{
//计算要合并的2个数组的总长度。
int combinelength_one = sizeof(HoleF) / (2 * 8);
int combinelength_two = sizeof(HoleG) / (2 * 8);
/*printf("HoleG\n");
for (int i = 0; i < 10; i++)
{
for (int k = 0; k < 2; k++)
{
cout << i << "-" << k << " = " << HoleG[i][k] << " ";
}
cout << endl;
}
printf("HoleD\n");
for (int i = 0; i < 10; i++)
{
for (int k = 0; k < 2; k++)
{
cout << i << "-" << k << " = " << HoleD[i][k] << " ";
}
cout << endl;
}*/
//Hole = combineArray(HoleF, HoleG, combinelength_one, combinelength_two);
//printCombineArray(Hole);
}
/********************************************************************************************************/
void writeData(char name[], int globalTour[][2], int length, double cost, double globalBestLength)
{
char buf[50];
sprintf(buf, " 最后的总花费: %.4lf\0", cost);
char globalLength[50];
sprintf(globalLength, " 全局路径长度: %f\0", globalBestLength);
FILE *fp;
char ch;
int i;
if ((fp = fopen("data.txt", "a+")) == NULL)
{
printf("Cannot open file strike any key exit!");
exit(1);
}
fwrite("\n", sizeof("\n"), 1, fp);
fwrite("\n", sizeof("\n"), 1, fp);
char discribut[] = "测试打孔的为:";
fwrite(discribut, sizeof(discribut), 1, fp);
for (i = 0; name[i] != '\0'; i++)
{
;
}
fwrite(name, sizeof(char), i, fp);
fwrite("\n", sizeof("\n"), 1, fp);
for (i = 0; i < length; i++)
{
//cout << globalTour[i][0] << "-";
char num[5] = "0";
_itoa(globalTour[i][0], num, 10);
fwrite(num, sizeof(char), 5, fp);
}
fwrite("\n", sizeof("\n"), 1, fp);
fwrite("\n", sizeof("\n"), 1, fp);
for (i = 0; buf[i] != '\0'; i++) //打印花费
{
;
}
fwrite(buf, sizeof(char), i, fp);
fwrite("\n", sizeof("\n"), 1, fp);
for (i = 0; globalLength[i] != '\0'; i++) //打印全局路径长度
{
;
}
fwrite(globalLength, sizeof(char), i, fp);
fwrite("\n", sizeof("\n"), 1, fp);
fwrite("\n", sizeof("\n"), 1, fp);
char point_xy[100];
sprintf(point_xy, " 起点 (x, y)—— (%.0f,%.0f) \n 终点 (x, y)—— (%.0f,%.0f) \n\0",
Hole[0][0], Hole[0][1], Hole[length-1][0], Hole[length-1][1]);
for (i = 0; point_xy[i] != '\0'; i++) //打印孔坐标
{
;
}
fwrite(point_xy, sizeof(char), i, fp);
char coutStr[] = "按照输出的打孔数序,顺序打印坐标点的位置。\n";
for (i = 0; coutStr[i] != '\0'; i++) //打印孔坐标
{
;
}
fwrite(coutStr, sizeof(char), i, fp);
fwrite("\n", sizeof("\n"), 1, fp);
fwrite("\n", sizeof("\n"), 1, fp);
int j = 0;
//打印孔坐标的信息。
for (i = 0; i < length; i++)
{
//cout << "起点坐标X:" << Hole[0][0] << " " << "起点坐标Y:" << Hole[0][1] << endl;
//char num[5] = "0";
//_itoa(globalTour[i][0], Hole[i][0], 10);
char printGD_one[50] = "";
// sprintf(printGD_one, "第%3d个 坐标是——X: %.3f", i, Hole[i][0]);
sprintf(printGD_one, "%7.0f", Hole[i][0]);
for (j = 0; printGD_one[j] != '\0'; j++) //打印孔坐标
{
;
}
fwrite(printGD_one, sizeof(char), j, fp);
//_itoa(globalTour[i][0], Hole[i][1], 10);
char printGD_two[50] = "";
//sprintf(printGD_two, " 坐标Y: %.3f\n", Hole[i][1]);
sprintf(printGD_two, " %7.0f\n", Hole[i][1]);
for (j = 0; printGD_two[j] != '\0'; j++) //打印孔坐标
{
;
}
fwrite(printGD_two, sizeof(char), j, fp);
}
printf("========================================================\n");
fclose(fp);
}
/********************************************************************************************************/
void actionFunction(char str_Gd[])
{
time_t timer, timerl;
time(&timer);
unsigned long seed = timer;
seed %= 56000;
srand((unsigned int)seed);
//由矩阵表示两两城市之间的距离
calculateAllDistance();
//蚁群系统对象
AntColonySystem* acs = new AntColonySystem();
ACSAnt* ants[M];
//蚂蚁均匀分布在城市上
for (int k = 0; k < M; k++)
{
ants[k] = new ACSAnt(acs, (int)(k%N));
}
calculateAllDistance();
//随机选择一个节点计算由最近邻方法得到的一个长度
int node = rand() % N;
Lnn = CalAdjacentDistance(node);
//各条路径上初始化的信息素强度
double initInfo = 1 / (N * Lnn);
acs->InitParameter(initInfo);
//全局最优路径
int globalTour[1500][2];
//全局最优长度
double globalBestLength = 0.0;
for (int i = 0; i < NcMax; i++)
{
//局部最优路径
int localTour[1500][2];
//局部最优长度
double localBestLength = 0.0;
//当前路径长度
double tourLength;
for (int j = 0; j < M; j++)
{
int* tourPath = ants[j]->Search();
tourLength = calculateSumOfDistance(tourPath);
//局部比较,并记录路径和长度
if (tourLength < localBestLength || abs(localBestLength - 0.0) < 0.000001)
{
for (int m = 0; m < N; m++)
{
int row = *(tourPath + 2 * m);
int col = *(tourPath + 2 * m + 1);
localTour[m][0] = row;
localTour[m][1] = col;
}
localBestLength = tourLength;
}
}
//全局比较,并记录路径和长度
if (localBestLength < globalBestLength || abs(globalBestLength - 0.0) < 0.000001)
{
for (int m = 0; m < N; m++)
{
globalTour[m][0] = localTour[m][0];
globalTour[m][1] = localTour[m][1];
}
globalBestLength = localBestLength;
}
acs->UpdateGlobalPathRule(*globalTour, globalBestLength);
//输出所有蚂蚁循环一次后的迭代最优路径
//cout<<"第 "<<i + 1<<" 迭代最优路径:"<<localBestLength<<"."<<endl;
for (int m = 0; m < N; m++)
{
// cout<<localTour[m][0]<<".";
}
cout << endl << "迭代次数————" << i+1 << endl;
}
//输出全局最优路径
cout << " 全局最优路径长度:" << globalBestLength << endl;
cout << " 全局最优路径起点和终点:" << endl;
cout << " 起点坐标X:" << Hole[0][0] << " " << "起点坐标Y:" << Hole[0][1] << endl;
cout << " 终点坐标X:" << Hole[N-1][0] << " " << "终点坐标Y:" << Hole[N-1][1] << endl;
cout << " 当前迭代迭代次数:" << NcMax << endl;
cout << "打印最优路径坐标点的顺序:" << endl;
int num_row = 0;
for (int m = 0; m < N; m++)
{
if (num_row == 15)
{
num_row = 0;
cout << endl;
}
num_row++;
if (m == (N - 1))
{
//cout << " " << globalTour[m][0] << endl;
printf("%3d \n", globalTour[m][0]);
}
else
{
//cout << " " << globalTour[m][0] << "->";
printf("%3d ->", globalTour[m][0]);
}
}
cout << endl;
time(&timerl);
int t = timerl - timer;
double cost = globalBestLength / 100000 * 25.4* 0.06;
//printf ("加工孔需要的花费%f", cost);
cout << "加工--" << str_Gd << "--孔需要的花费" << cost << endl;
writeData(str_Gd, globalTour, N, cost, globalBestLength);
}
bool testHole()
{
if (Hole == NULL)
{
printf("Hole 初始化问题\n");
return 0;
}
else if (N < 0)
{
cout << "不存在点" << endl;
return 0;
}
else if (N == 1)
{
cout << "因为在这个象限,该孔只有一个点,只存在起始点,不存在终止点,自己计算。" << endl << endl;
return 0;
}
else
{
return 1;
}
}
int TypeTest()
{
bool singal_out = false;
int num_choice = 0;
while (!singal_out)
{
Hole[1500][2] = { (0.0, 0.0) };
cout << "input number , 0 is exit, others is next action \n "
<< endl << "1----GD"
<< endl << "2----E"
<< endl << "3----A"
<< endl << "4----B"
<< endl << "5----AC"
<< endl << "6----HF"
<< endl << "7----FG"
<< endl << "8----DI"
<< endl << "9----EGJ"
<< endl << "10----CIJ"
<< endl << "11----设置迭代次数,初始化,默认为1次。"
<< endl << "12---C"
<< endl << "13---D"
<< endl << "14---F"
<< endl << "15---G"
<< endl << "16---H"
<< endl << "17---I"
<< endl << "18---J"
<< endl << "19---CJ"
<< endl << "20---JC"
<< endl << "21---EJ"
<< endl << " ------------------------ " << endl;
cin >> num_choice;
switch (num_choice)
{
case 0:
{
singal_out = true;
break;
}
case 1: //GD
{
int combinelength_one = HoleLength[7];
int combinelength_two = HoleLength[4];
N = combinelength_one + combinelength_two;
//L_n = N - 1;
cout << "点的总数: " << N << endl;
combineArray(HoleG, HoleD, combinelength_one, combinelength_two, Hole);
//printCombineArray(Hole, N);
if (0 == testHole())
{
return 0;
}
char str_Gd[3] = "GD";
actionFunction(str_Gd);
break;
}
case 2: //E
{
int combinelength_one = HoleLength[5];
for (int j = 0; j < combinelength_one; j++)
{
for (int k = 0; k < 2; k++)
{
Hole[j][k] = HoleE[j][k];
}
}
N = combinelength_one;
cout << "点的总数: " << N << endl;
if (0 == testHole())
{
return 0;
}
char str_Gd[2] = "E";
actionFunction(str_Gd);
break;
}
case 3: //A
{
int combinelength_one = HoleLength[1];
for (int j = 0; j < combinelength_one; j++)
{
for (int k = 0; k < 2; k++)
{
Hole[j][k] = HoleA[j][k];
}
}
N = combinelength_one;
cout << "点的总数: " << N << endl;
if (0 == testHole())
{
return 0;
}
if (N == 0)
{
cout << "因为一个点,只存在起始点,不存在终止点,自己计算" << endl;
return 0;
}
char str_Gd[2] = "A";
actionFunction(str_Gd);
break;
}
case 4: //B
{
int combinelength_one = HoleLength[2];
for (int j = 0; j < combinelength_one; j++)
{
for (int k = 0; k < 2; k++)
{
Hole[j][k] = HoleB[j][k];
}
}
N = combinelength_one;
cout << "点的总数: " << N << endl;
if (0 == testHole())
{
return 0;
}
char str_Gd[2] = "B";
actionFunction(str_Gd);
break;
}
case 5: //AC
{
int combinelength_one = HoleLength[1];
int combinelength_two = HoleLength[3] ;
N = combinelength_one + combinelength_two;
cout << "点的总数: " << N << endl;
combineArray(HoleA, HoleC, combinelength_one, combinelength_two, Hole);
if (0 == testHole())
{
return 0;
}
char str_Gd[3] = "AC";;
actionFunction(str_Gd);
break;
}
case 6: //HF
{
int combinelength_one = HoleLength[8];
int combinelength_two = HoleLength[6] ;
N = combinelength_one + combinelength_two;
cout << "点的总数: " << N << endl;
for (int j = 0; j < N; j++)
{
for (int k = 0; k < 2; k++)
{
if (j < combinelength_one)
{
Hole[j][k] = HoleH[j][k];
}
else
{
Hole[j][k] = HoleF[j - combinelength_one][k];
}
}
}
if (0 == testHole())
{
return 0;
}
char str_Gd[3] = "HF";
actionFunction(str_Gd);
break;
}
case 7: //FG
{
int combinelength_one = HoleLength[6];
int combinelength_two = HoleLength[7] ;
N = combinelength_one + combinelength_two;
cout << "点的总数: " << N << endl;
combineArray(HoleF, HoleG, combinelength_one, combinelength_two, Hole);
char str_Gd[3] = "FG";
actionFunction(str_Gd);
break;
}
case 8: //DI
{
int combinelength_one = HoleLength[4];
int combinelength_two = HoleLength[9] ;
N = combinelength_one + combinelength_two;
cout << "点的总数: " << N << endl;
combineArray(HoleD, HoleI, combinelength_one, combinelength_two, Hole);
if (0 == testHole())
{
return 0;
}
char str_Gd[3] = "DI";
actionFunction(str_Gd);
break;
}
case 9: //EGJ
{
int combinelength_one = HoleLength[5];
int combinelength_two = HoleLength[7] ;
int combinelength_thr = HoleLength[10] ;
N = combinelength_one + combinelength_two + combinelength_thr;
cout << "点的总数: " << N << endl;
for (int j = 0; j < N; j++)
{
for (int k = 0; k < 2; k++)
{
if (j < combinelength_one)
{
Hole[j][k] = HoleE[j][k];
}
else if (j >= combinelength_one && j <combinelength_one + combinelength_two)
{
Hole[j][k] = HoleG[j - combinelength_one][k];
}
else
{
Hole[j][k] = HoleJ[j - combinelength_one - combinelength_two][k];
}
}
}
//printCombineArray(Hole, N);
if (0 == testHole())
{
return 0;
}
char str_Gd[4] = "EGJ";
actionFunction(str_Gd);
break;
}
case 10: //CIJ
{
int combinelength_one = HoleLength[3];
int combinelength_two = HoleLength[9] ;
int combinelength_thr = HoleLength[10] ;
N = combinelength_one + combinelength_two + combinelength_thr;
cout << "点的总数: " << N << endl;
for (int j = 0; j < N; j++)
{
for (int k = 0; k < 2; k++)
{
if (j < combinelength_one)
{
Hole[j][k] = HoleC[j][k];
}
else if (j >= combinelength_one && j <combinelength_one + combinelength_two)
{
Hole[j][k] = HoleI[j - combinelength_one][k];
}
else
{
Hole[j][k] = HoleJ[j - combinelength_one - combinelength_two][k];
}
}
}
//printCombineArray(Hole, N);
if (0 == testHole())
{
return 0;
}
char str_Gd[4] = "CIJ";
actionFunction(str_Gd);
break;
}
case 11:
{
int number_max = 0;
cout << "输入最大迭代次数,默认为1次。" << endl;
cin >> number_max;
NcMax = number_max; //最大迭代次数
break;
}
case 12:
{
int combinelength_one = HoleLength[3];
for (int j = 0; j < combinelength_one; j++)
{
for (int k = 0; k < 2; k++)
{
Hole[j][k] = HoleC[j][k];
}
}
N = combinelength_one;
cout << "点的总数: " << N << endl;
if (0 == testHole())
{
return 0;
}
char str_Gd[2] = "C";
actionFunction(str_Gd);
break;
}
case 13:
{
int combinelength_one = HoleLength[4];
for (int j = 0; j < combinelength_one; j++)
{
for (int k = 0; k < 2; k++)
{
Hole[j][k] = HoleD[j][k];
}
}
N = combinelength_one;
cout << "点的总数: " << N << endl;
if (0 == testHole())
{
return 0;
}
char str_Gd[2] = "D";
actionFunction(str_Gd);
break;
}
case 14:
{
int combinelength_one = HoleLength[6];
for (int j = 0; j < combinelength_one; j++)
{
for (int k = 0; k < 2; k++)
{
Hole[j][k] = HoleF[j][k];
}
}
N = combinelength_one;
cout << "点的总数: " << N << endl;
if (0 == testHole())
{
return 0;
}
char str_Gd[2] = "F";
actionFunction(str_Gd);
break;
}
case 15:
{
int combinelength_one = HoleLength[7];
for (int j = 0; j < combinelength_one; j++)
{
for (int k = 0; k < 2; k++)
{
Hole[j][k] = HoleG[j][k];
}
}
N = combinelength_one;
cout << "点的总数: " << N << endl;
if (0 == testHole())
{
return 0;
}
char str_Gd[2] = "G";
actionFunction(str_Gd);
break;
}
case 16:
{
int combinelength_one = HoleLength[8];
for (int j = 0; j < combinelength_one; j++)
{
for (int k = 0; k < 2; k++)
{
Hole[j][k] = HoleH[j][k];
}
}
N = combinelength_one;
cout << "点的总数: " << N << endl;
if (0 == testHole())
{
return 0;
}
char str_Gd[2] = "H";
actionFunction(str_Gd);
break;
}
case 17:
{
int combinelength_one = HoleLength[9];
for (int j = 0; j < combinelength_one; j++)
{
for (int k = 0; k < 2; k++)
{
Hole[j][k] = HoleI[j][k];
}
}
N = combinelength_one;
cout << "点的总数: " << N << endl;
if (0 == testHole())
{
return 0;
}
char str_Gd[2] = "I";
actionFunction(str_Gd);
break;
}
case 18:
{
int combinelength_one = HoleLength[10];
for (int j = 0; j < combinelength_one; j++)
{
for (int k = 0; k < 2; k++)
{
Hole[j][k] = HoleJ[j][k];
}
}
N = combinelength_one;
cout << "点的总数: " << N << endl;
if (0 == testHole())
{
return 0;
}
char str_Gd[2] = "J";
actionFunction(str_Gd);
break;
}
case 19:
{
int combinelength_one = HoleLength[3];
int combinelength_two = HoleLength[10];
combineArray(HoleC, HoleJ, combinelength_one, combinelength_two, Hole);
if (0 == testHole())
{
return 0;
}
N = combinelength_one + combinelength_two;
cout << "点的总数: " << N << endl;
if (0 == testHole())
{
return 0;
}
char str_Gd[3] = "CJ";
actionFunction(str_Gd);
break;
}
case 20:
{
int combinelength_one = HoleLength[10];
int combinelength_two = HoleLength[3];
combineArray(HoleJ, HoleC, combinelength_one, combinelength_two, Hole);
if (0 == testHole())
{
return 0;
}
N = combinelength_one + combinelength_two;
cout << "点的总数: " << N << endl;
if (0 == testHole())
{
return 0;
}
char str_Gd[3] = "JC";
actionFunction(str_Gd);
break;
}
case 21:
{
int combinelength_one = HoleLength[5];
int combinelength_two = HoleLength[10];
combineArray(HoleE, HoleJ, combinelength_one, combinelength_two, Hole);
if (0 == testHole())
{
return 0;
}
N = combinelength_one + combinelength_two;
cout << "点的总数: " << N << endl;
if (0 == testHole())
{
return 0;
}
char str_Gd[3] = "EJ";
actionFunction(str_Gd);
break;
}
default:
return 0;
break;
}
}
}
//--------------------------第二问--------------------------------------------------
//首先读分区文件。
template <class Type>
Type stringToNum(const string& str)
{
istringstream iss(str);
Type num;
iss >> num;
return num;
}
//初始化数组,参数1是该行字符串,参数2是要初始化的数组。参数3是初始化那个数组
void initHolo(string s_l, double init_hole[][2], int singal)
{
int Xs = s_l.find("X");
int Ys = s_l.find("Y");
string str = s_l.substr(Xs + 1, Ys);
init_hole[HoleLength[singal]][0] = stringToNum<int>(str);
str = s_l.substr(Ys + 1);
init_hole[HoleLength[singal]][1] = stringToNum<int>(str);
}
//--------------------------第二问测试函数--------------------------------------------------
void Qusetion_init(string filename)
{
//string filename = "one.txt";
ifstream fin(filename, _IOS_Nocreate);
if (!fin){
cout << "File open error!\n";
return;
}
char line[100];
string s_l = "";
int singal = 0; //信号
while (!fin.eof()) //判断文件是否读结束
{
s_l = "";
fin.getline(line, 100);
s_l = line;
if (-1 != s_l.find("A"))
{
singal = 1;
cout << s_l << endl;
}
else if (-1 != s_l.find("B"))
{
singal = 2;
cout << s_l << endl;
}
else if (-1 != s_l.find("C"))
{
singal = 3;
cout << s_l << endl;
}
else if (-1 != s_l.find("D"))
{
singal = 4;
cout << s_l << endl;
}
else if (-1 != s_l.find("E"))
{
singal = 5;
cout << s_l << endl;
}
else if (-1 != s_l.find("F"))
{
singal = 6;
cout << s_l << endl;
}
else if (-1 != s_l.find("G"))
{
singal = 7;
cout << s_l << endl;
}
else if (-1 != s_l.find("H"))
{
singal = 8;
cout << s_l << endl;
}
else if (-1 != s_l.find("I"))
{
singal = 9;
cout << s_l << endl;
}
else if (-1 != s_l.find("J"))
{
singal = 10;
cout << s_l << endl;
}
else
{
switch (singal)
{
case 1:
{
initHolo(s_l, HoleA, singal);
HoleLength[singal] = HoleLength[singal] + 1; //计数
break;
}
case 2:
{
initHolo(s_l, HoleB, singal);
HoleLength[singal] = HoleLength[singal] + 1; //计数
break;
}
case 3:
{
initHolo(s_l, HoleC, singal);
HoleLength[singal] = HoleLength[singal] + 1; //计数
break;
}
case 4:
{
initHolo(s_l, HoleD, singal);
HoleLength[singal] = HoleLength[singal] + 1; //计数
break;
}
case 5:
{
initHolo(s_l, HoleE, singal);
HoleLength[singal] = HoleLength[singal] + 1; //计数
break;
}
case 6:
{
initHolo(s_l, HoleF, singal);
HoleLength[singal] = HoleLength[singal] + 1; //计数
break;
}
case 7:
{
initHolo(s_l, HoleG, singal);
HoleLength[singal] = HoleLength[singal] + 1; //计数
break;
}
case 8:
{
initHolo(s_l, HoleH, singal);
HoleLength[singal] = HoleLength[singal] + 1; //计数
break;
}
case 9:
{
initHolo(s_l, HoleI, singal);
HoleLength[singal] = HoleLength[singal] + 1; //计数
break;
}
case 10:
{
initHolo(s_l, HoleJ, singal);
HoleLength[singal] = HoleLength[singal] + 1; //计数
break;
}
default:
break;
}
}
}
fin.close();
cout << "该分区所对应的————每个点孔的个数:" << endl;
for (int m = 1; m < sizeof(HoleLength)/4; m++)
{
HoleLength[m] = HoleLength[m] - 1;
cout << HoleLength[m] << ", ";
}
cout << endl;
}
void secondQusetion()
{
//初始化数据。
string filename = "";
cout << "请选择分区测试 1————one, 2————two, 3————thr, 4————fur" << endl;
int x;
cin >> x;
switch (x)
{
case 1:
filename = "one.txt";
break;
case 2:
filename = "two.txt";
break;
case 3:
filename = "thr.txt";
break;
case 4:
filename = "fur.txt";
break;
case 5:
filename = "1.txt";
break;
default:
cout << "输入错误" << endl;
break;
}
Qusetion_init(filename);
TypeTest();
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
}
void firstQuestion()
{
//DataInit();
Qusetion_init("1.txt");
//combineTest();
//printCombineArray(Hole);
TypeTest();
}
//--------------------------主函数--------------------------------------------------
int main()
{
int x = 0;
cout << "请输入1或者2,选择测试种类, 1是第一问,2是第二问 \n";
cin >> x;
switch (x)
{
case 1:
firstQuestion();
break;
case 2:
secondQusetion();
break;
default:
break;
}
return 0;
}