よりシンプルなバイナリ⽣物学の本— よりシンプルなバイナリ⽣物学の設計とPoC 実装によるデイジーワールド実験を紹介！ —［著］⼤神祐真

技術書典 15 新刊

2023 年 11 ⽉ 11 ⽇

1

ver 1.0

■免責
本書は情報の提供のみを⽬的としています。
本書の内容を実⾏・適⽤・運⽤したことで何が起きようとも、それは実⾏・適⽤・運⽤した⼈
⾃⾝の責任であり、著者や関係者はいかなる責任も負いません。
■商標
本書に登場するシステム名や製品名は、関係各社の商標または登録商標です。
また本書では、™、®、© などのマークは省略しています。

2

はじめに
本書を⼿に取っていただき、ありがとうございます！ 本書は「バイナリ⽣物学」の理論を 1960 年代のコンピュータである PDP-7 でも動くくらいシンプルにした設計を解説し、その PoC 実装で⾏った実験とその結果を紹介する本です。
「バイナリ⽣物学」は「実⾏プログラム等のバイナリが⽣き物のように振る舞えるシステムを考え、実装する」という独⾃の取り組みで、これを OS のレイヤーで実装したものを「DaisyOS」と呼んでいます。本書は DaisyOS の PDP-7 版の設計とPoC 実装を紹介する本となります。と⾔っても設計として PDP-7 に依存する部分はごく⼀部で、そのような部分については都度解説しますので、特に PDP-7 に精通していなくても⼤丈夫です。
なお、PoC は、「SimH」と呼ばれる、PDP-7 を含む古いコンピュータのシミュレー
タ上で動作するように実装しました。*1 そして PoC 実装を⽤いた実験では、「⽣物は地球と相互に関係し合って⾃⼰制御システムを作り上げているのではないか」という「ガイア理論」という理論の説明に⽤いられる「デイジーワールド」と呼ばれるモデ
ル環境を再現する実験を⾏いました。「バイナリ⽣物学の実装の上で⽣物による⾃⼰制御のようなものが働くのかどうか」といった所を実験を⽤いて紹介します。
「バイナリ⽣物学」や「DaisyOS」といった取り組み⾃体、まだまだ発展途上なものではありますが、「こんなものが OS の⼀種としてあっても⾯⽩いかも」と思って楽しんでいただければ幸いです。

本書の更新情報等について
本書を含め、当サークルの同⼈誌・同⼈作品の情報は下記の筆者ウェブページにまとめています。

• http://yuma.ohgami.jp/
本書の内容について訂正や更新があった場合もこちらのページに記載します。何かおかしな点があった場合等は、まずこちらのページをご覧ください。

*1 基本的に設計をそのまま実装しているだけなので、本書では実装については特に説明しておりま

せん。SimH というシミュレータ上での PDP-7 のプログラムの作り⽅については既刊「SimH で
PDP-7 ベアメタルプログラミング」をご覧ください。

–i–
3

4

⽬次
はじめに
第1章

i
PDP-7 とバイナリ⽣物学、DaisyOS について
PDP-7 とは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
バイナリ⽣物学とは . . . . . . . . . . . . . . . . . . . . . . . . . .
DaisyOS とは . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1
1
2
3

PDP-7 向け設計の解説
設計の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
バイナリ⽣物のデータ構造 . . . . . . . . . . . . . . . . . . . . . . .

5
5
5

2.3
2.4

初期状態 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
動作の流れ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7
8

第3章

PoC 実装を⽤いた実験の紹介
PoC 実装について . . . . . . . . . . . . . . . . . . . . . . . . . . .
デイジーワールドについて . . . . . . . . . . . . . . . . . . . . . . .
実験設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
実験結果と考察 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17
17
17
19
23

1.1
1.2
1.3
第2章

2.1
2.2

3.1
3.2
3.3
3.4
おわりに

29

– iii –
5

6

第

1章

PDP-7 とバイナリ⽣物学、DaisyOS について

この章では、本書の重要なキーワードである「PDP-7」と「バイナリ⽣物学」、「DaisyOS」の 3 つについて、本書でそれを扱う動機も含めて説明します。

1.1

PDP-7 とは

「PDP-7」は 1960 年代にデジタル・イクイップメント・コーポレーション (略称「DEC」) からリリースされたコンピュータです。PDP は「Programmed Data

Processor」の略で、その名の通りプロセッサ部分を指すのですが、それが当時はミニコンピュータと呼ばれていた PDP-7 でさえ⼤型冷蔵庫を横に 3 台並べたくらいの⼤きさがありました。今はオープンソースのシミュレータ (SimH*1 ) が有志で作られており、これを⽤いると現代の PC 上で PDP-7 に限らず歴史的なコンピュータを試してみることができます。

PDP-7 が特に歴史的に重要なのが「UNIX が⽣まれたコンピュータである」という点です。1969 年にケン・トンプソンを中⼼に作られた UNIX は PDP-7 を対象に作られました。UNIX が現代の OS に与えている影響は⼤きく、「ファイル」や「プロセス」という概念*2 は OS の基本的な概念として根付いています。そしてその様な*1 http://simh.trailing-edge.com/*2 なお、「ファイル」はケン・トンプソンが考案したものだそうですが、「プロセス」は UNIX 以前からあったそうです。ただそれが今知られているものと同じ様なものであったかどうかは不明で、今知られている様な「プロセス」は UNIX に由来するのかなと思います。ref.http://www.bell-l–1–
7

