遺伝的アルゴリズムの基本概念と実装(Java 実装例付き)

遺伝的アルゴリズムの基本概念と実装(Java 実装例付き)

上図(左)に示すように、個体が複数の染色体で構成され、各染色体が複数の遺伝子で構成されている場合に遺伝的アルゴリズムが使用されます。上の図(右)は染色体がどのように分割され、結合されるかを示しています。

自然選択の概念

自然選択のプロセスは、グループ内の環境に最も適応した個体を選択することから始まります。子孫は親の特徴を継承し、その特徴は次の世代に追加されます。親の適応度が高ければ、その子孫が生き残る可能性が高くなります。この自然選択のプロセスを繰り返し実行することで、最終的には環境に最も適応した個体で構成される世代が得られます。

この概念は検索問題に適用できます。私たちは問題に対する多くの解決策を検討し、最善のものを探します。

遺伝的アルゴリズムは次の 5 つのステップで構成されます。

  1. 初期化
  2. 個別評価(適応度関数の計算)
  3. 操作を選択
  4. クロスオーバー操作
  5. 突然変異操作

初期化

このプロセスは、集団内の個体の集合から始まります。各個体は、解決すべき問題に対する候補となる解決策です。

個体は遺伝子と呼ばれる一連のパラメータ(変数)によって特徴付けられ、遺伝子が連結されて染色体(問題の解決策)を形成します。

遺伝的アルゴリズムでは、単一の個体のゲノムは文字列の形式で表されます。通常はバイナリ (1 と 0 の文字列) エンコーディングを使用できます。つまり、バイナリ文字列は染色体文字列を表します。したがって、遺伝子列または候補ソリューションの特性を染色体にエンコードしていると言えます。

集団、染色体、遺伝子

個別評価(適応度関数の計算)

個体評価では、適応度関数を使用して、個体の環境への適応度 (他の個体と競争する能力) を評価します。各個体には適応度スコアがあり、個体が繁殖のために選択される可能性はその適応度スコアによって決まります。適合関数の値が大きいほど、ソリューションの品質が高くなります。適応度関数は遺伝的アルゴリズムの進化の原動力であり、自然選択の唯一の基準です。適応度関数の設計は、解決する問題の要件に基づいて行う必要があります。

操作を選択

選択操作の目的は、最も適応度の高い個体を選択し、その遺伝子を次の世代に受け継ぐことです。適応度スコアに基づいて、優れた個体(親)のペアを複数選択します。適応度の高い個体は、繁殖のために選択される可能性、つまり、より優れた親の遺伝子を次の世代に伝える可能性が高くなります。

クロスオーバー操作

交差操作は遺伝的アルゴリズムにおいて最も重要な段階です。それぞれの親のペアごとに、遺伝子にはランダムに選択された交差ポイントがあります。

例えば、次の図の交点は 3 です。

子孫は、交差点の前に親の間で遺伝子が交換されることによって生成されます。

親の間で遺伝子が交換され、その結果生まれた新しい子孫が集団に加えられます。

突然変異操作

新たに形成された子孫の中には、その遺伝子の一部が低確率の突然変異因子の影響を受けるものもあるかもしれません。これは、バイナリ ビット文字列の一部のビットが反転される可能性があることを意味します。

突然変異操作の前後

突然変異操作は、集団内の多様性を維持し、早期の収束を防ぐために使用できます。

終了

アルゴリズムは、集団が収束すると終了します (集団内に前の世代と大きく異なる子孫が生成されなくなります)。つまり、遺伝的アルゴリズムは一連の問題に対する解決策を提供します。
ケース実装

人口の規模は一定です。新しい世代が形成されると、適応度の最も低い個体は、次の世代のために場所を空けるために死にます。これらの段階のシーケンスが何度も繰り返され、以前の世代よりも優れた新しい世代が生み出されます。

この反復プロセスの疑似コード:

始める
初期人口を生成する
フィットネスを計算する
繰り返す
選択
クロスオーバー
突然変異
フィットネスを計算する
人口が収束するまで
停止

Javaでの実装例

