ゲームライフのルールを修正する提案

良い読書時間、親愛なるHabrユーザー! ゲームLifeは 、1970年にジョンコンウェイによって提案され、habrahabr.ruで繰り返し議論されました。 使用される主なタグは、この記事のタグにリストされています。







開発の新しい方向に導くことができる多くの変更が提案されています。







画像







提案1.元のゲームでは、無限のフィールドが提案されていますが、実装は通常トーラススイープルールを使用します。水平および垂直はサイクルで閉じられます。







有限サイズの長方形フィールドの水平方向が閉じて円柱になり、頂点が水平方向にフィールドのサイズの半分のステップでペアになるバリアントが提案されています。 したがって、計算が簡単な球体の類似体を取得することができます。







等方性をシミュレートするには、三角形グリッドを使用することを提案します。これは、計算で、水平、垂直、および対角線の1つの推定値に置き換えられます。







水平レイヤーを使用して、環境を変更できます。

赤道で20%高い層-良好な生活条件(保存のために3〜4隣人、核形成のために4隣人)

それぞれ10%の2つの層-劣悪な生活条件(保全のために1-2人、2-生命の起源のため)

残りについては、通常のルールが適用されます(保護のために2〜3個、生命の起源のために3個)







命題2.生物については、複雑さのレベル、関連性の可能性、遺伝子改変、およびトレーニングを追加することが提案されています。 各生物には最大10レベルの複雑さが割り当てられ、各レベルは材料と抽象フィールドの両方で表されます。







マテリアルフィールドの複雑さのレベルは、最大速度(体が1回転で一方向に移動するセルの数)に影響します。 したがって、第1レベルの複雑さ(配列インデックス0)を持つ生物は静止しています。 生物全体が完全に動きます。







抽象ドメインの複雑さのレベルは、直線で表示される隣接セルの数に影響します。 表示半径を移動する機能と比較して2倍になります。第1レベル-1、第2レベル-3など。 可視性は、体の最も極端な細胞から決定されます。







このようなゲームの実装は、ビッグデータの処理と学習アルゴリズムを研究している現代の学生にとって興味深いかもしれません。 現在、独自の実装オプションはありません。







推奨される最高のアルゴリズムの遺伝的進化







UPD:トンネルモデリング複雑度グループのコンテキストでのオプションhttps://habrahabr.ru/post/259291/







自然系の文脈で







確率的推論(ベイズ)-カオス

遺伝的検索(進化)-フラクタル

制約付き最適化(アナロジー)-エネルギー

逆推論(記号)-情報

勾配降下(コネクショニスト)-静的







その後、システムは動作を示し始め、生活のレベルで連鎖が繰り返されます。







確率的推論(ベイズ)-動的(プロセス)

遺伝的検索(進化)-相乗的(市場)

制限付き最適化(アナログ)-企業(出産)

逆控除(記号)-官僚的(規制)

勾配降下(コネクショニスト)-生態学的







参照:Pedro Domingos、Supreme Algorithm。 機械学習が世界をどのように変えるか。







参照:

https://habr.com/en/post/435670/-最高のアルゴリズム-難易度別のアルゴリズムの配布







Pythonオプション

Pythonのソース:

life.py







import pygame import field import numpy as np running = True v = field.area() step=0 pygame.init() screen = pygame.display.set_mode([640, 550]) font = pygame.font.Font(None, 50) while running: screen.fill([0, 0, 0]) clr = 0 for r in range(1, v.height): for c in range(1, v.width): if v.val[r, c] != 0: clr=clr+64 if r % 2 == 0 and c % 2 == 0: if clr > 255: clr = 255 screen.set_at([r/2, c/2], [clr, clr, clr]) clr = 0 step_text = font.render(str(step),1, (255, 255, 0)) screen.blit(step_text, [10, 520]) pygame.display.flip() for event in pygame.event.get(): if event.type == pygame.QUIT: running = False v.generate() step=step+1 pygame.quit() print "Done"
      
      





field.py







 import numpy as np import random class area: def __init__(self): self.width = 1000 self.height = 1000 self.debug = False self.val = np.zeros((self.height, self.width), dtype = int) self.val1 = np.zeros((self.height, self.width), dtype = int) self.val[250, 140] = 1 self.val[250, 141] = 1 self.val[251, 140] = 1 self.val[251, 141] = 1 self.val[252, 140] = 1 self.val[252, 141] = 1 self.rw = range(1, self.width-2) self.rh = range(1, self.height-2) self.r3 = range(-1, 2) self.dh = int(self.height/10) self.h1 = [self.dh*2, self.height-self.dh*2] self.h2 = [self.dh, self.height-self.dh] def generate(self): for cnt in self.r3: c = random.randint(0, self.width-1) r = random.randint(0, self.height-1) self.val[r, c] = 1 c = random.randint(0, self.width-1) r = random.randint(0, self.height-1) self.val[r, c] = 0 for c in self.rw: for r in self.rh: self.val1[r, c] = 0 cnt = 0 for r1 in self.r3: for c1 in self.r3: if not ((r1 == 0) and (c1 == 0)) and not (r1==-1 and c1==1) and not (r1==1 and c1==-1): if self.val[r+r1, c+c1] != 0: cnt = cnt + 1 self.val1[r, c] = self.store_value(c, cnt, self.val[r, c]) for r in self.rh: for c in self.rw: self.val[r, c] = self.val1[r, c] for c in self.rh: if self.val[c, self.width-2] == 1: self.val[0, c] = self.val[self.width-2, c] if self.val[1, c] == 1: self.val[self.width-1, c] = self.val[2, c] def store_value(self, c, cnt, cur): val = 0 if self.h1[0] < c < self.h1[1]: if 1 <= cnt <= 4: val = 1 if cur == 1 and cnt < 3: val = 1 else: if self.h2[0] < c < self.h2[1]: if 2 <= cnt <= 3: val = 1 if cur == 1 and 2 <= cnt <= 3: val = 1 else: if cnt == 2: val = 1 if cur == 1 and 1 <= cnt <= 2: val = 1 return val
      
      





結果:

画像








All Articles