亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ga.txt

?? 遺傳算法的一個實例。m個工件分配給m架機床的效益最優化問題
?? TXT
字號:
#include <iostream>

#include <fstream>

#include <algorithm>

#include <numeric>

#include <stdlib.h>

#include <time.h>

#include <math.h>

using namespace std;

 

void generate_colony(int **colony, int num_of_chromosomes, int num_of_job); //初始群體產生 

int compute_benefit(int **benefit_matrix, int *chromosome, int num_of_machine); // 對單個染色體的效益評估 

void copy_chromosomes(int **colony, int num_of_chromosomes, int num_of_job, int *benefit_array);//復制

int execute_probably(float probability); //按一定概率返回1或0

//上面的函數實現中使用rand產生隨機數,這是不嚴格的,應該采用一個均勻(Uniform)分布的隨機數生成器

 

void exchange_gene(int *chromosome_first, int *chromosome_second, int num_of_job); //對兩個染色體實行交換

void reverse_gene(int *chromosome, int num_of_job); //對單個染色體實行到位

void gene_mutate(int *chromosome, int num_of_job); //對單個染色體實行變異

 

void ERV_colony(int **colony, float pe, float pr, float pv, int num_of_job, int num_of_chromosomes);

//對群體按概率實行交換,到位和變異 

 

int main()

{

    int **benefit_matrix = NULL;        // 效益矩陣

    int num_of_job;             // 工件數

    int num_of_machine;       // 機床數

 

    ifstream inputTM("numoftm.txt");

    inputTM >> num_of_job >> num_of_machine;

    inputTM.close();

 

    benefit_matrix = (int**)malloc(sizeof(int*)*num_of_job);

    for (int i=0; i<num_of_job; ++i)

    {

        benefit_matrix[i] = (int*)malloc(sizeof(int)*num_of_machine);

    }

 

    ifstream inputBenefit("benefit.txt");

    for (int i=0; i<num_of_job; ++i)

    {

        for (int j=0; j<num_of_machine; ++j)

        {

            inputBenefit >> benefit_matrix[i][j];

        }

    }

    inputBenefit.close();

 

    /*********************************************

    // Test for inital datas input

    cout <<num_of_job << \t << num_of_machine << endl;

    for (int i=0; i<num_of_job; ++i)

    {

        for (int j=0; j<num_of_machine; ++j)

        {

            cout <<  benefit_matrix[i][j] << \t;

        }

        cout << \n;

    }

    **********************************************/

 

    int num_of_chromosomes;   //群體數

    ifstream inputCln("numofcolony.txt");

    inputCln >> num_of_chromosomes;

    inputCln.close();

 

    int **colony = NULL;   //群體    

    colony = (int**)malloc(sizeof(int*)*num_of_chromosomes);

    for (int i=0; i<num_of_chromosomes; ++i)

    {

        colony[i] =(int*)malloc(sizeof(int)*num_of_job);

    }

 

    srand(time(0));

    generate_colony(colony, num_of_chromosomes, num_of_job);

 

    cout << "Origin Colonies" << \n;

    /***********************************/

    // Test for genetare_colony

    for (int i=0; i<num_of_chromosomes; ++i)

    {

        for (int j=0; j<num_of_job; ++j)

        {

            cout << colony[i][j] << \t;

        }

 

        cout << \n;

    }

    /************************************/

 

    int *benefit_array = NULL;   // 群體中每個個體的效益組成的數組

    benefit_array = (int*)malloc(sizeof(int)*num_of_chromosomes);

    for (int i=0; i<num_of_chromosomes; ++i)

    {

        benefit_array[i] = compute_benefit(benefit_matrix, colony[i], num_of_machine);

    }

    

    cout << "Current benefit" << \n

        << "mean:" << (float)accumulate(benefit_array, benefit_array+num_of_chromosomes, 0) / num_of_chromosomes << \t

        << "max:" << *max_element(benefit_array, benefit_array+num_of_chromosomes) << \t

        << "min:" << *min_element(benefit_array, benefit_array+num_of_chromosomes) << \n;

   

    int num_of_gen;  // 產生的代數,也就是最后產生的那個代的序數 

         ifstream inputNG("num_of_gen.txt");

         inputNG >> num_of_gen;

         inputNG.close();

 

    float probability_of_exchange = 0.7f;

    float probability_of_reverse = 0.2f;

    float probability_of_mutate = 0.01f;

 

    for (int i=0; i<num_of_gen; ++i)

    {

        //調用復制子程序

        copy_chromosomes(colony, num_of_chromosomes, num_of_job, benefit_array);

 

                   ERV_colony(colony, probability_of_exchange, probability_of_reverse, probability_of_mutate,

                            num_of_job, num_of_chromosomes);

 

        //重新計算各個個體的效益

        for (int j=0; j<num_of_chromosomes; ++j)

        {

            benefit_array[j] = compute_benefit(benefit_matrix, colony[j], num_of_machine);

        }

 

        //本代評估效益

        cout << "current gen : " << i+1 << \n

            << "mean: " << (float)accumulate(benefit_array, benefit_array+num_of_chromosomes, 0) / num_of_chromosomes << \t

                            << "max:" << *max_element(benefit_array, benefit_array+num_of_chromosomes) << \t

            << "min:" << *min_element(benefit_array, benefit_array+num_of_chromosomes) << \n;

    }

 

         cout << "Laster Colony" << \n;

         for (int i=0; i<num_of_chromosomes; ++i)

         {

                   for (int j=0; j<num_of_job; ++j)

                   {

                            cout << colony[i][j] << \t;

                   }

 

                   cout << \n;

         }

                   

    // free all resource

    for (int i=0; i<num_of_job; ++i)

    {

        free(benefit_matrix[i]);

    }

    free(benefit_matrix);

    

    for (int i=0; i<num_of_chromosomes; ++i)

    {

        free(colony[i]);

    }

    free(colony);

 

    free(benefit_array);

 

         system("pause");

}

 

