ただの楽しみのために、Go 言語を学ぶことにしました。新しい言語を学ぶ最良の方法は、深く学び、できるだけ多くの間違いをすることだと思います。これは遅くなるかもしれませんが、プロセスの後半でコンパイル エラーが発生しないことが保証されます。 Go は私が慣れている他の言語とは異なります。 Go は個別の実装を好みますが、Java などの他の言語は継承を好みます。実際、Go 言語にはオブジェクトの概念がまったくないため、継承などの概念は存在しません。たとえば、C 言語には構造体はありますが、クラスはありません。しかし、それでも「コンストラクター」(この場合、構造を整然と生成する方法) などの共通のアイデアや設計パターンは許可されます。 Go 言語は、合成をしっかりとサポートし、継承に反対しており、インターネット上で白熱した議論を巻き起こし、言語が発展すべき方向性を再考するきっかけとなりました。なので、この観点から見ると、Go と他の言語の違いはそれほど大きくないかもしれません。 この記事では、Go 言語で遺伝的アルゴリズムを実装する方法に焦点を当てます。 GoLang ツアーにまだ参加していない場合は、言語の紹介も簡単に見ることをお勧めします。 さっそく、コードを見てみましょう。最初の例は、私が以前にやったことと非常に似ています。2 次最小値を見つけることです。
後でアルゴリズムを起動するときに使用する一連の設定をすぐに定義します。 2 番目の部分である GeneticAlgorithmRunner は少し奇妙に見えます。 GeneticAlgorithmRunner は、初期の集団を生成する方法を尋ね、交差と突然変異を実行し、回答を並べ替えて、次の世代がより優れたものになるように、集団内の最良の個体を維持するインターフェースです。 「インターフェース」は通常、オブジェクト指向言語で使用され、通常はオブジェクトが特定の特性とメソッドを実装することを必要とするため、これは奇妙に思えます。ここに違いはありません。この短いコード スニペットが実際に言っているのは、これらのメソッドの詳細を定義する何かを要求しているということです。私がそれをやった方法は次のとおりです:
さらに奇妙なのは、これらのメソッドのインターフェースについては一度も言及していないことです。オブジェクトが存在しないため、継承は存在しないことに注意してください。 QuadraticGA 構造は、暗黙的に GeneticAlgorithmRunner として機能する空のオブジェクトです。必要な各メソッドは、Java の「@ override」と同様に、括弧で囲まれた構造体にバインドされます。ここで、構造と設定をアルゴリズムを実行するモジュールに渡す必要があります。
とても簡単ですよね? 「QuadraticGA{}」は単に構造体の新しいインスタンスを作成し、Run() メソッドが残りの処理を実行します。このメソッドは検索結果と発生したエラーを返します。これは、Go が try/catch を信じていないためです。これは、war の作者が採用したもう 1 つの厳格な設計スタンスです。 ここで、各項のパフォーマンスを計算し、2次関数によって得られた2次関数を使用してXの新しい値を見つけましょう。
セカンダリ実装のインターフェースが作成されたので、GA 自体を完成させる必要があります。
以前と同様に、新しい集団が作られ、その集団のメンバーは世代を超えて交配し、その子孫は突然変異を持つ可能性があります。個体のパフォーマンスが優れているほど、交尾する可能性が高くなります。時間が経つにつれて、アルゴリズムは最良の答え、または少なくともかなり良い答えに収束します。 では、実行すると何が返されるのでしょうか?
悪くないですね!集団のサイズはわずか 5,20 世代であり、入力は [0 100] の範囲に制限されているため、この検索はトップを正確に特定します。 さて、すべてのインターフェース メソッドを「interface{}」を返すように定義した理由が疑問に思われるかもしれません。それは Go とジェネリックのようなものです。オブジェクトが存在しないため、オブジェクト タイプは返されませんが、サイズが指定されていないデータはスタックに渡すことができます。基本的に、この戻り値の型も意味します。つまり、既知の類似した型のオブジェクトを渡します。この「汎用性」により、GA を独自のパッケージに移動し、複数の異なるタイプのデータに対して同じコードを使用できるようになりました。 2D 二次方程式への単一の入力の代わりに、2 つの入力を持つ 3D 二次方程式があります。インターフェース メソッドにはわずかな変更のみが必要です。
どこでも float64 の代わりに、どこにでも Quad3D のエントリを渡すことができます。それぞれのエントリには X 値と Y 値があります。作成されたエントリごとに、コンストラクター makeNewQuadEntry が使用されます。 Run() メソッド内のコードは変更されていません。 実行すると、次の出力が得られます。
とても近いです! ああ、速く走ることを忘れていました。Java でこれを実行すると、同じ設定でも、かなりの待ち時間が発生します。比較的小規模な二次方程式を解くことはそれほど複雑ではありませんが、人間が理解するには注目に値することです。 Go は C と同様にネイティブにコンパイルされます。バイナリが実行されると、すぐに答えが吐き出されるようです。各実行の実行時間を測定する簡単な方法は次のとおりです。
補足: 私たちが過去の失敗から立ち直り、包括的な時間モジュールとパッケージを言語に組み込む開発者コミュニティであることを嬉しく思います。Java 8+ にはそれらがあり、Python にもそれらがあり、にもあります。これは私を幸せにします。 出力は次のようになります:
その「ほぼ瞬時」な感覚こそ私が伝えたかったことであり、今では確かな数字が存在します。 136,876 は大きいように思えるかもしれませんが、時間はナノ秒単位で報告されます。 繰り返しますが、ナノ秒です。インターネット時代や、Python や Java などの他の一般的な言語で私たちが慣れ親しんでいるミリ秒ではなく、ナノ秒です。 1/1,000,000ミリ秒。 これは、遺伝的アルゴリズムを使用して 1 ミリ秒未満で二次方程式の答えを検索し、その答えを見つけたことを意味します。 「地獄の瞬間」というフレーズは、まさに適切なように思えます。これには、端末への印刷も含まれます。 では、もっと計算量の多いものはどうでしょうか? 優れたファンタジー フットボールのラインナップを見つける方法を紹介する前に、 を使用します。これには、スプレッドシートからのデータの読み取り、ラインナップの作成とフィルタリング、より複雑なクロスオーバーと突然変異の実行が含まれます。 *** ソリューションを力ずくで探すと、おそらく 75,000 年以上かかるでしょう (少なくとも当時私が使用していた Python を使用した場合)。 すべての詳細をもう一度説明する必要はありません。コードを自分で確認することもできますが、ここでは出力を示します。
ああ、そうだ!これは良いラインナップのようだ!見つけるのにたった 16 ミリ秒しかかからない。 現在、この遺伝的アルゴリズムは改善することができます。 C と同様に、オブジェクトがメソッドに渡されると、オブジェクトはスタックにコピーされます (データが読み取られます)。オブジェクトのサイズが大きくなるにつれて、オブジェクトを何度もコピーするのではなく、ヒープ内に作成してポインターを渡します。今のところ、将来の課題として残しておきます。 Go はコルーチンとチャネルのネイティブ サポートも備えて記述されているため、複数のコアを活用して問題を解決することが以前よりもはるかに簡単になり、シングル コア時代の他の言語に比べて大きな利点となっています。これらのツールを使用するためのアルゴリズムを強化したいのですが、これは将来の作業に残す必要があります。 私は学習のプロセスを本当に楽しんでいます。私にとって、継承ではなく構成の観点からエンジニアリング ソリューションを考えるのは難しいことです。なぜなら、それが私が 8 年以上慣れ親しんできたことであり、プログラミングを学んだ方法だからです。しかし、それぞれの言語とアプローチには独自の長所と短所があり、それぞれの言語は私のツールキット内の異なるツールです。試すのが不安な人は、やめてください。障害(スピードバンプのようなもの)はありますが、すぐに乗り越えて成功への道を歩むことになるでしょう。 他の言語で気に入っている点がいくつかありますが、主に、データを操作するための関数型メソッドの基本的なセットです。配列またはデータの一部をマップ、削減、フィルタリングするためのラムダ関数とメソッドが必要です。関数型の実装に反対する設計者の主張は、コードは常にシンプルで読みやすく書きやすいものでなければならないということであり、これは for ループで実現できます。一般的に、map、filter、reduce の方が読み書きが簡単だと思いますが、これはすでに激しい議論が繰り広げられているところです。 一部の開発者との意見の相違や、問題解決について考える方法の違いにもかかわらず、Go は本当に素晴らしい言語です。皆さんも、1つか2つの言語を学んだら、ぜひ試してみることをお勧めします。急速に最も人気のある言語の 1 つになりましたが、それには多くの理由があります。今後も利用させていただくことを楽しみにしております。 |
<<: AI時代のクラウドベースのインテリジェントコンピューティング
4月29日、外国メディアの報道によると、英国運輸省は水曜日、自動車線維持システム(ALK)を搭載した...
計算能力には限界があるため、人間が超人工知能を制御することはできません。 [[379749]]最近、...
[[412010]]ロボット、つまり自動化と AI の総称は、私たちの周りにはどこにでもあります。...
人類文明の継続的な発展に伴い、社会の分業は大きな変化を遂げ、さまざまな産業の置き換えと反復において、...
新たな住宅消費トレンドが出現[[342344]] 90年代以降の世代である荘さんは、仕事から帰宅...
ロボットはコンピューターによってプログラムされた機械です。人間の介入なしに一連の複雑なアクションを自...
顔認識技術の応用を標準化するため、2023年8月8日、中国サイバースペース管理局が起草した「顔認識技...
ChatGPTの登場以来、OpenAIが使用するトレーニング方法である人間によるフィードバックによる...
2000年から10年間の発展を経て、中国のPC時代のインターネットは「交通経済」を生み出しました。...
コードの移行と言語の変換は困難で費用のかかる作業です。オーストラリア連邦銀行は、プラットフォームを ...
春が来たが、インターネットの寒い冬の影はまだ消えていない。年初から人員削減、外部採用の中止、採用削減...
研究者が最適な機械学習モデルを自動的かつ効率的に開発できるようにするために、Google は特定の分...