logo资料库

GA_遗传算法.doc

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
using System; using System.IO; using System.Collections; using System.Collections.Generic; using System.Text; using System.ComponentModel; using System.Data; using System.Data.OleDb; namespace ConsoleApplication1 { public class Genetic_Algorithm { Random rand=new Random(); int MaxTime;//最大运行时间 int popsize;//种群数量 int ChromosomeLength;//染色体长度 double CrossRate;//交叉率 double MutateRate;//变异率 double[] f;//适应度值 int[] selected;//定义selected数组,用于表示需要进行交叉操作的染色体序号 double[] wheel;//轮盘 int[,] pregeneration;//上一代 int[,] nextgeneration;//下一代 int[] Best;//定义当前最优解 int convergence;//定义当前最优解的已持续代数 int[,] timeconstrait; public Genetic_Algorithm(int populationsize, int chromolength)//GA--构造函数,变量初 始化 { rand = new Random(System.DateTime.Now.Millisecond); MaxTime = 50; popsize=populationsize; ChromosomeLength = chromolength; CrossRate = 0.8; MutateRate = 0.2; f = new double[2*popsize];
selected = new int[popsize]; wheel = new double[popsize + 1]; pregeneration = new int[popsize, ChromosomeLength];//当前的染色体种群 nextgeneration = new int[popsize, ChromosomeLength];//下一代(子代)染色体种群 Best = new int[ChromosomeLength]; convergence = 1; timeconstrait = new int[20, 2] { { 2, 6 }, { 1, 2 }, { 3, 4 }, { 1, 4 }, { 4, 7 }, { 3, 5 }, { 2, 6 }, { 3, 5 }, { 1, 4 }, { 3, 7 }, { 5, 7 }, { 2, 7 }, { 2, 4 }, { 4, 5 }, { 2, 5 }, { 4, 6 }, { 3, 5 }, { 1, 4 }, { 1, 5 }, { 3, 6 } }; } public void RunGA()//运行 { int i; CreateFirstPop();//产生初始种群 i = 0; bool quit = true; while (quit) { for (; i < MaxTime; i++) { } 还有变异 Console.WriteLine("The {0}th Generation..........", i + 1); CalFitness(ref pregeneration, popsize);//计算适应值 PrintResult();//输出每步的结果 WheelSelect();//此步确定了selected[i]的值 CreateNextGeneration();//产生子代,包括被选择为selected[i]的染色体的交叉, ProduceNext(); Console.WriteLine("Press 'q' to quit, press Enter to continue....."); if (Console.Read() == 'q') { } quit = false; else MaxTime += 50; { } }
} void CreateFirstPop()//产生初始种群 { } Console.WriteLine("Creating first generation..........\n"); int i,j,r; for(i=0;i
int i; max = 0; for (i = 1; i < popsize; i++) if (f[i] > f[max]) { } max = i; { } } void FindMin(ref double[] f, out int min)//寻找数组中最小值 { } int i; min = 0; for (i = 1; i < popsize; i++) { } if (f[i] < f[min]) { } min = i; void WheelSelect() //轮盘选择popsize个染色体(可重复),并将序号放入selected[]中,作 为交叉的染色体 { int i,j ,r; double sum; wheel[0] = 0; sum = 0; for (i = 0; i < popsize; i++) { } sum += f[i]; wheel[i + 1] = wheel[i] + f[i]; for (i = 0; i < popsize; i++) { r = rand.Next((int)sum); for (j = 0; j < popsize; j++) { if (r > wheel[j] && r < wheel[j + 1]) {
selected[i] = j; break; } } } } void Crossover(int p1, int p2, int c1, int c2)//交叉==>将序号为selected[i]和selected[i + 1](这里形参是p1,p2)的染色体进行交叉,产生的子代放在pregeneration中i和i+1(这里形参是c1, c2)的位置 { double dr = rand.NextDouble(); if (dr < CrossRate) { int[] covering_code = new int[ChromosomeLength]; for (int i = 0; i < ChromosomeLength; i++) covering_code[i] = rand.Next(0, 2); for (int i = 0; i < ChromosomeLength; i++) { if (covering_code[i] == 0) { } nextgeneration[c1, i] = pregeneration[p1, i]; nextgeneration[c2, i] = pregeneration[p2, i]; else nextgeneration[c1, i] = pregeneration[p2, i]; nextgeneration[c2, i] = pregeneration[p1, i]; { } } } else { for (int i = 0; i < ChromosomeLength; i++) nextgeneration[c1, i] = pregeneration[p1, i]; nextgeneration[c2, i] = pregeneration[p2, i]; { } } } void Mutation(ref int[,] curgeneration)//变异 { int is_not_mutation;
double dr; for (int i = 0; i < popsize; i++) { dr = rand.NextDouble(); if (dr < MutateRate) for (int j = 0; j < ChromosomeLength; j++) { } is_not_mutation = rand.Next(0, 2); if (is_not_mutation == 1) curgeneration[i, j] = rand.Next(1, 11); { } } } void PrintResult()//计算每次迭代后种群中最优解及其适应度值,平均适应值 { int i,j; int min; double average; average = 0; for (i = 0; i < popsize; i++) { } average += f[i]; average = (double) average / popsize; Console.Write("Average profit is {0}\n", average); FindMin(ref f, out min); //计算稳定的次数 for (j = 0; j < ChromosomeLength; j++) { } if (pregeneration[min, j] != Best[j]) { } convergence = 1; goto G2; convergence++; G2:
for (j = 0; j < ChromosomeLength; j++) { } Best[j] = pregeneration[min, j]; //打印相关的数据 Console.Write("染色体 "); for (j = 0; j < ChromosomeLength; j++) { } Console.Write(pregeneration[min, j] + ","); Console.WriteLine(""); Console.WriteLine("综合目标 {0} of individual ", f[min]); Console.WriteLine("已经稳定的代数 {0} of individual ",convergence); Console.WriteLine(""); } void ProduceNext()//选择==>父代和子代中popsize个最优的解进入下一代 { int[,] temgeneration=new int [2*popsize,ChromosomeLength];//定义临时种群,用来将 父代和子代放在一起,进行选优 //将父代放入临时种群 for (int i = 0; i <= popsize - 1; i++) { } for (int j = 0; j <= ChromosomeLength - 1; j++) { } temgeneration[i, j] = pregeneration[i, j]; //将子代放入临时种群 for (int i = 0; i <= popsize - 1; i++) { } for (int j = 0; j <= ChromosomeLength - 1; j++) { } temgeneration[i + popsize, j] = nextgeneration[i, j]; CalFitness(ref temgeneration, popsize * 2);//计算临时种群(父代和子代)的各染色体 适应值 int []tem=new int [ChromosomeLength];//定义临时染色体,用来染色体排序时的交换...
//根据临时种群(父代和子代)的各染色体适应值,进行排序 for (int i = 0; i < 2*popsize - 1; i++) for (int j = i + 1; j <= 2 * popsize - 1; j++) { if (f[i] > f[j]) { double tem_f = f[i]; f[i] = f[j]; f[j] = tem_f; for (int k = 0; k < ChromosomeLength; k++) tem[k] = temgeneration[i, k]; temgeneration[i, k] = temgeneration[j, k]; temgeneration[j, k] = tem[k]; { } } } { } //取临时种群中前popsize个好的染色体作为下一代种群,并将子代变为父代 for (int i = 0; i <= popsize - 1; i++) { } for (int j = 0; j <= ChromosomeLength - 1; j++) { } pregeneration[i, j] = temgeneration[i, j]; } } class Program { static void Main(string[] args) { int chromosomelength = 10; int populationsize = 300; int cycle = 5; Console.WriteLine("Press Enter to start running Genetic Algorithm"); Console.ReadKey();
分享到:
收藏