問題タブ [conways-game-of-life]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
algorithm - コンウェイの「人生ゲーム」の最適化
実験するために、私は(ずっと前に)コンウェイのライフゲームを実装しました(そして、この関連する質問を知っています!)。
私の実装は、「最後の状態」と「更新中の状態」を表す2つのブール値の配列を保持することで機能しました(2つの配列は各反復で交換されます)。これはかなり高速ですが、これを最適化する方法についてよく疑問に思います。
たとえば、1 つのアイデアは、反復 (N+1) で変更できるゾーンを反復 N で事前計算することです (そのため、セルがそのようなゾーンに属していない場合、そのセルは変更の対象とは見なされません)。反復 (N+1))。これが非常に漠然としていることは承知しており、詳細に入る時間はありませんでした...
Game of Life のイテレーションを (速度のために) 最適化する方法についてのアイデア (または経験!) はありますか?
python - コンウェイの人生ゲーム
私は現在、コンウェイの人生ゲームについてのプログラムを書いています。私は本当に python の初心者で、どのように始めればよいかまったくわかりません。誰でも私を助けることができますか?
excel - どうすればExcelでライフゲームを作ることができますか?
Excelでマクロを作成する方法はほとんどわかりません。
algorithm - 別のゲーム オブ ライフの質問 (無限グリッド)?
私はコンウェイのライフ ゲームをいじっており、最近、Hashlife や Golly などの驚くほど高速な実装を発見しました。(Golly のダウンロードはこちら - http://golly.sourceforge.net/ )
私が理解できないことの 1 つは、コーダーが無限グリッドをどのように実装するのかということです。何の無限の配列を保持することはできません. ゴリゴリと走って数機のグライダーが端を通り過ぎて飛び立ち、数分待ってすぐにズームアウトすると、グライダーがまだ宇宙に逃げているのが見えます.それでは、神の名において、この無限の概念はプログラムでどのように処理されるのでしょうか? よく文書化されたパターンはありますか?
どうもありがとう
c - ハッシュライフアルグはゴリーでどのように永遠に続くのですか?
ハッシュライフでは、フィールドは通常、理論的に無限のグリッドとして扱われ、問題のパターンは原点の近くに集中します。四分木はフィールドを表すために使用されます。ツリーのk番目のレベルで2^(2k)セルの正方形、一辺が2kの場合、ハッシュテーブルは中央に2 ^(k-1)x 2 ^(k-1)のセルの正方形を格納します。 、将来的には2 ^(k-2)世代。たとえば、4x4の正方形の場合、2x2の中心、1世代先に格納されます。8x8の正方形の場合、2世代先の4x4の中心を格納します。
したがって、8x8の初期構成では、8x8の正方形を中心に4x4の正方形を1世代前方に配置し、8x8の正方形を中心に2世代前方(4x4の正方形を1世代前方に)2x2の正方形を配置します。新しい世代ごとに、グリッドのビューが減少し、次にオートマトンの次の状態が得られます。最も内側の2x2平方2^(k-2)世代を先に進めた後は、これ以上先に進むことはできません。
では、ゴリーのハッシュライフはどのように永遠に続くのでしょうか?また、フィールドのビューは決して減少しないようです。2 ^(k-2)世代後のオートマトン全体の状態を示しているようです。時間とともに拡張する開始構成を考えると、アルゴリズムのビューはさらに増えるようです。グリッドのビューがズームアウトして、拡大するオートマトンを表示しますか?
python - 80x60 RGB ピクセル配列で Game-of-Life 反復を最適化
さて、本当に最適化が必要な Python コードを取得しました。
- これは、小さな (80x60 ピクセル) 画像に対する Game-of-Life 反復であり、そこから RGB 値を抽出します。
- 現在、ネストされた for ループを使用しています。これらの for ループをより高速な c 関数に交換したいのです
map()
が、そうすると、x、y 値を取得する方法や、関数のスコープ外で定義されたローカル値を取得する方法がわかりません。定義する必要があります。 map()
この for ループの現在のセットよりも速く使用できますか? どうすればそれを使用してもx、yを取得できますか?- 私は現在pygame Surfacesを使用しており、モジュールを試しました
surfarray/pixelarray
が、すべてのピクセルを変更/取得しているため、Surface.get_at()/set_at()
. - また、少し無関係です... Pythonが数字のリストをトラバースせず、他の言語のように数字をインクリメントするだけの場合、これはより速くできると思いますか? Python に通常の for() と foreach() が含まれていないのはなぜですか?
- そこにある条件文の量もおそらく物事を遅くしますよね?最も遅い部分は、隣人のチェックです (リスト n を構築する場所)... そのビット全体を 2D 配列のスライス アクセスに置き換えましたが、正しく動作しません。
コードの編集済みバージョン:
関数の完全版:
visual-c++ - コンウェイズのライフゲームの配列の問題
私は学校向けのコンウェイのライフゲームを書いています。プログラムでは、割り当てている値を配列が取得するのに問題があります。プログラムのある時点で、割り当てられた値を出力します(1)が、プログラムの最後に、ゲームの反復を表示するために配列を印刷する必要がある場合、非常に少ない数が表示されます。もう1つの問題は、別の反復を実行するかどうかを尋ねるループを作成するときに問題が発生したことです。そこで、以前のエラーが修正されるまで削除しました。私はこれをC++で書いています
artificial-intelligence - ライフゲームやその他の仮想環境を人工(知能)の人生シミュレーションに使用していますか?
私のAIへの関心の1つは、データではなく、生物学的コンピューティングに重点を置いています。これには、ニューラルネットワーク、脳のマッピング、セルオートマトン、仮想生活および環境が含まれます。
以下に説明するのは、ボットが進化するための仮想環境の開発を含むエキサイティングなプロジェクトです。
「Polyworldは、自然淘汰と進化的アルゴリズムを通じて人工知能を進化させるためにLarry Yaegerによって作成されたクロスプラットフォーム(Linux、Mac OS X)プログラムです。」 http://en.wikipedia.org/wiki/Polyworld "
Polyworldは、仮想生命を研究するための有望なプロジェクトですが、それでも「インテリジェントな自律」エージェントを作成するにはほど遠いです。
これが私の質問です。理論的には、AI環境を作成するためにどのパラメーターを使用しますか?おそらく脳の環境?おそらく、独自の「脳」または生命構造を持つ複数の自己完結型の生命生物。
ライフシミュレーションのゲームをスピンさせたいです。ライフグリッドの64x64ゲームがある場合はどうなりますか。ただし、1つのグリッドの代わりに、N個のグリッドがある場合があります。N個のグリッドがあなたの「生命力」です。人生ゲームのすべてのエンティティが特定のグリッドで死ぬと、そのグリッド全体が死にます。「グリッド」のグループが生命体を構成します。
当面の目標はありません。まず、環境をシミュレートし、OpenGLを使用して環境で何が起こっているかを視覚化し、環境に興味深いプロパティがあるかどうかを確認します。次に、「不足しているリソース」を追加して、AI環境がリソースを適切に管理できるかどうかを確認したいと思います。
java - コンウェイのライフ ゲームのマルチスレッド Java プログラム - 境界セルでの競合
Java で並行プログラミングを学んでいて、Game of Life のシミュレーションを書いています。
これが私が考えていることです:
- int[][] を使用してセルの状態を保存します
- int[][] を t 個のセグメントに分割し、t 個のワーカー スレッドを使用する
- t スレッドはセグメントから読み取り、セグメント内のすべてのセルの新しい値を計算し、セルを更新します。
- 計算が終了すると、障壁で他のワーカーが終了するのを待ちます
- バリアを越えると、メイン スレッドが UI を更新します。
- ワーカーは次の状態の計算に進みます。
現在、セグメントの共通の境界で競合が発生しています。隣接セルが前の値を読み取る前にスレッドが境界セルの状態を上書きした場合、隣接セルの計算は間違っています。
私のオプションは何ですか?
- runnable の代わりに callable を使用し、ワーカー スレッドが新しい値を返すようにします (セグメント自体を更新するのではなく)。バリアを越えた後、メイン スレッドはマトリックスを更新できます。このオプションでは、ワーカー スレッドによって返された結果をマトリックスにコピーします。
- 2 つのバリアを使用します。ワーカー スレッドは、隣接するセグメントから境界セルのコピーを作成し、最初のバリアで待機します。このバリアを通過すると、次の状態の計算に進み、その場でセグメントを更新します。その後、2 番目のバリアで待機します。メイン スレッドが UI を更新します。
私の質問は、データのコピーを伴わない、または上記の 2 つのオプションよりも効率的な境界セルでの競合に対処する他の方法はありますか? ReaderWriterLock、揮発性変数、またはその他の同期メカニズムを使用している可能性がありますか?
更新: これまでのところ、Peter によるダブル バッファリング ソリューションが最もクリーンなソリューションです。しかし、質問があります。2 つの配列は共有データであり、同期 (同期アクセスまたは揮発性変数) を使用していないため、可視性の問題は発生しませんか? 複数の CPU が配列の値をキャッシュし、各反復で配列の一部のみを更新できますか? 次に、スレッドは境界セルの古い値を取得します。これは可能ですか?そうでない場合は、その理由。はいの場合、どうすれば解決できますか? 2 つの配列を volatileと宣言しても、個々の要素が volatile にならないようです。
f# - アクセラレータを使用した F# の人生ゲーム
アクセラレータ v2 を使用して F# で生活を書き込もうとしていますが、何らかの奇妙な理由で、すべての配列が正方形であるにもかかわらず、出力が正方形ではありません - 行列の左上にある長方形の領域以外はすべてに設定されているようです間違い。すべての操作で配列全体を同等に扱う必要があるため、これがどのように発生するのかわかりません。何か案は?