GeneticSharp 遺傳算法類庫
GeneticSharp 是什么
GeneticSharp 是一個C#的遺傳算法類庫, 遺傳算法Java著名的JMetal, Python也有JMetalPy和PyMoo, C#相對差一截, 稍微有名的是GeneticSharp庫.
GeneticSharp 的弱點:
- 不支持多目標優化
- 沒有實現流行的 NSGA II算法, 缺少擁擠度等計算, 所以解的多樣性要差一些.
- 對于整數型決策變量, 僅僅支持單個變量, 可以通過浮點數變量來代替, 只要將浮點數變量的小數位數設置為0.
- 對于浮點型決策變量, 可支持多個變量
GeneticSharp 默認只支持最大值優化, 如果要支持最小值優化, 決策函數乘-1就可以了.
NSGAII 算法特點:
- 種群大小保持一致:在 NSGA-II 中,父代種群和子代種群的大小是相同的。如果初始種群包含?? 個個體,那么在每一代中,子代的數量也將是 ??。
- 選擇機制:在合并的種群中(父代和子代的組合),算法根據非支配等級和擁擠度距離選擇出 ?? 個個體作為下一代的種群。因此,最終的可行解個數不會超過初始種群的個體數。
- 多目標優化:盡管最終的可行解個數最多為 ??,但 NSGA-II 的目標是找到多個 Pareto 最優解,最終返回的解可能在目標空間中形成一個 Pareto 前沿。
概念
- 基因 Gene
一個決策變量就是一個基因. - 染色體 Chromosome, 即遺傳算法中的個體, 這些個體將有可能成為一個個可行解.
染色體由基因組成, 有多少個決策變量, 就由多少個基因組成.
GeneticSharp 主要的染色體類型有 FloatingPointChromosome 和 IntegerChromosome, 前者對應浮點數決策變量, 后者對應整數型決策變量. - Fitness 適應度
遺傳算法就是按照適應度來確定淘汰哪個個體, GeneticSharp 中適應度取值越大, 代表個體越優秀, 實際編程中, 適應度計算就是等同于目標函數. - 約束
GeneticSharp 沒有專門的約束處理機制, 我們可以通過自定義的 IFitness 接口來間接實現約束, 對于不符合約束條件的情況, 對應的 fitness 取值調到最小, 即這些不符合約束的個體直接被淘汰即可.
使用C#實現一個簡單遺傳算法
http://www.rzrgm.cn/friend/p/17472506.html
示例代碼講解
https://diegogiacomelli.com.br/function-optimization-with-geneticsharp/
using System;
using GeneticSharp;
namespace FunctionOptimizationWithGeneticSharp
{
class MainClass
{
/// <summary>
/// 定義 Fitness 類
/// </summary>
public class DistinaceFitness : IFitness
{
public double Evaluate(IChromosome c)
{
var fc = c as FloatingPointChromosome;
var values = fc.ToFloatingPoints();
var x1 = values[0];
var y1 = values[1];
var x2 = values[2];
var y2 = values[3];
//假設有一個約束函數 x1+x2+y1+y2>=5
if (x1+x2+y1+y2<5) {
//違法約束, 適應度賦值為0
return 0.0 ;
}
return Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2));
}
}
public static void Main(string[] args)
{
float maxWidth = 998f;
float maxHeight = 680f;
//定義染色體個數和取值范圍
var chromosome = new FloatingPointChromosome(
new double[] { 0, 0, 0, 0 }, //包含4個決策變量, 這里定義每個決策變量的最小值
new double[] { maxWidth, maxHeight, maxWidth, maxHeight }, //包含4個決策變量, 這里定義每個決策變量的最大值
new int[] { 10, 10, 10, 10 }, //每個決策變量占用bit數, 一般取值為10或64
new int[] { 0, 0, 0, 0 }); //每個決策變量小數部分位數
//定義種群規模, 種群規模最小size為2, 否則無法交配.
var population = new Population(50, 100, chromosome);
//定義Fitness
var fitness = new DistinaceFitness();
//定義遺傳算法因子
var selection = new EliteSelection();
var crossover = new UniformCrossover(0.5f);
var mutation = new FlipBitMutation();
//生成遺傳算法對象
var ga = new GeneticAlgorithm(
population,
fitness,
selection,
crossover,
mutation);
//定義遞歸終止條件
var termination = new FitnessStagnationTermination(100);
ga.Termination = termination;
Console.WriteLine("Generation: (x1, y1), (x2, y2) = distance");
var latestFitness = 0.0;
//在算法執行之前, 可以定義每一代運算的回調事件
ga.GenerationRan += (sender, e) =>
{
//通過 ga.BestChromosome 獲取截止當前最好的染色體
var bestChromosome = ga.BestChromosome as FloatingPointChromosome;
//通過 ga.BestChromosome.Fitness 獲取截止當前最好的適應度, 即目標函數值
var bestFitness = bestChromosome.Fitness.Value;
//通過 ga.GenerationsNumber 輸出算法已經迭代了多少代
if (bestFitness != latestFitness)
{
latestFitness = bestFitness;
var phenotype = bestChromosome.ToFloatingPoints();
Console.WriteLine(
"Generation {0,2}: ({1},{2}),({3},{4}) = {5}",
ga.GenerationsNumber,
phenotype[0],
phenotype[1],
phenotype[2],
phenotype[3],
bestFitness
);
}
};
//運行遺傳算法
ga.Start();
//輸出最終結果
var bestChromosome = ga.BestChromosome as FloatingPointChromosome;
var phenotype = bestChromosome.ToFloatingPoints();
var bestFitness = bestChromosome.Fitness.Value ;
Console.WriteLine(
"Final Generation {0,2}: ({1},{2}),({3},{4}) = {5}",
ga.GenerationsNumber,
phenotype[0],
phenotype[1],
phenotype[2],
phenotype[3],
bestFitness
);
Console.ReadKey();
}
}
}

浙公網安備 33010602011771號