void generate_colony(int **colony, int num_of_chromosomes, int num_of_job)

{

    int *initial_array = (int*)malloc(sizeof(int)*num_of_job);

    for (int i=0; i<num_of_job; ++i)

    {

        initial_array[i] = i + 1;

    }

 

    for (int i=0; i<num_of_chromosomes; ++i)

    {

        random_shuffle(initial_array, initial_array+num_of_job);

        copy(initial_array, initial_array+num_of_job, colony[i]);

    }

 

    free(initial_array);

}

 

int compute_benefit(int **benefit_matrix, int *chromosome, int num_of_machine)

{

    int benefit = 0;

    for (int i=0; i<num_of_machine; ++i)

    {

        benefit += benefit_matrix[chromosome[i]-1][i];

    }

 

    return benefit;

}

 

void copy_chromosomes(int **colony, int num_of_chromosomes, int num_of_job, int *benefit_array)

{

    int i, j;

    int *next_gen_reserve;   //各個個體在后代中的復制量

    int hasCopyed = 0;  // 防止復制數超過群體總數??

    int **temp_colony;   //暫存群體

         float mean, max_benefit, min_benefit;

         float big_separator, small_separator;

 

         mean = (float)accumulate(benefit_array, benefit_array+num_of_chromosomes, 0) / (float)num_of_chromosomes;

         max_benefit = *max_element(benefit_array, benefit_array+num_of_chromosomes);

         min_benefit = *min_element(benefit_array, benefit_array+num_of_chromosomes);

         big_separator = max_benefit - (max_benefit-mean) / 2;

         small_separator = min_benefit + (mean-min_benefit) / 2;

 

    temp_colony = (int**)malloc(sizeof(int*)*num_of_chromosomes);

    for (i=0; i<num_of_chromosomes; ++i)

    {

        temp_colony[i] =(int*)malloc(sizeof(int)*num_of_job);

    }

 

    // 復制暫存群體

    for (i=0; i<num_of_chromosomes; ++i)

    {

        for (j=0; j<num_of_job; ++j)

        {

            temp_colony[i][j] = colony[i][j];

        }

    }

 

    next_gen_reserve = (int*)malloc(sizeof(int)*num_of_chromosomes);

 

    // 計算個體貢獻并進行參數圓整

    for (i=0; i<num_of_chromosomes; ++i)

    { 

                   if (benefit_array[i] >= big_separator)

            next_gen_reserve[i] = 0;

                   else if (benefit_array[i] <= small_separator)

                            next_gen_reserve[i] = 2;

                   else

                            next_gen_reserve[i] = 1;

    }

 

    for (i=0; i<num_of_chromosomes; ++i)

    {

        for (j=0; j<next_gen_reserve[i]; ++j)

        {

            if (hasCopyed >= num_of_chromosomes)

            {

                i = num_of_chromosomes;

                break;

            }

            memcpy(colony[hasCopyed], temp_colony[i], sizeof(colony[0][0])*num_of_job);

            ++hasCopyed;

        }

    }

 

    for (i=0; i<num_of_chromosomes; ++i)

    {

        free(temp_colony[i]);

    }

    free(temp_colony);

    free(next_gen_reserve);

}

 

