GAFT: Python で実装された遺伝的アルゴリズム フレームワーク

GAFT: Python で実装された遺伝的アルゴリズム フレームワーク

序文

最近、遺伝的アルゴリズムを使用していくつかのことを最適化する必要があります。当初は、最適化のためにいくつかのアルゴリズムに基づいて簡単な関数を実装する予定でしたが、後で実行するために非一般的な関数を単に記述するだけでは、演算子を改善したり、他の人が使用したりすることが困難になると感じています。同時に、遺伝的アルゴリズムの基本的な概念と操作プロセスは比較的固定されており、一般的にはエンコードメカニズム、選択戦略、交差突然変異演算子、およびパラメーター設計を通じて改善が行われ、アルゴリズムの全体的な構造に大きな影響を与えません。これにより、遺伝的アルゴリズムでは、比較的固定されたフレームワークを記述し、演算子やパラメーターなどのためのスペースを残して、新しいアルゴリズムをテストおよび改善することが非常に適したものになります。そこで、GAFT という小さな遺伝的アルゴリズム フレームワークを作成しました。この記事では、このフレームワークを紹介し、1 次元検索と 2 次元検索を例に使用してその使用方法について説明します。

  • GitHub: https://github.com/PytLab/gaft
  • pypi: https://pypi.python.org/pypi/gaft について

現在、フレームワークは初期バージョンのみが完成しており、比較的シンプルで、よく使用される基本的な演算子がいくつか組み込まれています。ユーザーは、インターフェース ルールに従ってカスタム演算子を実装し、フレームワークに組み込んで操作することができます。また、自分のニーズに応じてさらに改良された演算子を追加し、フレームワークをより汎用的なものにするために改良していきます。

文章

遺伝的アルゴリズム入門

ここでは、遺伝的アルゴリズムの基本概念を簡単に紹介し、GAFT の設計原則について説明します。

簡単に言えば、遺伝的アルゴリズムは集団探索技術を使用して、問題に対する実行可能な解決策のグループを表します。選択、交差、突然変異などの一連の遺伝的操作を現在の集団に適用することで、新しい世代の集団が生成され、集団は徐々に、おおよその全体最適解を含む状態に進化します。以下に、遺伝学と遺伝的アルゴリズム関連の用語の対応をまとめます。

用語

アルゴリズムの特徴

  1. 決定変数のエンコードを操作オブジェクトとして使用することで、最適化プロセスで生物学の概念を借用することが可能になります。
  2. 目的関数を検索情報として直接使用して、検索方向と範囲を決定します。これは、導関数を使用しない最適化に属します。
  3. 複数の検索ポイントからの検索情報を同時に使用することは、暗黙的な並列処理です。
  4. これは確率ベースの検索手法です。
  5. 自己組織化、自己適応、自己学習の特性を備えています。

アルゴリズムフロー

GAFT 設計原則

遺伝的アルゴリズムのプロセスは比較的固定されているため、私たちの最適化アルゴリズムは基本的に、プロセスの全体的なフレームワーク内でエンコードメカニズム、演算子、パラメータなどを変更します。そのため、フレームワークを作成するときに、それらの固定された遺伝的演算子と適応度関数をインターフェースに書き込み、メタクラス、デコレータなどを使用してインターフェースを制限および最適化し、その後の演算子と適応度関数のカスタマイズに便利になるようにしたいと考えました。 *** すべてのパーツを組み合わせてエンジンを形成し、アルゴリズム フローに従って遺伝的アルゴリズムを実行してターゲットを最適化します。

この方法により、遺伝的アルゴリズムのプロセスを毎回記述する面倒さから解放されます。プラグインを作成するように独自の演算子と適応度関数を実装し、それらを GAFT に組み込むだけで、アルゴリズムのテストや目的関数の最適化を開始できます。

GAFT ファイル構造

