差分进化算法

差分进化算法

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值