C#实现差分进化算法(DE)的例子(二元函数)

注:控制台实例化,运行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;
		}
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值