このセクションでは、私が実装したフレームワークの全体的な構造を紹介します。

  1.  
  2. ├── ライセンス
  3.  
  4. ├──マニフェスト 
  5.  
  6. ├── README.rst
  7.  
  8. ├── 例
  9.  
  10. │ ├── ex01
  11.  
  12. │ └── ex02
  13.  
  14. ├── ガフト
  15.  
  16. │ ├── __init__.py
  17.  
  18. │ ├── __pycache__
  19.  
  20. │ ├── 分析
  21.  
  22. │ ├── コンポーネント
  23.  
  24. │ ├── engine.py
  25.  
  26. │ ├── 演算子
  27.  
  28. │ └── プラグインインターフェース
  29.  
  30. ├── セットアップ.cfg
  31.  
  32. ├── セットアップ.py
  33.  
  34. └── テスト
  35.  
  36. ├── flip_bit_mutation_test.py
  37.  
  38. ├── gaft_test.py
  39.  
  40. ├── 個別テスト.py
  41.  
  42. ├── population_test.py
  43.  
  44. ├── ルーレットホイール選択テスト.py
  45.  
  46. └── ユニフォームクロスオーバーテスト.py

現在のファイルの結果は上記に表示されます。

  • 組み込みの個体および集団タイプは /gaft/components で定義され、バイナリ エンコーディングと実数エンコーディングという 2 つの異なる遺伝子エンコーディング方法を提供します。
  • /gaft/plugin_interfaces にはプラグイン インターフェース定義が含まれており、オンザフライ分析のためのすべての演算子定義とインターフェース ルールが含まれています。ユーザーはこれを基に独自のプラグインを作成し、エンジンに組み込むことができます。
  • /gaft/operators には組み込みの遺伝的演算子が含まれています。これらは /gaft/plugin_interfaces のルールに従って記述されており、演算子の記述例として使用できます。演算子の中には、ルーレットホイール選択演算子、ユニフォーム交差演算子、フリップビット突然変異演算子が組み込まれています。ユーザーは組み込み演算子を直接使用して、GAFT を使用して独自の問題を最適化できます。
  • /gaft/analysis には、遺伝的アルゴリズムの反復プロセスで変数を分析できる組み込みのオンザフライ分析プラグインが含まれています。たとえば、進化曲線の描画を容易にするために、コンソール ログ情報出力プラグインと反復適応値保存プラグインを組み込みました。
  • /gaft/engine は遺伝的アルゴリズムのプロセス制御モジュールです。これは、以前に定義されたすべての部分を結合し、遺伝的アルゴリズムのプロセスを使用して最適化の反復を実行します。

GAFTの使用

以下では、GAFT を使用して目的関数を最適化する例として 2 つの関数を使用します。

一次元検索

まず、複数の局所極値を持つ単純な関数を最適化してみましょう。組み込み演算子を使用して、関数f(x)=x+10sin(5x)+7cos(4x)の最大値を見つけます。ここで、xの値は範囲[0,10]にあります。

1.まず必要なモジュールをインポートする

  1. 数学からインポート sin、cos
  2.  
  3.   
  4.  
  5. # population と組み込み演算子関連のクラスをインポートする
  6.  
  7. gaftからGAEngine をインポート
  8.  
  9. gaft.componentsからGAIndividual をインポートします
  10.  
  11. gaft.componentsからGAPopulation をインポートします
  12.  
  13. gaft.operatorsからRouletteWheelSelection をインポートします
  14.  
  15. gaft.operatorsからUniformCrossover をインポートします
  16.  
  17. gaft.operatorsからFlipBitMutation をインポートします
  18.  
  19.   
  20.  
  21. #分析プラグインを書くためのインターフェースクラス
  22.  
  23. gaft.plugin_interfaces.analysisからOnTheFlyAnalysis をインポートします
  24.  
  25.   
  26.  
  27. # 組み込みアーカイブ適合関数の分析クラス
  28.  
  29. gaft.analysis.fitness_storeからFitnessStoreAnalysis をインポートします
  30.  
  31.   
  32.  
  33. # 解析プラグインを遺伝的アルゴリズムエンジンに登録するには2つの方法があります

2. エンジンを作成する

  1. # 人口を定義する
  2.  
  3. indv_template = GAIndividual(範囲=[(0, 10)]、エンコード= 'バイナリ' 、eps=0.001)
  4.  
  5. 人口 = GAPopulation(indv_template=indv_template、サイズ=50)
  6.  
  7.   
  8.  
  9. # 遺伝的演算子を作成する
  10.  
  11. 選択 = ルーレットホイール選択()
  12.  
  13. クロスオーバー = UniformCrossover(pc=0.8, pe=0.5)
  14.  
  15. 突然変異 = FlipBitMutation(pm=0.1)
  16.  
  17.   
  18.  
  19. # 遺伝的アルゴリズムエンジンを作成します。分析プラグインと適応度関数は、パラメータとしてエンジンに渡すことができます。
  20.  
  21. エンジン = GAEngine(人口 = 人口、選択 = 選択、
  22.  
  23. 交差=クロスオーバー、突然変異=突然変異、
  24.  
  25. 分析=[FitnessStoreAnalysis])

