//遗传算法求解图的最小连通支配集
int findMCDSWithGeneticAlgorithm() {
    
    //计算出度最大的节点,把它设为生成初始种群的起始节点
    calculateDegree();
    int startNode = 0;
    for (int i = 1; i < countOfNodes; i++) {
        if (degreeArr[i] > degreeArr[startNode]) {
            startNode = i;
        }
        nodesArr[i] = i;
    }
    //生成支配集
    for (int i = 0; i < countOfDominatingSets; i++) {
        createConnectedDominatingSet(countOfNodes, adjacencyMatrix, dominatingSetsArr[i], startNode);
        calculateCountOfBlackNodes(i);
        if (isThisGraphCDS(i) == 0) {
            printf("下标为%2d的个体不是支配集\n", i);
        }
        randomArrangeNodesOfCDS(i);
    }
    printf("生成的支配集是:\n");
    printDominatingSets(countOfNodes, countOfDominatingSets, dominatingSetsArr);//打印所有支配集
    findTheBestDominatingSetThisTurn();
    best = bestOfThisTurn;
    for (int i = 0; i < countOfNodes; i++) {
        bestDominatingSet[i] = dominatingSetsArr[bestOfThisTurnIndex][i];
    }
    
    int iteration = 1;//迭代次数
    //开始迭代
    while (iteration <= maxIteration) {
        
        printf("--------------------------------------第%d次迭代--------------------------------------\n", iteration);

        selection();        //选择
        crossover();        //交叉
        mutation();        //变异
        localOptimization();        //局部优化

        printResult();      //计算并打印本次迭代的结果

        for (int i = 0; i < countOfDominatingSets; i++) {
            int notCDS = 0;
            if (isThisGraphCDS(i) == 0) {
                printf("下标为%2d的个体不是支配集\n", i);
                notCDS++;
            }
            if (notCDS > 0) {
                exit(0);
            }
        }
        iteration++;
    }
    return best;
}
Exemple #2
0
//----------------------------------------------------------------------------------
void
TSPLib::computePath( void )
{
    // remove any existing path
    m_nbEdges = 0 ;

    // compute enveloppe
    computeEnvelope() ;

    // reduce enveloppe
    reduceEnvelope( m_nbPoints ) ;

    // optimize path
    localOptimization() ;
}