int execute_probably(float probability)

{

    if (probability > 1.0)

        return 1;

    else if (probability <= 0.0)

        return 0;

    else

    {

        int rndNum = rand() % 1000;

 

        if (rndNum < (int)(probability * 1000.0))

            return 1;

        else

            return 0;

    }

}

 

void exchange_gene(int *chromosome_first, int *chromosome_second, int num_of_job)

{

         int exchange_pos;     //交換隨機點

    int *derived_first, *derived_second;  //交換后的兩個新子代的臨時存放

         int i, j, k;

         int is_equal;

 

         exchange_pos = rand() % num_of_job;

 

         derived_first = (int*)malloc(sizeof(int)*num_of_job);

         derived_second = (int*)malloc(sizeof(int)*num_of_job);

 

         // 復制交換點前的基因

         memcpy(derived_first, chromosome_first, sizeof(int)*(1+exchange_pos));

         memcpy(derived_second, chromosome_second, sizeof(int)*(1+exchange_pos));

 

         // 由兩個親本產生第一個子代

         k = exchange_pos + 1;

         for (i=0; i<num_of_job; ++i)

         {

             is_equal = 0;

                   

                   for (j=0; j<=exchange_pos; ++j)

                   {

                            if (chromosome_second[i]==chromosome_first[j])

                            {

                                     is_equal = 1;

                                     break;

                            }

                   }

                   

                   if (is_equal == 0)

        {

            derived_first[k] = chromosome_second[i];

                       ++k;

                   }

         }

         

 

         // 由兩個親本產生第二個子代

         k = exchange_pos + 1;

         for (i=0; i<num_of_job; ++i)

         {

             is_equal = 0;

                   

                   for (j=0; j<=exchange_pos; ++j)

                   {

                            if (chromosome_first[i]==chromosome_second[j])

                            {

                                     is_equal = 1;

                                     break;

                            }

                   }

                   

                   if (is_equal == 0)

                   {

                       derived_second[k] = chromosome_first[i];

                       ++k;

        }

         }

 

         // 覆蓋原始親本

         memcpy(chromosome_first, derived_first, sizeof(int)*num_of_job);

         memcpy(chromosome_second, derived_second, sizeof(int)*num_of_job);

 

         free(derived_first);

         free(derived_second);

}

 

void reverse_gene(int *chromosome, int num_of_job)

{

         int first_rev_pos;                      //第一倒位點

         int second_rev_pos;                  //第二倒位點

         int i, distance;

         int temp;

 

         first_rev_pos = rand() % num_of_job;

         second_rev_pos = rand() % (num_of_job-first_rev_pos)+first_rev_pos;

 

         distance = (second_rev_pos - first_rev_pos) / 2;

         for (i=0; i<=distance; ++i)

         {

                   temp = chromosome[first_rev_pos+i];

                   chromosome[first_rev_pos+i] = chromosome[second_rev_pos-i];

                   chromosome[second_rev_pos-i] = temp;

         }

}

 

void gene_mutate(int *chromosome, int num_of_job)

{

         int mutate_pos;                 // 變異點

         int mutate_value;               // 變異后基因值

         int ex_pos;                            //與變異點的交換點

         int i;

 

         mutate_pos = rand() % num_of_job;

         mutate_value = rand() % num_of_job + 1;

 

         for (i=0; i<num_of_job; ++i)

         {

                   if (chromosome[i] == mutate_value)

                   {

                            ex_pos = i;

                            break;

                   }

         }

 

         i = chromosome[ex_pos];

         chromosome[ex_pos] = chromosome[mutate_pos];

         chromosome[mutate_pos] = i;

}

 