3. カスタムフィットネス関数

適合関数は、修飾子を使用してエンジンに登録できます。

  1. @engine.fitness_register
  2.  
  3. 定義フィットネス(indv):
  4.  
  5. x, = 独立変数
  6.  
  7. x + 10*sin(5*x) + 7*cos(4*x)を返します

4. カスタムオンザフライ分析プラグイン

プラグインを定義する際に修飾子を使用して、プラグインをエンジンに直接登録することもできます。

  1. @engine.analysis_register
  2.  
  3. クラス ConsoleOutputAnalysis(OnTheFlyAnalysis):
  4.  
  5. 間隔 = 1
  6.  
  7.   
  8.  
  9. def register_step(self, ng, population, engine):
  10.  
  11. best_indv = population.best_indv(engine.fitness)
  12.  
  13. msg = '世代: {}、最適な適応度: {:.3f}' .format(ng, engine.fitness(best_indv))
  14.  
  15. engine.logger.info(メッセージ)
  16.  
  17.   
  18.  
  19. def finalize(self, population, engine):
  20.  
  21. best_indv = population.best_indv(engine.fitness)
  22.  
  23. x = ベスト_indv.variants
  24.  
  25. y = engine.fitness(ベストインダストリー)
  26.  
  27. msg = '最適解: ({}, {})' .format(x, y)
  28.  
  29. engine.logger.info(メッセージ)

5. では、実行(最適化)を始めましょう!

ここでは 100 世代の人口を飼育しています。

  1. '__main__' == __name__ の場合:
  2.  
  3. # GA エンジンを実行します。
  4.  
  5. エンジンを実行(ng=100)

組み込みの分析プラグインは、各反復で各世代の最良の個体を記録し、保存用のデータを生成します。

関数自体の曲線と遺伝的アルゴリズムを使用して得られる進化曲線をプロットします。

最適化プロセスのアニメーション:

2D検索

次に、GAFTの組み込み演算子を使用して、複数の極値点を持ち、x、yの範囲が[−2,2]であるバイナリ関数f(x) = ysin(2πx) + xcos(2πy)の最大値を検索します。

ここでは、分析プラグインをカスタマイズするのではなく、組み込みの分析クラスを直接使用し、エンジンの構築時に直接渡します。

  1. '' '
  2.  
  3. グローバル最大値見つける バイナリ 関数: f(x) = y*sim(2*pi*x) + x*cos(2*pi*y)
  4.  
  5. '' '
  6.  
  7.   
  8.  
  9. 数学からsin、cos、pi をインポート
  10.  
  11.   
  12.  
  13. gaftからGAEngine をインポート
  14.  
  15. gaft.componentsからGAIndividual をインポートします
  16.  
  17. gaft.componentsからGAPopulation をインポートします
  18.  
  19. gaft.operatorsからRouletteWheelSelection をインポートします
  20.  
  21. gaft.operatorsからUniformCrossover をインポートします
  22.  
  23. gaft.operatorsからFlipBitMutation をインポートします
  24.  
  25.   
  26.  
  27. #最適なフィットネス分析が組み込まれています
  28.  
  29. gaft.analysis.fitness_storeからFitnessStoreAnalysis をインポートします
  30.  
  31. gaft.analysis.console_outputからConsoleOutputAnalysis をインポートします
  32.  
  33.   
  34.  
  35. # 人口を定義します。
  36.  
  37. indv_template = GAIndividual(範囲=[(-2, 2), (-2, 2)], エンコーディング= 'バイナリ' , eps=0.001)
  38.  
  39. 人口 = GAPopulation(indv_template=indv_template、サイズ=50)
  40.  
  41.   
  42.  
  43. # 遺伝的演算子を作成します
  44.  
  45. 選択 = ルーレットホイール選択()
  46.  
  47. クロスオーバー = UniformCrossover(pc=0.8, pe=0.5)
  48.  
  49. 突然変異 = FlipBitMutation(pm=0.1)
  50.  
  51.   
  52.  
  53. # 遺伝的アルゴリズムエンジンを作成します
  54.  
  55. # ここでは、すべての組み込み分析をエンジンコンストラクター渡します。
  56.  
  57. エンジン = GAEngine(人口 = 人口、選択 = 選択、
  58.  
  59. 交差=クロスオーバー、突然変異=突然変異、
  60.  
  61. 分析=[コンソール出力分析、フィットネスストア分析])
  62.  
  63.   
  64.  
  65. # 適応度関数を定義します
  66.  
  67. @engine.fitness_register
  68.  
  69. 定義フィットネス(indv):
  70.  
  71. x, y = 独立変数
  72.  
  73. y*sin(2*pi*x) + x*cos(2*pi*y) を返します
  74.  
  75.   
  76.  
  77. '__main__' == __name__ の場合:
  78.  
  79. エンジンを実行(ng=100)

