遗传算法的一个例子(C/C++)
作者:newsuppy
摘要: m个工件分配给m架机床的效益最优化问题,使用一种遗传算法解决。
一,已知效益矩阵E
eij |
M1 |
M2 |
M3 |
M4 |
M5 |
J1 |
5 |
6 |
4 |
8 |
3 |
J2 |
6 |
4 |
9 |
8 |
5 |
J3 |
4 |
3 |
2 |
5 |
4 |
J4 |
7 |
2 |
4 |
5 |
3 |
J5 |
3 |
6 |
4 |
5 |
5 |
Jn为工件,Mn为机床,矩阵对应的一格即为,某工件分配给某机床的效益。效益指花费的时间,金钱等,数值越大越差。产生一个分配序列C=(5,2,3,4,1)指将5号工件分配给1号机床,2号工件分配给2号机床,以此类推求得当前分配对应的效益为3+4+2+5+3=17。最佳化问题就是要求该效益值最小时对应的分配序列。下面采用一种遗传算法,具体算法这里不再复述,可以参考[1]或其他相关书籍。要注意由于工件与机床是一一对应的,算法与一些常见的遗传算法在某些细节上有所不同,如染色体编码,到位,变异。
下面是算法实现,由于某些原因,不得不采用C/C++混合编码,C++代码主要在文件输入输出部分。另外要让程序正常运行需要包括几个支持文件(与程序在同一路径):
benefit.txt输入效益矩阵
num_of_gen.txt最后产生的代序
numofcolony.txt为群体中个体总数
numoftm.txt为工件数与机床数
内容可以如下:
benefit.txt |
5 6 4 8 3 6 4 9 8 5 4 3 2 5 4 7 2 4 5 3 3 6 4 5 5 |
num_of_gen.txt |
50 |
numofcolony.txt |
10 |
numoftm.txt |
5 5 |
注意:由于程序写得比较仓促,未考虑错误处理,请保证相关文件的正确性。
#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"); |