以下は、Java での遺伝的アルゴリズムのサンプル実装です。自由にコードをデバッグおよび変更できます。 5 つの遺伝子のセットがある場合、各遺伝子は 0 または 1 のバイナリ値を保持できます。ここでの適応度はゲノム内の 1 の数です。ゲノムに 1 が 5 つある場合、個体の適応度は最大値に達します。ゲノムに1がない場合、個体の適応度は最小になります。遺伝的アルゴリズムは、適応度を最適化し、最も高い適応度を持つ個体で構成されるグループを提供することを目的としています。注: この例では、交差と突然変異の操作の後、最も適応度の高い個体が、最も適応度の高い新しい子孫に置き換えられます。

java.util.Random をインポートします。

/**
*
* @author ヴィジニ
*/

//メインクラス
パブリッククラスSimpleDemoGA {

人口 population = new Population();
適者生存;
個々のsecondFittest;
世代カウント = 0;

パブリック静的voidメイン(String[] args) {

ランダム rn = new Random();

SimpleDemoGA デモ = 新しい SimpleDemoGA();

//人口を初期化する
デモ.population.initializePopulation(10);

//各個体の適応度を計算する
デモ: 人口統計を計算します。

System.out.println("世代: " + demo.generationCount + " 適合度: " + demo.population.fittest);

//集団は最大の適応度を持つ個体を獲得する
(demo.population.fittest < 5) の間 {
++デモ.世代数;

//選択を行う
デモ.選択();

//クロスオーバーを行う
デモ.クロスオーバー();

//ランダムな確率で突然変異を行う
(rn.nextInt()%7 < 5)の場合{
デモ.mutation();
}

//最も適応した子孫を集団に追加する
デモ:

//新しい適合度値を計算
デモ: 人口統計を計算します。

System.out.println("世代: " + demo.generationCount + " 適合度: " + demo.population.fittest);
}

System.out.println("\n世代 " + demo.generationCount で解決策が見つかりました);
System.out.println("フィットネス: "+demo.population.getFittest().fitness);
System.out.print("遺伝子: ");
(int i = 0; i < 5; i++) の場合 {
System.out.print(demo.population.getFittest().genes[i]);
}

System.out.println("");

}

//選択
void 選択() {

//最も適応度の高い個体を選択する
人口統計

// 2番目に適応度の高い個体を選択する
人口統計データ
}

//クロスオーバー
void クロスオーバー() {
ランダム rn = new Random();

//ランダムなクロスオーバーポイントを選択する
int crossOverPoint = rn.nextInt(population.individuals[0].geneLength);

//親の間で値を交換
(int i = 0; i < クロスオーバーポイント; i++) {
temp = fittest.genes[i];
fittest.genes[i] = secondFittest.genes[i];
secondFittest.genes[i] = temp;

}

}

//突然変異
void ミューテーション() {
ランダム rn = new Random();

//ランダムな突然変異点を選択する
int 変異ポイント = rn.nextInt(population.individuals[0].geneLength);

//突然変異ポイントで値を反転する
(fittest.genes[mutationPoint] == ​​0)の場合{
fittest.genes[変異ポイント] = 1;
} それ以外 {
fittest.genes[変異ポイント] = 0;
}

変異ポイント = rn.nextInt(population.individuals[0].geneLength);

if (secondFittest.genes[mutationPoint] == ​​0) {
secondFittest.genes[変異ポイント] = 1;
} それ以外 {
secondFittest.genes[変異ポイント] = 0;
}
}

//最も適応力のある子孫を得る
個体 getFittestOffspring() {
(fittest.fitness > secondFittest.fitness)の場合{
最も適したものを返します。
}
secondFittest を返します。
}


//最も適応度の低い個体を最も適応度の高い子孫から置き換える
void addFittestOffspring() {

//子孫の適応度値を更新する
fittest.calcFitness();
計算フィットネス();

//最も適合度の低い個体のインデックスを取得する
最小適合指数 = population.getLeastFittestIndex();

//最も適応度の低い個体を最も適応度の高い子孫から置き換える
population.individuals[leastFittestIndex] = getFittestOffspring();
}

}