進化曲線:

2次元関数面:

検索プロセスのアニメーション:

この例から、現在組み込まれている基本演算子は関数のクライマックスを非常にうまく見つけることができることがわかります。

要約する

この記事では主に、遺伝的アルゴリズムの最適化計算用に私が開発した Python フレームワークを紹介します。このフレームワークには、個体、集団、さまざまなエンコード方法を持つ遺伝的演算子など、遺伝的アルゴリズムでよく使用されるコンポーネントが組み込まれています。同時に、このフレームワークはカスタム遺伝的演算子と分析プラグイン用のインターフェースも提供しており、遺伝的アルゴリズムのプロセスを簡単かつ迅速に構築し、アルゴリズムのテストに使用することができます。

現在、このフレームワークはまだ初期段階にあります。今後、私自身が使用していく過程で、より多くの組み込み演算子が徐々に改善され、フレームワークの汎用性が高まります。この記事の両方の最適化例のソースコードは、GitHub (https://github.com/PytLab/gaft/tree/master/examples) にあります。

現在の計画: 1. 組み込み演算子の追加、2. 組み込み演算子とコンポーネントへの C++ バックエンドの追加、3. 並列化

参照する

  • インテリジェント最適化アルゴリズムとその MATLAB の例
  • 《MATLAB最適化コンピューティング》

<<:  ディープラーニングを使用してXSSを検出する方法

>>:  従来の銀行は人工知能をどのように活用しているのでしょうか? ——2017年中国国際金融博覧会で光り輝く民生銀行の技術革新に関するメモ

ブログ    
ブログ    

推薦する

...

...

...

...

3Wイノベーションフェスティバル:先進的な起業家のアイデアが古都西安に流入

最近、西安で3Wイノベーションフェスティバルが開催されました。西安起業・イノベーション週間の代表的な...

...

MetaGPT AIモデルオープンソース:ソフトウェア会社の開発プロセスをシミュレートし、高品質のコードを生成できます

7月4日、コード生成に重点を置いたAIモデルとしてMetaGPTが発表された。名前は似ているが、Me...

2021 年の人工知能に関する詳細な研究: 機械学習は最終的に人間の医師に取って代わるのでしょうか?

[[377208]]これから議論する論文で採用されているアプローチは、これまでのどのアプローチより...

インペリアル・カレッジ:専門医の80%が懸念する心臓リズムデバイスインプラント手術問題をAIで解決する方法

インペリアル・カレッジ・ロンドンの研究者らは、ペースメーカーや除細動器のメーカーとモデルを識別するた...

OpenAIの最強のライバルトレーニングAIがLLMブラックボックスを分解し、ビッグモデルの「魂」を予期せず垣間見る

大規模なモデルの「ブラックボックス」を解体するために、人類解釈可能性チームは、新しいモデルをトレーニ...

...

生成 AI によってもたらされるセキュリティ リスクをどう解決するか? Akamai が答えを持っています

現在、あらゆる分野で革新的なテクノロジーを活用して産業のアップグレードを加速する方法が模索されており...

1億3000万元の無人公共交通システムの調達に関する簡単な分析:車両のインターネットの商用利用の条件が整っている

最近、鄭州市鄭東新区龍湖区の無人バスシステムプロジェクトの調達入札公告が発表された。自動運転バス路線...

量子コンピューティングの画期的な論文3本がネイチャーの表紙に登場:忠実度は99%を超え、実用レベルに到達

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...