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();