第 1 章 PDP-7 とバイナリ⽣物学、DaisyOS について背景を持つコンピュータで「ファイル」でも「プロセス」でもない独⾃理論に基づく

OS を実現してみたいというのが本書で PDP-7 を扱う動機です。
PDP-7 については以下の既刊があります。「SimH」の使い⽅等について詳しくはこちらをご覧ください。

SimH で PDP-7 ベアメタルプログラミング「SimH」というシミュレータ上でアセンブリ⾔語 (⼀部機械語) によるベアメ
タルプログラミングを⾏う本。

1.2

バイナリ⽣物学とは「バイナリ⽣物学」は筆者の造語で、実⾏バイナリ等のバイナリデータが⽣き物のように振る舞える仕組みを考え実装する取り組みです。バイナリが⽣き物のように振る舞えることで、例えば実⾏バイナリの⽣成について「ソースコードをコンパイルして⽣成する」のではなく「⽣物の進化の仕組みで⽣み出す」といった事ができるようになります。
バイナリを⽣き物のように振る舞わせる考え⽅としては、「⽣き物の構成要素をバ
イナリの構成要素と対応付ける事で、⽣き物の振る舞いをバイナリが⾏えるようにする」というものです。想定する⽣き物は、おそらく⽣き物の中で最も簡単な構成であ
・
「運動」
・
「成⻑」
・
「増殖」
・
「死」
る「単細胞⽣物*3 」です。単細胞⽣物が⾏う「代謝」という 5 つの振る舞いを独⾃に簡単な形でモデル化し、それらをバイナリが⾏えるよ
うなシステムを設計・実装します。
バイナリ⽣物学について詳しくは下記の同⼈誌をご覧ください。本書の内容は以下の 2 冊で紹介した設計を PDP-7 向けにシンプルにしたものです。
バイナリ⽣物学⼊⾨
実⾏バイナリを⽣物のように扱う処理系の構造と振る舞いのモデルと、実際に単細胞⽣物として扱う PoC の実験結果を紹介する本。
バイナリ⽣成環境「daisy-tools」実験報告
前著に突然変異による進化の仕組みを追加した設計と、それに基づいて作成した ELF バイナリ⽣成システム「daisy-tools」とその実験結果を紹介する本。

abs.com/usr/dmr/www/hist.html*3 中でも特に「原核⽣物」を参考にしています。

–2–8

1.3 DaisyOS とは

1.3

DaisyOS とは

筆者は個⼈サークル「へにゃぺんて」で「⾃作 OS」を軸に活動をしているのですが、せっかくの趣味の⾃作 OS なら独⾃な OS として「ファイルやプロセスといった概念ではない OS」を作ってみたいと考えています。そこで、「バイナリが⽣き物として振る舞える環境を OS として提供する」という「バイナリ⽣物学に基づく OS」に取り組んでおり、その考えに基づいて設計・実装している OS を「DaisyOS」と呼んでいます。

DaisyOS としては、バイナリが⽣き物のように振る舞える環境を OS というレイヤーで提供できることで何か新たな価値が⽣まれるのではないかと想定しています。
ただ、前節で紹介したバイナリ⽣物学の理論に基づいた実装は何度か⾏なっているのですが、それによってどんな事ができるかというアイディアがまだあまり無く、本書で解説する PDP-7 向けや過去に⾏なったゲームボーイ向けの実装でも、現状でできる事は「設定された評価関数を満たす⼩さな実⾏プログラム (機械語列) を⽣成する」
程度のものです。ただそれは近年の筆者の興味が「バイナリを⽣き物の進化の仕組み
で⽣み出すという事をどれだけシンプルな仕組みで実現できるか」という所にあったためで、古いコンピュータを対象にしているのも半ば強制的に設計をシンプルにしていくためであったりもします。ちなみに、ゲームボーイ向けの実装についてはもし興味があれば以下をご覧ください。

DaisyOS(仮) v0.1.0
ゲームボーイ上で動作するバイナリ⽣物学のシステム。ROM ファイルを筆者
ウェブページからリンクしている BOOTH のページで無料公開中。

–3–
9

1
0

第

2章

PDP-7 向け設計の解説

この章では、PDP-7 でも動くくらいにシンプルに⾏った DaisyOS の設計を解
説します。

2.1

設計の概要

実⾏バイナリを⽣き物として振る舞わせるために、まず「バイナリ⽣物」というデータ構造で実⾏バイナリを定義します。そしてこの「バイナリ⽣物」を⽣き物のよ
うに振る舞わせるために、「代謝/運動」(セットで 1 つの振る舞い)・
「成⻑」
・
「増殖」
・
「定常的なエネルギー消費」・「死」という 5 つの振る舞いを各バイナリ⽣物へ周期的に実⾏します。これにより、評価関数を満たすように実⾏バイナリを進化させていく事ができます。

2.2

バイナリ⽣物のデータ構造

