注:控制台实例化,运行Run方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 差分
{
class DE
{
public static int N = 50;// 种群规模
public static int D = 2;// 个体的长度
public static int min = -10;// 最小值
public static int max = 10;// 最大值
public static double F = 0.5;// 变异的控制参数
public static double CR = 0.8;// 杂交的控制参数
Random r = new Random();
public static double[,] x = new double[N, D];
public static double[,] v = new double[N, D];
public static double[,] u = new double[N, D];
public double best_fx;//最优函数值
public void Run()
{
int r1 =0;
int r2 =0;
int r3 =0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < D; j++)
{
x[i, j] = min+(max-min) * r.NextDouble();
}
}
for (int t = 0; t < 50; t++)//迭代50次
{
for (int i = 0; i < N; i++)
{
for (int k = 0; k < 2000; k++)
{
r1 = r.Next(N);
r2 = r.Next(N);
r3 = r.Next(N);
if ((r1 != r2)&&(r1 != r3) &&(r2 != r3))
{
break;
}
}
for (int j = 0; j < D; j++)
{
v[i, j] = x[r1, j] + F * (x[r2, j] - x[r3, j]);
}
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < D; j++)
{
if (r.NextDouble() < CR)
{
u[i, j] = v[i, j];
}
else
{
u[i, j] = x[i, j];
}
}
}
for (int i = 0; i < N; i++)
{
double fx = Fitness(x[i, 0], x[i, 1]);
double ux = Fitness(u[i, 0], u[i, 1]);
if (ux < fx)
{
for (int j = 0; j < D; j++)
{
x[i, j] = u[i, j];
}
}
}
best_fx = Fitness(x[0, 0], x[0, 1]);
int index;
for (int i = 1; i < N; i++)
{
double temp = Fitness(x[i, 0], x[i, 1]);
if (temp < best_fx)
{
index = i;
best_fx = temp;
}
}
}
}
public double Fitness(double x1,double x2)
{
return x1 * x1 + x2 * x2;
}
}
}