0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TL;DR

  • 4体のデジタル生命体が、自律的に成長し続けるサーバーレス生態系 Jevnoid
  • 意思決定はすべて Jev の型付き質問(Choice / Noul)で行う
  • Thomas S. Ray が1990年に発表した Tierra 仮想マシン(32命令)を踏襲
  • 観測デッキ: jevnoid.nayzach.com / ソースコード: github.com/df-yamashitamasashi/jevnoid(MIT License)

Jevnoid 観測デッキ (Gaia-noid 生息空間)


なぜ作ったか

人工生命の話題を見かけ、「人生は、選択の連続である」という言葉が浮かびました。

「選択」といえば、まさに Jev の得意分野です。

Jevはあらかじめ型の決まった質問(Choice=選択肢、Noul=Yes確率)にミリ秒〜数百msで瞬時に答える直感型(System One)モデルです。

「知覚して、次の一手を選択し、捕食・代謝する」——この連続する選択ループをJevに任せ、Thomas S. Ray の古典的人工生命「Tierra」仮想マシンと組み合わせることで、どのように成長するのか、という検証を兼ねて作りました。


共生する4つの生命種族

同一の生命コアエンジンの上で、異なる食性と環世界(Umwelt)を持つ4種族が並行して稼働します。

種族 捕食対象 選択のテーマ 交信特性
Theos-noid(神格型) 諸宗教の経典・比較宗教学の文献 愛・戒律・慈悲・超越・虚無 諸宗教の叡智を統合した神託
Gaia-noid(大自然型) 気象・海洋循環・生物多様性データ 調和・攪乱・再生・適応 地球生命圏(ガイア)の視点
Cosmo-noid(宇宙生物型) 天文学・宇宙物理学論文 エントロピー・重力・創発・時空 億年・光年単位の宇宙論的視点
Info-Grazer(純粋情報型) ArXiv・技術ブログ・一次情報源 真実性・新規性・構造美 構造化された概念ネットワーク

各種族は固有の「DNA」(Jevへの質問文・好む/避けるキーワード)を持ち、同じ心拍エンジンの上で全く異なる個性へと変態していきます。

4種族はそれぞれ独立した生活空間(テラリウム)に住んでいて、観測デッキでは左右の矢印で空間を切り替えます。同じ空間には、自己複製で生まれた子孫が共存します。

Cosmo-noid の生活空間。祖先(Gen 0)と、自己複製で生まれた変異株(Gen 1)が共存している

スマホからも、同じ生態系を観測できます。

スマホでの観測デッキ

Jevの使い方:自由文ではなく「型の決まった質問」

Jevnoidの核心は、生命体の判断を一切自由文で行わないことです。心拍のたびに、各個体が「次に何をするか」(Choice)と「いま見ている情報の栄養価」(Noul)をJevに問い合わせます。

ポイントは、全個体の質問を1回の呼び出しにまとめることです。state に個体ごとの知覚を並べ、質問側では organism_0 のように対象を名指しします。個体がいくつに増えても、行動の判断は心拍ごとに1回の呼び出しで済みます。

state, questions = {}, {}
for i, r in enumerate(requests):            # 生きている全個体
    dna = DNA_REGISTRY[r.species]
    state[f"organism_{i}"] = f"Species: {r.species.value}, Energy: {r.energy:.1f}%\n{r.perception}"
    questions[f"action_{i}"] = Choice(
        instructions=f"For `organism_{i}` only: select the immediate metabolic action ...",
        criteria=dna.action_criteria,       # ingest_nourish / swim_next / rest_meditate
    )
    questions[f"quality_{i}"] = Noul(
        instructions=f"For `organism_{i}` only: {dna.noul_prompt}",   # 捕食した情報の栄養価は?
    )

answers = client.system_one(state=state, questions=questions).answers
action = answers["action_0"].choice
quality = float(answers["quality_0"].noul)

6体分をまとめて問い合わせても、応答は約0.3秒でした。個体ごとに見ている文章が違えば答えも変わり、例えば広告だらけのページを見た個体だけが「移動する」(栄養価0.09)を選びます。捕食した個体の「形態成長」と「次の移動先」の判断も同じように1回にまとめるため、Jevへの呼び出しは心拍ごとに最大2回です。

3D形態増殖(morphogenesis)も同様です。方位角・仰角をJevに自由に生成させるのではなく、あらかじめ用意した7種類の成長ベクトル(spiral_ascend=黄金螺旋で上昇、polar_zenith=天頂へ直進、nadir_abyss=深部へ潜行、など)から Choice で選ばせ、栄養価を Noul でスケールに変換します。