まず、バイナリ⽣物のデータ構造は表 2.1 の通りです。なお、オフセットやサイズの単位の「ワード」は PDP-7 の場合「18 ビット」で、これは PDP-7 が「18 ビット」のプロセッサであるためです。
バイナリ⽣物のデータ構造の各フィールドについて、「開始シグネチャ」と「終了シグネチャ」は全バイナリ⽣物で共通の固定値です。後述しますが、これは「増殖」の際に新たに⽣まれるバイナリ⽣物を配置する領域を探す際に⽤いられます。開始シグネチャから終了シグネチャまでを「既にバイナリ⽣物が存在している領域」という

1
1

–5–

第 2 章 PDP-7 向け設計の解説▼ 表 2.1: バイナリ⽣物のデータ構造
オフセット
[ワード]

サイズ
[ワード]

フィールド名説明

01

開始シグネチャ

1

1

エネルギー

バイナリ⽣物の開始を⽰すシグネチャ
エネルギー残量。毎周期で⼀定量減り0 になると死。「成⻑」で獲得した量が加算される。「増殖」のコストもここから⽀払う「代謝/運動」での評価結果の点数 (最⼤ 100)

2
3

1
1

適応度

4

1

5
5+N

1...N
1

「成⻑」で獲得できるエネルギー量に関わる

命令数 (N)「命令列」フィールドの命令の数「命令列」フィールドを関数として実⾏
戻り先アドレス する際の戻り先アドレスを設定する場所
PDP-7 の機械語命令の列。最後は関数からリターンする命令であること
命令列
終了シグネチャ

バイナリ⽣物の終了を⽰すシグネチャ扱いにしているため、これらのシグネチャは PDP-7 の機械語命令やバイナリ⽣物のその他のフィールドと被らない様な値である必要があります。その様な値であればどの様な値でも構いませんが、次章で紹介する実験に⽤いた PoC 実装では開始シグネ
チャは 0o713130*1 *2 に、終了シグネチャは 0o713137*3 という値にしています。
「戻り先アドレス」というフィールドがあるのは、PDP-7 の関数呼び出し命令( JMS 命令) の仕様によるものです。バイナリ⽣物のデータ構造では、⾃⾝の命令列を関数呼び出しで実⾏できるようにしているのですが、 JMS 命令は「指定されたア
ドレスに戻り先アドレス*4 を設定し、その次のアドレスから実⾏する」という挙動であるため、「命令列」フィールドの直前に「戻り先アドレス」のフィールドを⽤意しています。
ちなみに関数からのリターンで使⽤する命令は JMP I 命令です。これは「指定されたアドレスが指す先のアドレスへジャンプする」という挙動で、「戻り先アドレス」
フィールドのアドレスを指定することで関数からのリターンが⾏えます。*5*1 「0o」は 8 進数表記を意味する接頭辞です。
*2 下位 5 桁の「13130」は、「13」を「B」、「0」を「O(オー)」と⾒⽴てて、「BBO(Binary Biological

Object、バイナリ⽣物オブジェクト)」を⽰していたりします。最上位の桁の値に意味はなく、いかなる機械語命令にも該当しないように「7」にしてみました。
*3 こちらは開始シグネチャの⽅をベースにして、対応する機械語が無い値を探した結果こうなっただけで特に意味はありません・・。
*4 関数からのリターンで戻ってくる場所のアドレスです。関数呼び出しを⾏なっている JMS

命令の次のアドレスになります。
*5 これらの PDP-7 の命令についてより詳しくは前章で紹介した既刊「SimH で PDP-7 ベアメタル
プログラミング」をご覧ください。

–6–

1
2

2.3 初期状態..................................................
「命令数」や「命令列のワード数」の「N」について
表 2.1 では、「命令数」も「命令列のワード数」も共に「N」としている通り、
現状ではバイナリ⽣物が持つ各命令のサイズは 1 ワードであることを想定しています。PDP-7 の命令はほとんどが 1 ワードなのですが、⼀部、複数ワードで1 つの命令となるものもあります。ですが、現状ではそのような命令はバイナ
リ⽣物の命令列として扱わないこととします。

..................................................
「エネルギー」と「適応度」のフィールドをどのように使⽤するかについては、後ほどバイナリ⽣物に対するそれぞれの振る舞いを説明する際に紹介します。

2.3

初期状態

バイナリ⽣物は専⽤の領域をメモリ上に確保しそこへ配置します。以降、この領域
を「バイナリ⽣物領域」を呼びます。
初期状態としては、バイナリ⽣物領域に初期配置のバイナリ⽣物のみが配置された状態です (図 2.1)。図 2.1 では例としてバイナリ⽣物が 1 つだけの状態を⽰していますが、初期状態で複数存在していても特に問題はありません。

▲ 図 2.1: バイナリ⽣物領域の初期状態
その他に「評価関数」や「命令候補テーブル」といった要素も予め⽤意しておく

1
3

–7–

第 2 章 PDP-7 向け設計の解説必要がありますが、これらについては後ほど個別の振る舞いを説明する際に紹介し
ます。

2.4

動作の流れ

バイナリを⽣き物として振る舞わせるために、「代謝/運動」(セットで 1 つの振る舞い)・「成⻑」・「増殖」・「定常的なエネルギー消費」
・「死」という 5 つの振る舞いを実⾏します。図⽰すると図 2.2 の通りで、「代謝/運動」から再び「代謝/運動」に戻ってくる (あるいは「死」) までがバイナリ⽣物の 1 周期です。

