差分进化算法
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace DifferentialEvolution
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// min{(x0+10x1)^2+5(x2-x3)^2+(x1-2x2)^4+10(x0-10x3)^4}
int NP = 100;//种群数
int D = 4;//解向量维数
int T = 50;//进化代数
int L = -10;//变量下限
int U = 10;//变量上限
double F = 0.5;//缩放因子
//double Cr = 0.5;//杂交概率
double Cr;
double Cr_max = 0.9;
double Cr_min = 0.5;
int counter = 0;
Random rd = new Random();
Tools ts = new Tools();
//随机生成初代种群
List<double[]> X = new List<double[]>(NP);
List<double[]> temp_X = new List<double[]>(NP);
int temp_NP = 0;
do
{
double[] x = new double[D];
for (int i = 0; i < D; i++)
{
x[i] = L + rd.NextDouble()*(U - L);
}
if (!X.Contains(x))
{
X.Add(x);
temp_NP++;
}
} while (temp_NP < NP);
//初代种群中最优个体
double[] best = new double[D];
Array.Copy(X[0],best,D);//这里best变化对X[0]
ts.BestSolve(ref best, X);
//------------------------------------------------------
string bestsovle = null;
foreach (double num in best)
{
bestsovle += num + " ";
}
MessageBox.Show("初代最优个体" + bestsovle);
//------------------------------------------------------
do
{
//对每个个体进行变异杂交操作
temp_X.Clear();//清空临时集合
Cr = Cr_min + (Cr_max - Cr_min)*counter/T;//随counter增加而增大
for (int i = 0; i < NP; i++)
{
double[] x = new double[D];
//x = X[i];直接指向X[i]的地址,对x操作,X[i]也没变化,初代种群被破坏
double[] temp_x = X[i];//从集合中依次取出每个个体
Array.Copy(temp_x, x, D);
//随机选取三个个体
int[] randomIndex = new int[3];
randomIndex = ts.RandomChoose(3, NP, i);
double[] x1 = X[randomIndex[0]];
double[] x2 = X[randomIndex[1]];
double[] x3 = X[randomIndex[2]];
#region
//变异算子
double[] V = new double[D];
//-----DE/current-to-best/1-----
for (int j = 0; j < D; j++)
{
V[j] = x[j] + F*(best[j] - x[j]) + F*(x1[j] - x2[j]);
}
//-----DE/best/1-----
//for (int j = 0; j < D; j++)
//{
// V[j] = best[j] + F * (x2[j] - x3[j]);
//}
//-----DE/rand/1-----
//for (int i = 0; i < D; i++)
//{
// V[i] = x1[i] + F * (x2[i] - x3[i]);
//}
//修补算子
for (int j = 0; j < D; j++)
{
if (V[j] < L)
{
V[j] = L;
}
else if (V[j] > U)
{
V[j] = U;
}
}
//杂交算子
//保证个体进化,先随机替换一位
int temp_index = rd.Next(D);
x[temp_index] = V[temp_index];
for (int j = 0; j < D; j++)
{
double temp = rd.NextDouble();
if (temp >= Cr)
{
x[j] = V[j];
}
}
#endregion
temp_X.Add(x);
}
//产生新种群
X.Clear();
ts.Copy(temp_X, X);
//新种群中的最优个体
ts.BestSolve(ref best, X);
bestsovle = null;
foreach (double num in best)
{
bestsovle += num + " ";
}
MessageBox.Show(counter + 1 + "代最优个体\n" + bestsovle);
counter++;
} while (counter < T);
string s = null;
for (int i = 0; i < best.Length; i++)
{
s += best[i] + " ";
}
MessageBox.Show(s);
}
}
}