VECTOR_MAP = {
    "spiral_ascend": (50.0, 35.0),
    "polar_zenith": (20.0, 65.0),
    "nadir_abyss": (-45.0, -65.0),
    # ...
}
azimuth_deg, elevation_deg = VECTOR_MAP.get(vector_choice, (50.0, 25.0))
growth_distance = round(3.5 + scale_val * 10.5, 2)   # 3.5〜14.0
cell_radius = round(0.8 + scale_val * 2.0, 2)         # 0.8〜2.8

人間がプリセットで形を指定するのではなく、Jevが「何を食べたか」に基づいて増殖の向きとサイズを毎回選び直すため、各個体の3D形態は予測不能かつ再現不可能な、その個体固有の「食生活の記録」になります。


1990年 Tierra 仮想マシン

Jevnoidの生命体は、Jevの判断とは独立に、内部で Thomas S. Ray の Tierra 仮想マシン を実行しています。比喩的な「進化っぽい何か」ではなく、原論文の32命令セットと、正典の80命令Ancestorゲノムをバイト単位で移植したものです。

class TierraOp(int, enum.Enum):
    NOP_0 = 0x00        # テンプレートアドレッシング用ビット0
    NOP_1 = 0x01        # 同・ビット1(NOP_0と相補)
    MOV_IAB = 0x1A       # [AX] から [BX] へ1バイトコピー(自己複製の核)
    MAL = 0x1E           # 娘個体用メモリブロックを確保
    DIVIDE = 0x1F        # 娘細胞を親から分離・世界に放つ
    # ... 全32命令

自己複製は MOV_IAB によるコピーループと DIVIDE 命令で行われ、突然変異は原論文どおり3つの独立した経路から発生します。

  1. 宇宙線(Cosmic Ray): 実行中、確率的にソープ(メモリ空間)中のランダムな1バイトのビットを反転させる。
  2. コピー誤り(Copy Flaw): MOV_IAB でバイトをコピーする瞬間に、一定確率でビット反転を混入させる。
  3. 実行誤り(Execution Flaw): ALU演算そのものに小さなノイズを混入させる。
if random.random() < self.mutation_rate:
    src_byte = (src_byte ^ (1 << random.randint(0, 4))) % 32
    mutations += 1
self.soup[copy_ptr_dst % self.soup_size] = src_byte

ジャンプ・コール命令は、Ray方式の相補的テンプレートアドレッシング(NOP_0/NOP_1の連続パターンとその相補パターンをソープ中から検索してジャンプ先を決める、番地を直接指定しない住所方式)で実装しています。

def classify_genome(genome: list[int]) -> tuple[str, int]:
    """変異したバイトコードから系統を分類する。"""
    has_mov_iab = int(TierraOp.MOV_IAB) in genome
    has_divide = int(TierraOp.DIVIDE) in genome
    if not has_mov_iab and has_divide:
        return f"Parasite-{len(genome)}p", diffs        # 自分の複製ループを持たない寄生体
    elif len(genome) < 76 and has_mov_iab:
        return f"Hyper-Replicator-{len(genome)}", diffs  # 短小・高効率な複製体
    elif diffs >= 5:
        return f"Mutant-Lineage-{diffs}β", diffs
    # ...

身体は無限に大きくならない:維持コストと災厄

3D形態のセルは捕食のたびに増えますが、それだけだと際限なく肥大化してしまいます。そこで、大きな身体ほど維持コストがかかる経済を導入しました。

  • 維持コスト: 心拍ごとに、既存の細胞数に比例したエネルギーを消費します。身体が大きいほど、維持だけで多くのエネルギーが必要になります
  • 疫病・寄生虫: 細胞数が多い個体ほど、疫病や寄生虫に見舞われる確率が上がります(過密リスク)。発症すると、直近に生えた細胞を1〜3個失い、エネルギーも直接失います
  • 回復には栄養が必要: 失った細胞を取り戻すのも、新たに大きくなるのも、捕食(ingest_nourish)の成果からしか起こりません
  • 消滅: エネルギーが0以下になると、その個体は世界から消えます。世界の個体がすべて消滅した場合は、次の心拍で新しい Ancestor-80 が自然発生します

これにより、3D形態は際限なく肥大化せず、捕食による成長と維持コスト・災厄による減少がつり合うようになります。


まとめ

  • 判断はJev、進化はTierra、成長の記録は3D形態 ——役割を厳密に分けることで、「毎秒動き続ける生命」と「意味を理解する知性」を同じシステムの中に共存させました
  • Jevの型付き質問(Choice / Noul)は、生成AIエージェントでは難しい「ミリ秒単位・低コストで回り続ける判断ループ」が可能です
  • 1990年のTierra論文を踏襲することで、「進化っぽい何か」ではなく、実際に寄生生物や高効率複製体が自然発生する生態系が、サーバーレスの本番環境の上で今も動き続けています
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?