▲ 図 2.2: バイナリ⽣物の周期動作
基本的な動作としては、この 1 周期をバイナリ⽣物領域に存在するバイナリ⽣物
へ順に実施していくだけです (図 2.3)。なお、バイナリ⽣物領域内の全てのバイナリ⽣物で周期動作を終え、バイナリ⽣物領域の先頭に戻ってくるまでの周期を「環境周期」と呼ぶことにします。

–8–

1
4

2.4 動作の流れ▲ 図 2.3: 基本動作
以降では、これら 5 つの振る舞いについて説明します。

♣ 代謝/運動「代謝/運動」では、まずバイナリ⽣物の評価を⾏います。評価は予め⽤意した「評価関数」で⾏います。評価関数は、今対象にしているバイナリ⽣物を 100 点満点で評価し、点数を関数の戻り値として返すものです。そして、評価関数の戻り値で得られた点数を、評価したバイナリ⽣物の「適応度」へ設定します。代謝/運動の振る舞いを図⽰すると図 2.4 の通りです。

▲ 図 2.4: 代謝/運動評価関数でどの様な評価を⾏うかによって、どの様なバイナリが⽣成されるかが決まります。評価の仕⽅は何でも構いません。例えば「試しに実⾏してみてその結果が期待通りか否かで評価する」というのがよく⾏う評価⽅法です。

♣ 成⻑「成⻑」では、バイナリ⽣物の「適応度」に応じたエネルギー獲得量を算出し「エ

1
5

–9–

第 2 章 PDP-7 向け設計の解説

ネルギー」へ加算します (図 2.5)。エネルギー獲得量を算出する式もチューニング箇所の⼀つです。⼤前提として適応度が⾼くなるに連れてエネルギー獲得量も⼤きくなるように式を⽴てると良いです。本書で実験に⽤いた PoC 実装では 0 から 100 の適応度をそのままエネルギー獲得量としています。

▲ 図 2.5: 成⻑♣ 増殖
基本的な増殖の流れ「増殖」では、増殖条件が成⽴している場合、⾃⾝のコピーをバイナリ⽣物領域に⽣成します (体細胞分裂)。増殖条件は、実装次第ではありますが、基本的に「エネルギーが増殖コスト以上である」かつ「新たに⽣まれるバイナリ⽣物の領域を確保できる」場合に増殖可能となります。
新たに⽣まれるバイナリ⽣物の領域をどう確保するかも実装次第ではありますが、本書で実験に⽤いた PoC 実装では分裂元のバイナリ⽣物の直後あるいは直前を確認します。このようにしている理由は、メモリ空間内に実際に⽣きている単細胞⽣物っぽくしたかった事*6 と実装が容易であるためです。
増殖条件の確認について図⽰すると図 2.6 の通りです。

*6 ⾃⾝と離れた所に⾃⾝のコピーが⽣まれるというのは、体細胞分裂っぽくないなと思いまして・・。

– 10 –

16

2.4 動作の流れ▲ 図 2.6: 1. 増殖条件が成⽴しているかを確認
なお、体細胞分裂の際、「エネルギー」と「命令列内の JMP I 命令 (リターン命令)」は⾃⾝のコピーではなく新たに値を⽣成します。「エネルギー」には予め定義された「初期エネルギー」を設定します。「命令列内の JMP I 命令」は新たに⽣まれる
バイナリ⽣物では「戻り先アドレス」のアドレスが変わっているので、新しい「戻り先アドレス」を指すように命令を作り直します。ちなみに「戻り先アドレス」は関数呼び出しの命令 ( JMS 命令) の際に⾃動的に戻り先アドレスが書き込まれる領域なので初期値としては何でも良いです。⾃⾝の値をコピーしても害はないのですが、本書で実験に⽤いた PoC 実装では 0 を設定しています。これらを踏まえて体細胞分裂について図⽰すると図 2.7 の通りです。

▲ 図 2.7: 2. ⾃⾝のコピーを作成 (体細胞分裂)
突然変異
体細胞分裂の際、突然変異条件が成⽴すると、新たに⽣まれるバイナリ⽣物の命

1
7– 11 –

第 2 章 PDP-7 向け設計の解説

令列のいずれかの命令が突然変異します (図 2.8)。突然変異条件も実装次第/チュー
ニング次第ですが、やり⽅としては例えば「ある⼀定の確率で突然変異する」とか『「100 - 適応度」を突然変異確率とする』等です。前者の場合、⼀度適応度 100 のものが⽣まれても、それが突然変異して逆に適応度が下がってしまう「退化」の可能性がありますが、後者の場合は適応度が⾼くなるに連れ突然変異しにくくなるので、その様な恐れはありません。ただ、後者の場合でも「適応度 90 辺りから格段に突然変異しにくくなるため、90 より⾼い適応度のものが⽣まれるのに時間がかかる」といった⽋点があります。本書で実験に⽤いた PoC 実装では後者の『「100 - 適応度」を突
然変異確率とする』としています。

