• Upgrade Hole puncher Mathematical Modeling


    // 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] = { '' };
    char Y[10] = { '' };
    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
    ");
        for (int i = 0; i < 10; i++)
        {
        for (int k = 0; k < 2; k++)
        {
        cout << i << "-" << k << " = " << HoleG[i][k] << "     ";
        }
        cout << endl;
        }
        printf("HoleD
    ");
        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", cost);
        char globalLength[50];
        sprintf(globalLength, "     全局路径长度: %f", 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("
    ", sizeof("
    "), 1, fp);
        fwrite("
    ", sizeof("
    "), 1, fp);
        char discribut[] = "测试打孔的为:";
        fwrite(discribut, sizeof(discribut), 1, fp);
    
        for (i = 0; name[i] != ''; i++)
        {
            ;
        }
        fwrite(name, sizeof(char), i, fp);
        fwrite("
    ", sizeof("
    "), 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("
    ", sizeof("
    "), 1, fp);
        fwrite("
    ", sizeof("
    "), 1, fp);
    
        for (i = 0; buf[i] != ''; i++)        //打印花费
        {
            ;
        }
        fwrite(buf, sizeof(char), i, fp);
        fwrite("
    ", sizeof("
    "), 1, fp);
        for (i = 0; globalLength[i] != ''; i++)        //打印全局路径长度
        {
            ;
        }
        fwrite(globalLength, sizeof(char), i, fp);
        fwrite("
    ", sizeof("
    "), 1, fp);
        fwrite("
    ", sizeof("
    "), 1, fp);
    
        char point_xy[100];
        sprintf(point_xy, "        起点 (x, y)—— (%.0f,%.0f) 
            终点 (x, y)—— (%.0f,%.0f) 
    ",
            Hole[0][0], Hole[0][1], Hole[length-1][0], Hole[length-1][1]);
        for (i = 0; point_xy[i] != ''; i++)    //打印孔坐标
        {
            ;
        }
        fwrite(point_xy, sizeof(char), i, fp);
    
        char coutStr[] = "按照输出的打孔数序,顺序打印坐标点的位置。
    ";
        for (i = 0; coutStr[i] != ''; i++)    //打印孔坐标
        {
            ;
        }
        fwrite(coutStr, sizeof(char), i, fp);
        fwrite("
    ", sizeof("
    "), 1, fp);
        fwrite("
    ", sizeof("
    "), 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] != ''; 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
    ", Hole[i][1]);
            sprintf(printGD_two, "  %7.0f
    ", Hole[i][1]);
    
            for (j = 0; printGD_two[j] != ''; j++)    //打印孔坐标
            {
                ;
            }
            fwrite(printGD_two, sizeof(char), j, fp);
        }
    
    
    
        printf("========================================================
    ");
        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 
    ", 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 初始化问题
    ");
            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 
     "
                << 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!
    ";
            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是第二问 
    ";
        cin >> x;
    
        switch (x)
        {
        case 1:
            firstQuestion();
            break;
        case 2:
            secondQusetion();
            break;
    
        default:
            break;
    
        }
    
    
    
        return 0;
    }
  • 相关阅读:
    通过递归展示树状结构
    Description Resource Path Location Type Failure to transfer org.apache.maven.plugins:maven-surefire-
    Entity与Entity之间的相互转化
    java 记录数据持续变化时间
    Springmvc 异常处理
    Spring Validation 验证
    Jmeter的操作流程
    Python基础字符串前加u,r,b,f含义
    linux连接Windows系统之项目连接
    Jmeter 连接远程测压__(负载测试)
  • 原文地址:https://www.cnblogs.com/hgonlywj/p/4842698.html
Copyright © 2020-2023  润新知