采用浮點數編碼的遺傳算法的問題
最近學習了一下遺傳算法,于是參考了一篇論文,采用浮點數編碼寫了一個算法,運行了一下,發布收斂很慢,遺傳了幾百代與幾十代相比,只是略顯穩定,隨機性比較強。而且容易限入局部極值中。例如,我以求函數xsin(10PI*x)+2.0為例,最大值大約在x=1.85附近,在x=1.65附近有一個局部極值。我寫的算法大約70%的機會取得1.85附近的值,30%機會取得1.65附近的值。總之效果不理想。不知有沒有朋友有興趣幫我看一下。
初始化種群
public List<PopUnit> InitPop()
{
if (CalculateFitnessHanler == null)
throw new Exception("未設置計算表達式的事件CalculateHanler");
if (m_Parameters.PopSize<=10)
throw new Exception("種群數太小");
List<PopUnit> pool = new List<PopUnit>();
for (int i = 0; i <= m_Parameters.PopSize-1; i++)
{
double d = m_Random.NextDouble();
d = m_Parameters.L + (m_Parameters.R - m_Parameters.L) * d;
double val= CalculateFitnessHanler(new double[] { d });
PopUnit unit = new PopUnit(d, val);
pool.Add(unit);
}
return pool;
}
{
if (CalculateFitnessHanler == null)
throw new Exception("未設置計算表達式的事件CalculateHanler");
if (m_Parameters.PopSize<=10)
throw new Exception("種群數太小");
List<PopUnit> pool = new List<PopUnit>();
for (int i = 0; i <= m_Parameters.PopSize-1; i++)
{
double d = m_Random.NextDouble();
d = m_Parameters.L + (m_Parameters.R - m_Parameters.L) * d;
double val= CalculateFitnessHanler(new double[] { d });
PopUnit unit = new PopUnit(d, val);
pool.Add(unit);
}
return pool;
}
選擇操作
public List<PopUnit> Select(List<PopUnit> data)
{
int dropoutCount = (int)(m_Parameters.DropoutRate * data.Count);
List<PopUnit> newpool = new List<PopUnit>();
for (int i = 0; i <= dropoutCount - 1; i++)
{
newpool.Add(data[i].Clone() as PopUnit);
newpool.Add(data[i].Clone() as PopUnit);
}
int tmpCount = data.Count - newpool.Count;
for (int i = dropoutCount; i <= dropoutCount + tmpCount - 1; i++)
{
newpool.Add(data[i].Clone() as PopUnit);
}
return newpool;
}
{
int dropoutCount = (int)(m_Parameters.DropoutRate * data.Count);
List<PopUnit> newpool = new List<PopUnit>();
for (int i = 0; i <= dropoutCount - 1; i++)
{
newpool.Add(data[i].Clone() as PopUnit);
newpool.Add(data[i].Clone() as PopUnit);
}
int tmpCount = data.Count - newpool.Count;
for (int i = dropoutCount; i <= dropoutCount + tmpCount - 1; i++)
{
newpool.Add(data[i].Clone() as PopUnit);
}
return newpool;
}
交叉操作:
public void CrossOver(double a,double b,out double a1,out double b1)
{
if (m_Random.NextDouble() > m_Parameters.CrossOverRate)
{
a1 = a;
b1 = b;
return;
}
double r = 0.1;
double a2 = m_Random.NextDouble() * r;
double b2 = m_Random.NextDouble() * r;
a1 = (1 - a2) * a + b2 * b;
b1 = (1 - b2) * b + a2 * a;
if (a1 < m_Parameters.L)
a1 = m_Parameters.L;
if (b1 < m_Parameters.L)
b1 = m_Parameters.L;
if (a1 > m_Parameters.R)
a1 = m_Parameters.R;
if (b1 > m_Parameters.R)
b1 = m_Parameters.R;
//Console.WriteLine("crossover a1={0},b1={1} -> a2={2},b2={3}", a, b, a1, b1);
}
{
if (m_Random.NextDouble() > m_Parameters.CrossOverRate)
{
a1 = a;
b1 = b;
return;
}
double r = 0.1;
double a2 = m_Random.NextDouble() * r;
double b2 = m_Random.NextDouble() * r;
a1 = (1 - a2) * a + b2 * b;
b1 = (1 - b2) * b + a2 * a;
if (a1 < m_Parameters.L)
a1 = m_Parameters.L;
if (b1 < m_Parameters.L)
b1 = m_Parameters.L;
if (a1 > m_Parameters.R)
a1 = m_Parameters.R;
if (b1 > m_Parameters.R)
b1 = m_Parameters.R;
//Console.WriteLine("crossover a1={0},b1={1} -> a2={2},b2={3}", a, b, a1, b1);
}
變異操作:
public double Mutation(double c)
{
double tmpd = m_Random.NextDouble();
if (tmpd > m_Parameters.MutateRate)
{
return c;
}
double k = 0.2;
//k = (m_Parameters.MaxGenerations-T)/ (m_Parameters.MaxGenerations + 2D) * 0.4D;
double res;
if (m_Random.Next(2) == 1)
{
res = c + k * (m_Parameters.R - c) *m_Random.NextDouble();
}
else
{
res = c - k * (c - m_Parameters.L) *m_Random.NextDouble();
}
//Console.WriteLine("mutation: {0} -> {1}", c, res);
return res;
}
{
double tmpd = m_Random.NextDouble();
if (tmpd > m_Parameters.MutateRate)
{
return c;
}
double k = 0.2;
//k = (m_Parameters.MaxGenerations-T)/ (m_Parameters.MaxGenerations + 2D) * 0.4D;
double res;
if (m_Random.Next(2) == 1)
{
res = c + k * (m_Parameters.R - c) *m_Random.NextDouble();
}
else
{
res = c - k * (c - m_Parameters.L) *m_Random.NextDouble();
}
//Console.WriteLine("mutation: {0} -> {1}", c, res);
return res;
}
種群大小=100,交叉概率=0.7,變異概率=0.1
浙公網安備 33010602011771號