▲ 図 2.8: 突然変異
突然変異の際に「どの命令を選ぶか」も実装次第です。「ランダムに選ぶ」や「特定の場所の命令のみを対象とする」といったことが考えられます。
また、選ばれた命令の突然変異のさせ⽅としては「追加」
・「変更」
・「削除」のいずれかがあります。これらを「突然変異タイプ」と呼びます。突然変異タイプの「追加」
は、選ばれた命令の直前に「何らかの命令」を追加するというものです (図 2.9)。次に「変更」は選ばれた命令を「何らかの命令」へ変更します (図 2.10)。最後に「削除」は選ばれた命令を削除します (図 2.11)。
「追加」
・「変更」の際の「何らかの命令」
はメモリ空間上に予め⽤意した「命令候補テーブル」の中から選びます。「命令候補テーブル」は突然変異の際に使⽤して良い PDP-7 機械語命令を並べておくテーブルです。「突然変異タイプのどれを選ぶか」や「命令候補テーブルの中のどの命令を選ぶか」も今の所「ランダム」です。なお、突然変異する命令として命令列最後のリターン命令が選ばれた際は、突然変異タイプとして「変更」あるいは「削除」を選ばないようにする必要があります。

– 12 –

18

2.4 動作の流れ▲ 図 2.9: 突然変異タイプ (追加)

▲ 図 2.10: 突然変異タイプ (変更)1
9

– 13 –

第 2 章 PDP-7 向け設計の解説▲ 図 2.11: 突然変異タイプ (削除)♣ 定常的なエネルギー消費
予め定義された「定常的なエネルギー消費量」を⾃⾝のエネルギーから減算します(図 2.12)。この消費量もチューニングパラメータの 1 つです。1 周期で獲得する最⼤エネルギー量より多くしておく事で、バイナリ⽣物が永久に⽣き続けることが無いよ
うにできます。本書で実験に⽤いた PoC 実装では、「成⻑」でのエネルギー獲得量が適応度をそのまま使っているため最⼤ 100 である事から、定常的なエネルギー消費量は 110 としてみています。*7▲ 図 2.12: 定常的なエネルギー消費*7 これはあまり深く考えて決めた値では無いので、まだまだ調整の余地はあるかと思います。ただ、次章で紹介する実験結果の通り、この値のままでも⼀応ちゃんと動くようではあります。

– 14 –

20

2.4 動作の流れ♣死
エネルギーが 0 以下になると死にます。その際は⾃⾝の「開始シグネチャ」と「終了シグネチャ」をクリアします (図 2.13)。シグネチャをクリアすると領域が解放され、他のバイナリ⽣物の増殖時に使⽤できるようになります。

▲ 図 2.13: 死2
1– 15 –

2
2

第

3章

PoC 実装を⽤いた実験の紹介

この章では、「ガイア理論」の「デイジーワールド」と呼ばれるモデル環境を、

PoC 実装上で独⾃に再現した実験とその結果を紹介します。

3.1

PoC 実装について

前章までで紹介した内容を PoC として実装したものは以下の GitHub リポジトリで公開しています。使い⽅等はリポジトリ内の README をご覧ください。

• https://github.com/cupnes/daisy-os-pdp7

3.2

デイジーワールドについて

この章では、PoC 実装上に「デイジーワールド」と呼ばれる環境を設定し、実験を⾏った結果を紹介します。
「デイジーワールド」とは、「ガイア理論」と呼ばれる理論の妥当性を⽰すために考*1「ガイア理論」は「ガイア仮説」とも呼ばれるもので「⽣えられたモデル環境です。

物は地球と相互に関係し合い、⾃⾝の⽣存に適した環境を維持するための⾃⼰制御シ
ステムを作り上げている」とする仮説です。*2
デイジーワールドでは、この仮説を考えるために「⽩と黒の 2 種類のデイジーしか*1 ref.https://ja.wikipedia.org/wiki/デイジーワールド*2 ref.https://ja.wikipedia.org/wiki/ガイア理論

2
3– 17 –

第 3 章 PoC 実装を⽤いた実験の紹介

存在しない世界」を仮定し、その世界では「地表に降り注ぐ太陽光の量の変化に対し、地表付近の温度を⼀定に保とうとする恒常性が働く」ということを⽰します。
考え⽅をざっくりと説明すると、まず前提として、⽩と黒の 2 種類のデイジーは共に、⽣育できる適温は同じであるとします。その上で、例えば、太陽光の量が少なく
地表付近の温度が低下している場合、黒いデイジーは光を吸収し周囲の温度を上げる
ため、光を反射し熱を放出してしまう⽩いデイジーに⽐べて繁殖しやすいと考えられ
ます (図 3.1)。

▲ 図 3.1: 太陽光の量が少ない場合、黒いデイジーの⽅が繁殖しやすい
逆に、太陽光の量が多く地表付近の温度が上昇している場合、光を反射する⽩いデイジーの⽅が、黒いデイジーに⽐べて繁殖しやすいと考えられます (図 3.2)。

▲ 図 3.2: 太陽光の量が多い場合、⽩いデイジーの⽅が繁殖しやすい
この時、環境に存在する 2 種類のデイジーにより地表温度を⽣育適温に保とうとする恒常性が働いていると考えられます。ガイア理論では、このような仕組みが地球上にも存在するのではないかとしています。
この章では PoC 実装上でデイジーワールドを (少々独⾃に) 再現し、バイナリ⽣物– 18 –

24

3.3 実験設定

学の仕組みの上で⾃⼰制御のようなものが働くことができるかどうかを確認します。

3.3

実験設定

