差分进化算法

来源:互联网 发布:微信域名检测原理 编辑:程序博客网 时间:2024/06/08 12:19

差分进化算法

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);        }    }}
原创粉丝点击