void ERV_colony(int **colony, float pe, float pr, float pv, int num_of_job, int num_of_chromosomes)

{

         int **tmp_colony;

         int i;

         int first, second;

 

         tmp_colony = (int**)malloc(sizeof(int*)*num_of_chromosomes);

    for (i=0; i<num_of_chromosomes; ++i)

    {

        tmp_colony[i] =(int*)malloc(sizeof(int)*num_of_job);

    }

 

         // copy

         for (i=0; i<num_of_chromosomes; ++i)

         {

                   memcpy(tmp_colony[i], colony[i], sizeof(int)*num_of_job);

         }

 

         for (i=0; i<num_of_chromosomes; i+=2)

         {

        first = rand() % num_of_chromosomes;

             while (1)

             {

                       second = rand() % num_of_chromosomes;

                       if (first != second)

                                break;

             }

 

                   memcpy(colony[i], tmp_colony[first], sizeof(int)*num_of_job);

                   memcpy(colony[i+1], tmp_colony[second], sizeof(int)*num_of_job);

 

                   if (execute_probably(pe))

                            exchange_gene(colony[i],colony[i+1],num_of_job);

 

                   if (execute_probably(pr))

                   {

                            reverse_gene(colony[i], num_of_job);

                            reverse_gene(colony[i+1], num_of_job);

                   }

 

                   if (execute_probably(pv))

                   {

                            gene_mutate(colony[i], num_of_job);

                            gene_mutate(colony[i+1], num_of_job);

                   }

         }

 

         // free all resource

         for (int i=0; i<num_of_chromosomes; ++i)

    {

        free(tmp_colony[i]);

    }

    free(tmp_colony);

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美不卡一区二区三区| 日本一区二区三区免费乱视频 | 国产美女娇喘av呻吟久久| 亚洲精品久久7777| 亚洲精品亚洲人成人网| 韩国女主播一区| 日韩精品在线网站| 激情五月播播久久久精品| 99re热这里只有精品免费视频| 国产精品网站一区| 午夜激情一区二区| 欧美日韩午夜在线| 亚洲成av人**亚洲成av**| 欧美日韩国产综合一区二区三区 | 久草在线在线精品观看| 欧美日韩成人在线一区| 亚洲一二三专区| 在线成人免费视频| 免费av网站大全久久| 精品久久久久久久久久久久久久久久久| 亚洲一区二区三区四区不卡| 欧美日韩一区二区欧美激情 | av成人动漫在线观看| 亚洲乱码国产乱码精品精小说| 99精品久久99久久久久| 国产亚洲一本大道中文在线| 成人性生交大片免费看视频在线 | 欧美三级日韩三级| 激情六月婷婷久久| 亚洲女爱视频在线| 欧美日韩高清在线播放| 日本亚洲免费观看| 日韩一区二区麻豆国产| 国产精品综合视频| 一区二区在线观看不卡| 日韩欧美中文字幕公布| 99久久国产综合精品麻豆| 亚洲自拍与偷拍| 中文字幕一区二区三区蜜月| 在线播放日韩导航| 国产宾馆实践打屁股91| 亚洲成人自拍偷拍| 中日韩免费视频中文字幕| 日本一区二区三区久久久久久久久不| 国产成人av一区| 天天综合网天天综合色| 亚洲色欲色欲www| 国产清纯白嫩初高生在线观看91 | 精品一区二区三区欧美| 亚洲另类色综合网站| 国产精品色哟哟| 欧美不卡一区二区三区四区| av在线不卡电影| 播五月开心婷婷综合| 国产精品99久久久久久久vr| 国产精品一区二区在线观看网站| 中文字幕第一区综合| 欧美激情综合在线| 国产欧美日韩不卡| 欧美日韩免费高清一区色橹橹| 一本久久精品一区二区| 99久久精品免费看国产免费软件| 99久久国产综合精品色伊| 国产一本一道久久香蕉| 精品一区二区久久| eeuss鲁片一区二区三区| 在线观看av不卡| 久久一区二区三区四区| 中文字幕欧美一| 久久精品国产一区二区三| 成人18视频在线播放| 欧美视频一区二区三区| 国产亚洲一区二区三区在线观看| 亚洲美女屁股眼交3| 国产在线不卡一卡二卡三卡四卡| 91在线国内视频| 久久久久国产免费免费| 婷婷久久综合九色国产成人| 91在线免费播放| 午夜精品福利一区二区三区av| 久久爱www久久做| 欧美日韩午夜在线| 一区二区三区四区激情| 国产成人av电影在线| 日韩无一区二区| 天天做天天摸天天爽国产一区| av在线不卡网| 成人欧美一区二区三区| 国产精品资源在线观看| 日韩精品一区二| 日本不卡中文字幕| 欧美精品自拍偷拍| 亚洲综合小说图片| 日本精品一区二区三区四区的功能| 国产欧美日本一区二区三区| 国产在线播放一区| 久久日韩精品一区二区五区| 国内精品伊人久久久久av影院| 日韩欧美一区二区在线视频| 日韩高清中文字幕一区| 欧美一区二区三区在线| 日韩av一二三| 久久综合av免费| 丰满少妇在线播放bd日韩电影| 国产香蕉久久精品综合网| 国产成人免费av在线| 国产女人18毛片水真多成人如厕 | 久久婷婷一区二区三区| 国产一区二区三区| 综合欧美亚洲日本| 欧美裸体bbwbbwbbw| 久久国产免费看| 久久嫩草精品久久久精品| 91蜜桃婷婷狠狠久久综合9色| 亚洲成人一区二区在线观看| 亚洲精品一区在线观看| 色网综合在线观看| 久久精品国产一区二区| 亚洲色欲色欲www| 久久免费偷拍视频| 欧美撒尿777hd撒尿| 成人午夜激情视频| 亚洲不卡av一区二区三区| 中文av一区二区| 精品久久一区二区| 欧美日韩国产三级| 成熟亚洲日本毛茸茸凸凹| 日韩av在线播放中文字幕| 中文字幕精品三区| 久久免费午夜影院| 欧美日韩www| av不卡免费电影| 岛国av在线一区| 国产精品一区专区| 日本色综合中文字幕| 伊人一区二区三区| 国产三级精品在线| 久久九九全国免费| 精品国产网站在线观看| 91麻豆精品91久久久久久清纯| 色一区在线观看| 一本大道久久a久久综合婷婷| 成人免费视频app| 国产91对白在线观看九色| 国产精品一级黄| 波多野结衣视频一区| 波多野洁衣一区| 91丨porny丨首页| 99精品黄色片免费大全| 91丨porny丨国产| 欧美日韩激情一区| 日韩一区二区电影在线| 精品久久国产老人久久综合| 欧美精品一区二区在线观看| 久久精品视频网| 亚洲欧美aⅴ...| 蜜桃久久av一区| 国产成人精品免费视频网站| 粉嫩av亚洲一区二区图片| 一本到三区不卡视频| 这里是久久伊人| 中文字幕第一区第二区| 一区二区三区加勒比av| 久久精品国产成人一区二区三区 | 亚洲激情成人在线| 蜜臀av性久久久久蜜臀aⅴ| 国产剧情一区二区| 欧美性猛交xxxx黑人交 | 色久综合一二码| 欧美一级日韩一级| 欧美激情在线观看视频免费| 亚洲国产sm捆绑调教视频| 国产91精品久久久久久久网曝门| 91国模大尺度私拍在线视频| 日韩午夜在线观看视频| 一区二区三区四区视频精品免费 | 亚洲精品在线观看网站| 一卡二卡欧美日韩| 成人av在线网| 日韩精品综合一本久道在线视频| 夜夜精品浪潮av一区二区三区| 久久不见久久见免费视频7| 欧美在线观看视频在线| 国产精品久久二区二区| 国产一区二区精品久久99| 欧美一区二区三区在线观看 | 国产嫩草影院久久久久| 激情小说欧美图片| 91精品国产乱码| 首页国产欧美日韩丝袜| 欧美日韩精品欧美日韩精品一综合| 亚洲国产精品高清| 高清不卡一区二区在线| 国产亚洲综合在线| 粉嫩嫩av羞羞动漫久久久| 亚洲国产高清在线| thepron国产精品| 一区二区三区四区高清精品免费观看 | 国产伦精品一区二区三区免费迷| 欧美精品一区二|