デイジーワールドを、前章までで紹介した設計 (そしてその PoC 実装) の上で再現するために⾏った実験設定を紹介します。*3♣ ⽩と黒のデイジーのバイナリ⽣物表現⽩と黒のデイジーをバイナリ⽣物としてどの様に表現したかを紹介します。⽩と黒のデイジーをバイナリ⽣物のデータ構造へ設定した結果は表 3.1 と表 3.2 の通りです。
▼ 表 3.1: ⽩のデイジーのバイナリ⽣物の初期値
フィールド名

初期値

開始シグネチャ0o713130
1000
50
2
0
TAD <定数-1 のアドレス>
JMP I <「戻り先アドレス」のアドレス>
0o713137

エネルギー
適応度
命令数
戻り先アドレス
命令列 [0]
命令列 [1]
終了シグネチャ

表 3.1 と表 3.2 について、表のタイトルの通り、これは初期値であり「エネルギー」
・「適応度」
・「戻り先アドレス」は実⾏する中で変化していきます。
「命令列」について、表 3.1 と表 3.2 ではアセンブリ⾔語で記載していますが、実際には機械語で設定されます。 TAD 命令は PDP-7 の命令の⼀つで「オペランドで指定されたアドレスの値を AC レジスタ*4 へ加算する」という命令です。あらかじめ「-1」や「1」といった定数をメモリ上のどこかに置いておいて、そのアドレス
を TAD 命令のオペランドに指定することで AC レジスタのデクリメントやインクリ*3 厳密には「デイジーワールド」とは違う部分もあるかもしれません。
「デイジーワールドっぽいもの」と⾒ていただければと思いますが、「⽣物が⽣きることで何らかの⾃⼰制御が働く」という事を確認する⽬的は変わりません。
*4 ⼀般的に「アキュムレータ」と呼ばれるレジスタです。PDP-7 では演算を⾏う対象として基本的にこのレジスタを使⽤します。

2
5– 19 –

第 3 章 PoC 実装を⽤いた実験の紹介▼ 表 3.2: 黒のデイジーのバイナリ⽣物の初期値
フィールド名

初期値

開始シグネチャ0o713130
1000
50
2
0
TAD <定数 1 のアドレス>
JMP I <「戻り先アドレス」のアドレス>
0o713137

エネルギー
適応度
命令数
戻り先アドレス
命令列 [0]
命令列 [1]
終了シグネチャメントが⾏えます。PoC 実装では AC レジスタの値を「地表温度」とし*5 、デクリ
メントやインクリメントを⾏うことで「⽩のデイジー」や「黒のデイジー」としています。⽩/黒のデイジー共に命令数は 2 で固定ですので、バイナリ⽣物のサイズとしてはいずれも 8 ワードとなります。なお、デイジー 1 つで 1 ℃の温度上昇/下降というのはデイジー 1 つの影響が⼤きい気もしますが、これに関しては後述する別のパラメータで対処しています。
そして、デイジーに関するその他のパラメータとして、⽣育適温は 20 ℃としまし*6た。

♣ バイナリ⽣物領域の初期状態
バイナリ⽣物領域のサイズは 4096 ワードとしました。前節で紹介した通り、⽩/
黒共にデイジーのバイナリ⽣物としてのサイズは 8 ワードなので、配置可能な最⼤個
体数は 512 個です。
そして、初期状態としては前半 2048 ワードの中に⽩いデイジーを 1 つ、後半 2048
ワードの中に黒いデイジーを 1 つ配置するようにしてみました。この初期状態のバイ
ナリ⽣物領域の使⽤状況を⾊分けで図⽰すると図 3.3 の通りです。⽩⾊の領域が⽩い
デイジーが存在する領域を、黒⾊の領域が黒いデイジーが存在する領域を⽰し、灰⾊の領域はいずれも存在しない領域を⽰します。

*5 AC レジスタは汎⽤的に使⽤されるレジスタであるため、普段はメモリ上の専⽤の場所へ退避していて、命令列を実⾏する直前で AC レジスタへ復帰しています。
*6 実験前に軽く調べた際にデイジーの⽣育適温は 20 ℃辺りというのを⾒かけたのでここでは 20 ℃という設定で実験を⾏いました。ただ、実験後に改めて調べた所、10 ℃前後な様です・・。まあ、今回の実験のデイジーは暑さに強く寒がりということで・・。

– 20 –

26

3.3 実験設定▲ 図 3.3: バイナリ⽣物領域の初期状態♣ 評価関数
シンプルな設計でデイジーワールドのような⾃⼰制御が働くかを確認する⽬的で、評価関数もなるべくシンプルにしました。実験で設定した評価関数を C ⾔語のような疑似コードで表すとリスト 3.1 の通りです。
▼ リスト 3.1: 評価関数
#define ⽣育適温 20
int 地表温度;/* 現在の地表温度を保持 */int 評価関数(評価対象のバイナリ⽣物) {int 適応度;
int 誤差;/* 評価対象のバイナリ⽣物の命令列を実⾏ */ACレジスタ = 地表温度;
評価対象のバイナリ⽣物.命令列();/* 関数呼び出しで実⾏ */
地表温度 = ACレジスタ;/* 実⾏結果を評価 */誤差 = 地表温度 - ⽣育適温;
if (誤差 >= 0) {/* ⽣育適温より⾼いため 、⽩いデイジーへ⾼い適応度を設定 */if (誤差 > 50) {誤差 = 50;}
if (評価対象のバイナリ⽣物 == ⽩いデイジー) {適応度 = 50 + 誤差;} else {適応度 = 50 - 誤差;}

27– 21 –

第 3 章 PoC 実装を⽤いた実験の紹介} else {/* ⽣育適温より低いため 、黒いデイジーへ⾼い適応度を設定 */if (誤差 < -50) {誤差 = -50;}
if (評価対象のバイナリ⽣物 == ⽩いデイジー) {適応度 = 50 - 誤差の絶対値;} else {適応度 = 50 + 誤差の絶対値;}}
return 適応度;}