//個別のクラス
クラス 個人 {

int フィットネス = 0;
int[] 遺伝子 = 新しい int[5];
int 遺伝子の長さ = 5;

パブリック個人() {
ランダム rn = new Random();

//各個体の遺伝子をランダムに設定する
(int i = 0; i < genes.length; i++) の場合 {
遺伝子[i] = rn.nextInt() % 2;
}

フィットネス = 0;
}

//フィットネスを計算する
パブリック void calcFitness() {

フィットネス = 0;
(int i = 0; i < 5; i++) の場合 {
遺伝子[i] == 1の場合{
++フィットネス;
}
}
}

}

//人口クラス
クラス人口 {

整数ポップサイズ = 10;
個体[] 個体 = 新しい個体[10];
int 適合度 = 0;

//人口を初期化する
パブリック void 初期化人口 (int サイズ) {
(int i = 0; i < 個人.長さ; i++) {
個人[i] = 新しい個人();
}
}

//最も適応度の高い個体を取得する
パブリック個人 getFittest() {
int maxFit = Integer.MIN_VALUE;
(int i = 0; i < 個人.長さ; i++) {
(maxFit <= 個人[i].fitness)の場合{
最大フィット = i;
}
}
最も適している = 個人[maxFit].fitness;
個体[maxFit]を返します。
}

// 2番目に適応度の高い個体を取得する
パブリック個人 getSecondFittest() {
整数maxFit1 = 0;
整数maxFit2 = 0;
(int i = 0; i < 個人.長さ; i++) {
(個人[i].フィットネス > 個人[maxFit1].フィットネス){
最大フィット2 = 最大フィット1;
最大フィット1 = i;
} そうでない場合 (individuals[i].fitness > individuals[maxFit2].fitness) {
最大フィット2 = i;
}
}
個体[maxFit2]を返します。
}

//最も適合度の低い個体のインデックスを取得する
パブリック int getLeastFittestIndex() {
最小フィット = 0;
(int i = 0; i < 個人.長さ; i++) {
minFit >= 個人[i].適応度)の場合{
最小フィット = i;
}
}
minFit を返します。
}

//各個体の適応度を計算する
パブリック void 計算フィットネス() {

(int i = 0; i < 個人.長さ; i++) {
個人[i].calcFitness();
}
getFittest();
}

}

<<:  パーセントポイントの劉一静氏:おそらくこれは人工知能をこのように見るべきだ

>>:  感情コンピューティングは人間とコンピュータの相互作用の中核となるのでしょうか?感情分析におけるディープラーニングの応用について

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

重要なお知らせです!顔認識のために服を着用する必要があります!

[[409661]]画像はBaotu.comより顔認識は、多くのソフトウェアの ID セキュリティ...

小売業界におけるAIインテリジェントビデオ分析の応用

人工知能 (AI) は、情報の集合からビジネス価値のある洞察を抽出することを目的とするデータ サイエ...

機械学習が近い将来教育を変える5つの方法

テクノロジーは私たちの生活、仕事、遊び方を変えており、教育も例外ではありません。機械学習は他の分野を...

...

なぜRLの一般化は難しいのか:バークレーの博士が認知POMDPと暗黙の部分観測性から説明する

[[437395]]今日の強化学習 (RL) には、収束性が低いなど多くの問題があります。比較的弱い...

...

AI + コンサルティング: データ サイエンティストはコンサルタントになるか?

AIはコンサルティング業界に新たな春をもたらすでしょうか?大手コンサルティング会社の AI 開発部...

アマゾンとファーウェイの機械学習面接を経験すると、試験官はこれらの答えを聞きたがっていることが判明

[[245589]]ジョージ・セイフ氏はこれまで、主にデータサイエンスや機械学習関連の職種を対象に、...

この「ペア」は悪くないですね! AIとのペアプログラミング

翻訳者 |陳俊レビュー | Chonglou 「ペアプログラミング」という概念を聞いたことがあります...

自動運転ブームがAIチップ戦争に火をつけ、爆発したのはテスラだけではない

以前から大きく騒がれ、メディアもその信憑性を証明する手がかりを繰り返し探していた「テスラの自社開発A...

機械学習により顕微鏡検査がこれまで以上に向上

機械学習は、最も優れた顕微鏡のいくつかがより鮮明に見え、より速く動作し、より多くのデータを処理するの...

Midjourney はテキストを生成できます。 V6バージョンの5つの主要なアップグレードがネットユーザーを驚かせる

Midjourney がメジャーアップデートされ、バージョン V6 がリリースされました!アップデー...

...