次のコードは、C# 遺伝的アルゴリズムを使用して、単純な花の進化シミュレーション プロセスを実装します。 花の個体数は10で、50世代にわたって進化してきました。プログラムを実行すると、継続的な進化を通じて、集団の環境への適応能力が全体的に徐々に向上していることがわかります (適応度の値が減少します)。 C# 遺伝的アルゴリズムの実装コード: - システムの使用;
- System.Collections.Generic を使用します。
- System.Text を使用します。
- 名前空間 GA
- {
- クラスプログラム
- {
- 静的void Main(文字列[] 引数)
- {
- ワールドworld = new World();
- ワールドを初期化します。
- (int i = 0 ; i < 50 ; i++)
- {
- ワールドを進化させる();
- コンソールに行を書き込む
- ワールドを表示();
- }
- }
- }
-
- クラスワールド
- {
- int kMaxFlowers = 11 ;
- ランダムRnd = new Random();
- パブリックint[] 温度;
- パブリックint[] 水;
- パブリックint[] 日光;
- パブリックint[] 栄養素;
- パブリックint[]有益な昆虫;
- パブリックint[] 有害な昆虫;
- パブリック int 現在の温度;
- パブリック int currentWater;
- パブリック int 現在の太陽光;
- パブリック int 現在の栄養素;
- パブリック int currentBeneficialInsect;
- パブリック int currentHarmfulInsect;
- パブリックワールド()
- {
- 温度=新しいint[kMaxFlowers];
- 水=新しいint[kMaxFlowers];
- 日光=新しいint[kMaxFlowers];
- 栄養素=新しいint[kMaxFlowers];
- 有益な昆虫=新しいint[kMaxFlowers];
- 有害な昆虫=新しいint[kMaxFlowers];
- }
- /**//// <要約>
- /// 第一世代の花の遺伝子構造を初期化する
- /// </要約>
- パブリック void Init()
- {
- (int i = 1 ; i < kMaxFlowers ; i++) は、
- {
- 温度[i] = Rnd.Next(1, 75);
- 水[i] = Rnd.Next(1, 75);
- 日光[i] = Rnd.Next(1, 75);
- 栄養素[i] = Rnd.Next(1, 75);
- 有益な昆虫[i] = Rnd.Next(1, 75);
- 有害な昆虫[i] = Rnd.Next(1, 75);
- }
- 現在の温度= Rnd.Next (1, 75);
- 現在の水= Rnd.Next (1, 75);
- 現在の太陽光= Rnd.Next (1, 75);
- currentNutrient = Rnd.Next (1, 75);
- currentBeneficialInsect = Rnd.Next (1, 75);
- currentHarmfulInsect = Rnd .Next(1, 75);
- }
- /**//// <要約>
- /// 花のサイズが大きいほど、環境に適応する能力は弱くなり、サイズが小さいほど、環境に適応する能力は強くなります。
- /// </要約>
- /// <パラメータ 名前= "花" > </パラメータ>
- /// <戻り値> </戻り値>
- プライベート int フィットネス(int flower)
- {
- intフィットネス= 0 ;
- theFitness = Math.Abs (温度[花] - 現在の温度);
- theFitness theFitness = theFitness + Math.Abs(water[flower] - currentWater);
- theFitness theFitness = theFitness + Math.Abs(sunlight[flower] -
- 現在の日光);
- theFitness theFitness = theFitness + Math.Abs(nutrient[flower] -
- 現在の栄養素);
- theFitness theFitness = theFitness + Math.Abs(beneficialInsect[flower] -
- 現在の有益な昆虫);
- theFitness theFitness = theFitness + Math.Abs(harmfulInsect[flower] -
- 現在の有害昆虫);
- 戻り値(theFitness);
- }
- /**//// <要約>
- /// 適応性の低い花を排除し、適応性の高い花同士が交配して繁殖し、次世代を生み出すようにします。同時に、突然変異が起こる可能性も一定程度あります。
- /// </要約>
- パブリック void Evolve()
- {
- int[] fitTemperature =新しいint[kMaxFlowers];
- int[] fitWater =新しいint[kMaxFlowers];
- int[] fitSunlight =新しいint[kMaxFlowers];
- int[] fitNutrient =新しいint[kMaxFlowers];
- int[] fitBeneficialInsect =新しいint[kMaxFlowers];
- int[] fitHarmfulInsect =新しいint[kMaxFlowers];
- int[]フィットネス=新しいint[kMaxFlowers];
- 整数 i;
- 最小フィット= 0 ;
- 最小フィットインデックス= 1 ;
- ( i = 1 ; i < kMaxFlowers ; i++) は、
- (適合度(i) >最小適合度)の場合
- {
- leastFit =フィットネス(i);
- 最小フィットインデックス= i;
- }
- 温度[leastFitIndex] = 温度[Rnd.Next(1, 10)];
- water[leastFitIndex] = water[Rnd.Next(1, 10)];
- 日光[leastFitIndex] = 日光[Rnd.Next(1, 10)];
- nutrient[leastFitIndex] = nutrient[Rnd.Next(1, 10)];
- 有益な昆虫[leastFitIndex] = 有益な昆虫[Rnd.Next(1, 10)];
- 有害昆虫[leastFitIndex] = 有害昆虫[Rnd.Next(1, 10)];
- ( i = 1 ; i < kMaxFlowers ; i++) は、
- {
- fitTemperature[i] = 温度[Rnd.Next(1, 10)];
- fitWater[i] = water[Rnd.Next(1, 10)];
- フィットサンライト[i] = 日光[Rnd.Next(1, 10)];
- fitNutrient[i] = nutrient[Rnd.Next(1, 10)];
- 有益な昆虫をフィットさせる[i] = 有益な昆虫[Rnd.Next(1, 10)];
- 有害昆虫をiに適合させる[Rnd.Next(1, 10)];
- }
- ( i = 1 ; i < kMaxFlowers ; i++) は、
- {
- 温度[i] = fitTemperature[i];
- 水[i] = fitWater[i];
- 日光[i] = fitSunlight[i];
- 栄養素[i] = fitNutrient[i];
- 有益な昆虫[i] = fitBeneficialInsect[i];
- 有害な昆虫[i] = 適合する有害昆虫[i];
- }
- ( i = 1 ; i < kMaxFlowers ; i++) は、
- {
- (Rnd.Next(1, 100) == 1)の場合
- 温度[i] = Rnd.Next(1, 75);
- (Rnd.Next(1, 100) == 1)の場合
- 水[i] = Rnd.Next(1, 75);
- (Rnd.Next(1, 100) == 1)の場合
- 日光[i] = Rnd.Next(1, 75);
- (Rnd.Next(1, 100) == 1)の場合
- 栄養素[i] = Rnd.Next(1, 75);
- (Rnd.Next(1, 100) == 1)の場合
- 有益な昆虫[i] = Rnd.Next(1, 75);
- (Rnd.Next(1, 100) == 1)の場合
- 有害な昆虫[i] = Rnd.Next(1, 75);
- }
- }
- /**//// <要約>
- /// 集団内の個体の環境への適応性、およびすべての個体の環境への適応性の合計を表示します。
- /// </要約>
- パブリック void 表示()
- {
- 整数合計= 0 ;
- (int i = 1 ; i < kMaxFlowers ; i++) は、
- {
- intフィットネス=フィットネス(i);
- 合計 += 適応度;
- Console.WriteLine("No." + i + "のフィットネスは" + フィットネスです);
- }
- Console.WriteLine("適応度の合計は " + 合計です);
- }
- }
- }
上記はC#遺伝的アルゴリズムの学習ノートです |