リスト 3.1 について簡単に説明すると、⽣育適温に対して地表温度が⾼い場合は熱を放出する必要があるので⽩いデイジーへ⾼い適応度を設定し、逆に低い場合は熱を蓄える必要があるため黒いデイジーへ⾼い適応度を設定するようにしています。

♣ 増殖コストデイジー 1 つで 1 ℃も温度が上下するため、個体数を低く抑えるために、増殖コス
トは 900 という⾼い値を設定しました。*7♣ 突然変異関連
突然変異関連でデイジーワールド固有の部分としては、「突然変異対象の命令が常に命令列の最初の命令である」事があります。「⽩/黒のどちらのデイジーであるか」は「命令列の最初の TAD 命令で AC レジスタをデクリメントするかインクリメントするか」です。加えて、⽩/黒のデイジー以外へは突然変異しない世界なので、突然変異の際に対象となる命令は常に最初の TAD 命令となります。
また、同様の理由で、突然変異タイプも「変更」のみです。そして、命令候補テーブ
ルに置いておく命令も、インクリメントとデクリメントの TAD 命令のみとなります。

♣ 外乱
デイジーの存在に関わらず環境周期 1 周期ごとに地表温度を 1 ℃ずつ上昇するという外乱の下で実験を⾏いました (開始時は 0 ℃)。参考として、この外乱を設定した*7 ここで調整するよりも、デイジー 1 つあたりの地表温度への影響を低くした⽅が良かった気もしますが、その事に気づくのが遅すぎました・・。

– 22 –

28

3.4 実験結果と考察

上でバイナリ⽣物領域に何も存在しない状態で環境周期 100 周期分を実⾏した際の地表温度の推移としては図 3.4 の通りでした。

▲ 図 3.4: デイジーが存在しない場合の地表温度の推移

0 ℃から始まり、1 ℃ずつ温度が上昇していることが確認できます。このような外乱の下、デイジーの存在によって地表付近の温度がどうなるかを実験で確認します。
なお、実験パターンによってはこの他にも外乱を与える場合がありますが、それは個別に紹介します。

3.4

実験結果と考察以降ではいくつかのパターンで実施した実験とその結果を紹介します。
なお、以降で紹介する実験はいずれも⼀回の実験の期間は環境周期 100 周期分です。

♣ 地表温度の推移
前節の実験設定で実験した結果、地表温度の推移として図 3.5 の結果が得られま
した。

2
9

– 23 –

第 3 章 PoC 実装を⽤いた実験の紹介▲ 図 3.5: デイジーが存在する場合の地表温度の推移
⽣育適温 (20 ℃) ピッタリという訳ではないですが、地表温度と⽣育適温の差が 0になるように調節しているような働きを確認できます。以降では地表温度と⽣育適温の差のことを「誤差」と呼ぶことにします。
この実験での各環境周期における誤差について簡単な統計処理を⾏ってみた結果は
表 3.3 の通りでした。
▼ 表 3.3: この実験での誤差の統計処理結果
⽅法

誤差 [℃]

平均

4.78
19
0

最⼤
最⼩
パーセンタイル

50(中央値)9041190 パーセンタイルの誤差が 11 ℃であることから、この実験での誤差は九割⽅で約 10 ℃以下であり、地表温度を概ね 10 ℃〜30 ℃辺りで調節できていると⾔えそうです。
なお、実はこの実験結果は、同条件で実験を 100 回⾏った中で誤差の 90 パーセン
タイル値が最も低かった結果で、⾔わば「良くてこれくらい」という結果です。逆に「悪くてこれくらい」というか「⼤半がこれくらいの誤差に収まっている」ということを確認するために、100 回の実験それぞれの 90 パーセンタイル値を昇順に並べた
際の第 90 位 (90 パーセンタイル) の結果を⽰すと図 3.6 と表 3.4 の通りでした。

– 24 –

30

3.4 実験結果と考察▲ 図 3.6: 地表温度の推移 (100 回中の 90 位)▼ 表 3.4: 90 位の統計処理結果
⽅法

誤差 [℃]

平均

11.68
25
0

最⼤
最⼩
パーセンタイル

50(中央値)
901222以上から、PoC 実装上で今回の実験設定においては、誤差は九割⽅で 20 ℃程に抑えられており、地表温度を概ね 0 ℃〜40 ℃辺りで調整できると⾔えそうです。
良く調整できた場合でも⽣育適温から 10 ℃もブレる可能性があるというのは、植物としては⾟そうな感じです・・。これに関してはやはりデイジー 1 個で 1 ℃も温度が増減するというのが⼤きすぎたかと思います。
ただ、あくまでも今回の実験の⽬的は「バイナリ⽣物学の仕組みの上で⾃⼰制御のようなものが働くことができるかどうかを確認すること」であり、それについては「確認できた」と⾔えるかと思います。

♣ ⽩/黒のデイジーの個体数の推移
⽩と黒のデイジーの個体数の推移がどうなっていたのかも確認しておきます。前項で紹介した 90 パーセンタイル値が最も低かった実験結果の際に、⽩と黒のデイジーの個体数の推移がどうなっていたかを⾒てみます。前項の図 3.5 に個体数の推移のグラフを重ねると図 3.7 の通りです。

3
1– 25 –

第 3 章 PoC 実装を⽤いた実験の紹介▲ 図 3.7: デイジーが存在する場合の地表温度と個体数の推移
追加されている積み上げグラフが個体数のグラフで、灰⾊が⽩いデイジーの個体数
を、黒⾊が黒いデイジーの個体数を表しています。
図 3.7 から、まず全体の個体数は 4 前後であったことが分かります。これは実験設
定で増殖コストを⾼くしたためで、意図通りに個体数を低く抑えられていることが分かります。
また、最初の環境周期 0 から 5 辺りや 60 から 65 辺りを⾒ると、地表温度が⽣育適温より低い場合に黒いデイジーが増えて温度を上げていることが確認できます。そして、環境周期 25 から 30 辺りや 45 から 50 辺りを⾒ると、地表温度が⽣育適温より⾼い場合には逆に⽩いデイジーが増えて温度を下げていることが確認できます。
なお、65 周期⽬辺りに関しては、⽣育適温に達した後も黒いデイジーが増えてしまい⽣育適温を超えて温度が上昇してしまっています。ただ、これに関しては、突然
変異はランダムに起こるものなので仕⽅ない所かなと思います。同時にこのような不安定な所が「⽣物的」な所であるように感じます。それ故に 1 個体の環境への影響⼒は低くした⽅が良かったことも分かります・・。

♣ 他にも外乱を与えた場合
追加の実験として他にも外乱を与えてみました。試しに環境周期 50 で地表温度を

100 ℃にしてみた結果は図 3.8 の通りでした。

– 26 –

32

3.4 実験結果と考察▲ 図 3.8: 環境周期 50 で地表温度を 100 ℃にした場合
途中で突然地表温度が急激に変化しても、それを⽣育適温へ戻そうとする働きが確認できます。この結果からも、バイナリ⽣物学の仕組みの上で⾃⼰制御のようなものが働くことができると⾔えるかと思います。

3
3– 27 –

3
4

おわりに
ここまで読んでいただきありがとうございます！ 本書ではバイナリ⽣物学の理論
を PDP-7 という 60 年代のコンピュータでも動作するくらいシンプルにした設計とその PoC 実装による実験について紹介しました。
「バイナリ⽣物学」⾃体、突⾶なものであるかと思いますが、本書を通してその考え⽅や仕組みについて少しでも⾯⽩いと感じていただければ幸いです。
本書で設計のシンプルさにこだわった理由としては、「UNIX が⽣まれた PDP-7でも動く程にしたかった」事に加えて、「ライフゲームに影響を受けていた」事もあります。ライフゲームは「⽣命の誕⽣や死を計算機上でシミュレーションするゲー
ム」で、碁盤の⽬状のマスで構成された世界の上でたった数個のルールでそのような*8シミュレーションを⾏います。

ライフゲームについて私がすごいと思うところは、少ないルールで「確かにそれっぽく」⾒える所です。⽣物学的に厳密に考えると「⽣命の誕⽣や死」というものは数個のルールで網羅できているものでは無いとは思いますが、「⽣物の密度が誕⽣や死に関わる」という観点においてはそれっぽくシミュレートできているのかと思います。本書で紹介した設計は、そのような事を思いながら、「バイナリが⽣き物のように進化していく上で必要最低限の仕組みは何か」という観点でこれまでのバイナリ⽣
物学の設計を⾒直した結果のものです。
ライフゲームのすごさとしては他にも、これだけシンプルであるからこそ実装が⼿軽で動作にコンピュータの性能を要するものでもないといった所があります。それもあって「⾃分でも実装してみたい」・「ルールを追加したり変更したりして試してみたい」という思いを起こさせる⼒があると思っています。本書のバイナリ⽣物学の設計のシンプルさは、ライフゲームには及びませんが、60 年代のコンピュータでも動くことは (⼀応) ⽰せたかと思います。本書を読んで、PDP-7 でなくて構いませんので、お好きな環境で「⾃分でもバイナリ⽣物学を実装してみたい」と思っていただけたら幸いです。

*8 ref.http://math.shinshu-u.ac.jp/~hanaki/lifegame/3
5– 29 –

よりシンプルなバイナリ⽣物学の本よりシンプルなバイナリ⽣物学の設計とPoC 実装によるデイジーワールド実験を紹介！
2023 年 11 ⽉ 11 ⽇著

ver 1.0 （技術書典 15）

者

⼤神祐真

発⾏者

⼤神祐真

連絡先

yuma@ohgami.jp
http://yuma.ohgami.jp@yohgami (https://twitter.com/yohgami)
印刷所

⽇光企画

© 2023 へにゃぺんて(powered by Re:VIEW Starter)

3
6