################################################################# 感染シミュレータ(ゲーム) Version0.90 by AKUBI 2025/08/26 https://akubi-soft.com/review/kss.htm ※しばらく非公開(2022年5月以降)にしていましたが、気になっていた 乱数の扱いや、並列処理時のグローバル変数更新処理の不具合を修正 できたので、再公開します。(2025/08/26) ※ドキュメント(本ヘルプ)は、まだまだ不備が残っているかもしれ ません。 ################################################################# 【はじめに】 【仕様全般】 【操作概要】 【変異機能の仕様】 【自身で使ってみた結果のまとめ】 【バージョンアップ時の改善点/変更点】 -------------------------------------------------------------------- 【はじめに】  本シミュレータは、新型コロナウイルス(COVID-19/SARS-Cov-2)の世界的な 流行を機に、毎日/毎週 周期的な動きを行う被感染個体(生体)群において、 感染に関わる各種条件が、感染の拡大あるいは抑制にどのように影響を与える か?  ゲームプログラマーの性も刺激され、無謀にも突貫工事で作り始めたもの です。なるべく特定の生体、特定のウイルスを対象にすることを避けてきた つもりではありますが、どうしてもCOVID-19を想定してしまっている部分は 残っているかもしれません。  手っ取り早く、傾向を見たいというのがあったので、GUIはかなり手抜きな 部分はありますが、各種設定パラメータはキー操作で調整できるようにして いることと初期設定ファイルで各種パラメータの初期値も設定可能にはして います。  あくまでもコンピュータ内の仮想生体群(コロニー)での現象ではありますが、 興味深い傾向も見えてきます。例えば新規感染者数の周期性は、おおよそ免疫 維持日数の倍数+α(感染期間+潜伏期間...)とか... 感染対策レベルを上げればピークやボトムに影響を与えますが、基本的に周期 には影響を与えない性格があるところは面白い結果です。 (※免疫維持日数は、抗体の維持日数ではなく、感染を回避するための免疫を 維持している期間、実際は多少の個人差はあると見られますが、あくまでも 平均値とみなしてシミュレーションしています。)  あと「おまけ」機能であることを強く断っておきますが、本シミュレータ で持っているウイルスの各属性を、それぞれ少しづつ増減させて、どんな変 異のウイルスが残っていくかを見る機能も付けています。これまた免疫系の 素人が見ると意外な結果ばかりで面白いです。 -------------------------------------------------------------------- 【仕様全般】  シミュレータですので、現実との違いはかなりありますが、人の配置方法と どのようなパラメータで感染させて行くかが基本(=仕様)になるかと思います。 CPUの消費量も半端ないですので、傾向を見るという目的だけは損なうことの ないように、いかに簡素化(手抜き)するかを吟味して以下のような妥協を行っ ています。 ◎人の配置(位置情報)と動き 初期状態の母数10000人の場合を想定した説明をします。 縦x横 100x100 = 10000Pixelの中に10000人を配置。 人口密度は、1(人/pixel)になりますが、それでは埋め尽くされるだけですので、 自宅は、横方向のみ偶数ピクセル値のみにして、乱数で配置しています。 出先と週一のレジャー場所はX方向Y方向共に4の倍数+1の位置に存在するグループと して各人に割り当てています。 単純にこの前提で配置しているだけですが、 自ずと自宅には1人以上で様々な家族構成ができます。出先は4の倍数+1の奇数位置 としているため、ここも自動的に家族より、数の多い集団になります。 この状態で、毎日自宅と出先に移動します。週一回レジャーとして別の出先にも 移動するようにしています。 ◎区画 全体エリアの縦横それぞれ当分の10分割した区域(10x10=100個)を持っています。 (※Dキーを押すと確認できます。) これは地域分断(Dキー)の効果を試すためのものです。 地域分断時は、この区画外への外出は行わず区画内への外出に切り替わります。 人流抑制効果を見る方法のひとつです。 ◎主なパラメータの説明 ・ウイルスの性質に関連するパラメータ 接触時感染率 --- 本シミュレータ(現バージョン)では、ひとりずつ1日の間に         出先(出勤,通学)と自宅を行き来しますが、出先において同じ位置に         居る人とは互いに感染の恐れのある状態に至ると見なしこの感染率で         感染させます。 (※新型コロナ流行時には日本国内で濃厚接触とも呼ばれた)         少し厳しい条件になるかもしれませんが、本シミュレータでは移動中         の感染までは考慮しませんので、まあまあ相殺になっているのではと         考えた仕様です。自宅での感染率は一律100%としています。 感染期間 --- 感染して陰性化するまでの日数。この期間は基本的には外出しない         ものとして処理しますが、潜伏期間や無症状者率内に該当する人は、         この期間も外出を続けます。 潜伏期間 --- 未発症状態の日数で、感染に気が付いていないため、通常どうり 外出します。本シミュレータ(現バージョン)では、この期間を感染         させる可能性のある期間として処理します。感染させる能力のある         期間については諸説ありますが、とりあえず仮決めしています。 無症状者率 --- 潜伏期間を過ぎても、無症状で感染していることに気が付かずに         回復(陰性化)してゆく人の率。 本シミュレータ内での具体的な扱いの違いは、発症する人は、 自宅待機扱いですので外出しませんが、無症状者は通常どうりの         動き回り(出勤,通学など)を行います。        この無症状か否かの区別は初期化時に各人に与えている症状レベル         をもとにしています。そのため変異していない同じ株に再感染した         場合は無症状か否かの判定は同じになります。 致死率 --- 発症日数が経ったのち通常は回復しますが、この比率によって死亡         します。無症状者を除く発症した人の中での比率になります。         ただし、本シミュレータ内で人口が減ってきますとシミュレーション       精度が悪くなりますので、死亡者が出たタイミングで新たに免疫を         持たない人を追加しています。手抜き処理です。 免疫維持日数 --- 回復日から数えて感染を防止する能力を維持している日数。         個体差は考慮していません。全個体で共通です。          抗体を保有しているか否かではなく、とにかく感染防御能力を          維持している日数です。          なお、免疫維持日数内に再度ウイルスに晒された場合は、感染を 回避すると同時に、その日を回復日として日数カウントをリセッ         ト(延長)しています。          ここは諸説あるようですが、免疫が活性化するとの見立てです。 ・被感染個体群の性質に関連するパラメータ 移動制限率 --- 移動を一切行わない個体の率です。移動することにより感染          したり、感染させたりすることがない個体の比率になります。 ただし動かなくても感染することはあります。(家庭内感染) 移動距離レベル --- 0〜15までのレベルで移動距離を増減できます。 レベル5で自宅を中心にして区画幅のエリアで移動可能とします。 レベル0は、その半分、レベル10は1.5倍、レベル15は2倍の          区画幅エリア内で外出するものとします。          遠距離通勤が多くなった場合の傾向を見る場合にはレベルを 上げて確認して違いを見て下さい。          このレベルを上げると、全体的に感染が同期して広まるため、 感染者数の波の振幅も深くなる傾向があり、一気に収束して          しまう場合もあります。 感染対策者率 --- 自身が感染していても他人には感染させない人の率。          呼吸器系感染症の場合ですと、鉄壁マスクを常に着用し人前で          咳き込んだりしない人の率になります。        ただし厳しめの見方で感染対策していても予防効果なしとして          いますので、他人からの感染はあり得ます。          家庭内で、感染したり、させたりすることはあります。 (※この率は、実際はかなり厳しい見方をする必要があります。例えば、日頃   鉄壁マスクをしていても、マスクを外しての会食やスポーツ,カラオケなどを   行う人は該当しないことになります。) あくまでもシミュレータですので、実際はどうだろう? ぐらいで慎重に見て いただく必要はあるかと思います。 また、それぞれの結果に対する見方のお願いですが、各種の率や終息日数とか の絶対値での評価は控えてください。例えば、このシミュレーションモデル (対面での感染に焦点)で、初期の設定を前提にすると、例えば感染対策者率を 少しずつ増やしていった場合に、あるタイミングから、それ以上は急激に感染率 が下がる傾向があります。(※移動制限率の場合は、60%以上) この分岐点の存在や、急激さには着目していただきたいのですが、この分岐点 となる率にはブレ幅があるというように見て下さい。 本ソフトはWindows11(64bit)上で開発/動作確認していますが、特殊なAPIは 使っていませんので、Windows Vsta以降の64bit Windows(Vista/7/8.1/10/11) であれば問題なく動作するはずです。 OpenGL等のグラフィックI/Fは使用していませんので、高級なグラフィック カードは不要です。 ----------------------------------------------------------------------- 【操作概要】 操作は単純です。全てキー操作になっています。 (※手っ取り早く結果をみたかったので、GUI作成は可能な限り省きました。) とりあえず起動後「G」キーを押してみて下さい。シミュレーションがスタート します。たまに感染拡大が確認できない場合があります。最初の感染者の配置 状態によって、そのまま終息してしまうケースです。その場合I-Key(初期化)で 感染者を再配置してから再度「G」キーでトライしてみて下さい。 発生源は真ん中よりやや左上(4-4地区)で感染者が数人存在するように初期化 しています。一部赤く表示されている部分です。 内部的には 0-0 〜 9-9の格子状に分割した100地区を想定し、途中でL-Keyで 感染源地区の封鎖(Lock Down)/解除や、D-Keyで地区分断/解除も可能にしてい ます。赤枠や格子状の線が境界になります。 赤点は新たに感染者が発覚した場所、その後無症状の潜伏期間(7日)は黄色で 外出も通常どうり行います。発症後は自宅待機でピンクとなり、14日間は外出を 行わないものとし、14日後に回復して緑色になります。その後、免疫維持日数を 超えると、感染経験者としての色(CORNMILK)に変わります。 これらの日数は初期設定ファイル"KSS.INI"内で定義可能です。 シミュレーションが終了(終息)する条件は、陽性者0です。 例えば、全体に緑色(回復して抗体を持ったと仮定)が埋まってしまうような 場合は終息に至りますが、免疫維持日数に期限がある場合は、早期に終息させて おかないと再感染者が急増したりして永久に終息できない場合があります。 kss08.zipに含まれる初期設定ファイル(KSS.INI)の状態は、あえて中途半端な 感染対策(移動制限やマスク着用)にして感染がなかなか終息しないパターン にしています。早期に終息させたい場合は、一例としてD-Key(地域分断)を 押して様子を眺めて見て下さい。 終息に至りますと、途中の経過ログ("KSS.TXT")が自動的に開きます。 変異有(C-Keyで切替)で実行した場合には、変異株の情報ログを終了時に書き出し 自動的に開きます。 アプリケーションの選択ダイアログが表示される場合は、単純なテキスト形式の ファイルですので、テキストエディタを選択するのが最適です。 このシミュレーションモデルは人の日常の行動パターンを単純化して、1コマを 半日とし、自宅と外出(勤務先や学校など)を繰り返しています。 週に1回だけ別の外出先(レジャー/集会とか)にも行きます。それぞれの場所で 感染チェックを行っています。 このたびのCOVID-19の性質として、やや厳しめかもしれませんが、今までの 各国の報道や報告などを参考にして、家族内の感染率を100%、外出先では同じ 位置に存在する人との総当たりで、感染チェックを行います。初期状態の設定 では、出先の同じアドレス(縦,横)に複数人存在する場合は、必ず全ての人と 濃厚接触するものとし、感染していない人が感染対策をしているか否かは無視 (効果なし)で、感染者側が感染対策(マスク着用など)していない場合に、感染率 15%(初期値)として、感染して行きます。この率はKSS.INI内で変更可能(起動後は 1,2Keyで変更可能)です。 当初は年齢や出先の性質(大企業,小企業,学校,,,)の属性、移動中の感染や移動 ルートも考慮、濃厚接触率の概念なども入れようと考えましたが、そこまで やっても実際との乖離は避けられず、傾向を見ることを目的にするなら意味が ないと判断して止めています。 感染対策者率は、具体的には外出時に常にマスク着用しているなど、もし自身が 感染していても、他人にはうつさない人の率になります。 一方、移動制限率は、そもそもが外出しないため、出先で他人に移すことがない だけでなく、出先でうつされることもない人の比率ということになります。 ただし家庭内で感染させられるリスクはあります。 (※これらは本シミュレータの感染ロジックの基本的な仮定です。) これら感染率や感染対策者率などは起動前に"KSS.INI"(初期設定ファイル/ テキスト形式)で変更可能です。感染対策者率など起動中やシミュレーション 中でも→キーや←キーで増減可能です。(※他の変更可能なパラメータは後述) ただしWHOの報告や多くの医療関係者の説明にありますように、感染対策者率 (マスク着用など)は感染していない人の予防には役立たず、保菌した人が 感染を広げない効果はあるという見方にしてます。実際のところは?はあり ますが、ここは厳しい見方と緩めの見方の相殺と判断し、割り切って処理 しています。 手洗いなど接触感染に関連するパラメータも検討しましたが、本シミュレー タで、どのように反映させるべきか?中途半端では、逆にノイズになりかね ないと判断して人の属性には入れていません。 当初は人口を50000人にして作っていたのですが、1コマ(半日)当たり総当 たりの感染チェック(50000x50000=25億回)を行うことから、結構なCPU負荷 がかかります。初期状態では10000人で、エリア幅を200(Pixel)にしています。 人数を増やしてシミュレーションする場合は、一番負荷のかかる総当たりの チェック処理を並列化していますので、コア数の多いCPUが威力を発揮します。 処理の並列化数(初期値は6)は、論理CPUの数(ステータスばー左下に記載)とは 独立して設定できますが、結局のところ論理CPUの数と同じぐらいが一番高速 な処理になると思われます。KSS.INI内でこの初期値の変更も可能です。 人口とエリア幅の組み合わせも、KSS.INIで変更可能です。 起動中のWindowsを最小化しておくと、描画処理が省略(Version0.6以降)され ますので、やや高速にシミュレーションが進みます。 結果をなるべく速く出したい場合には、最小化しておいて下さい。タスクバー に表示される最小化アイコンにマウスを移動させると経過日数が表示されます。 ★起動/終了/シミュレーション中操作 <シミュレーション実行操作> Gキー : シミュレーション開始 又は 一時停止中からの続行 Fキー : 半日のみ進行 Ctrlキー: シミュレーション一時停止 ESCキー : シミュレーション中断 Rキー : 感染状態のリセット       (同じ初期状態から条件を変えて比較したい場合など) ※事前に移動距離レベルを変更している場合には、出先の配置なども 変えるため初期化同等の処理を行います。 ※Ctrlキーと同時に押すと起動時のパラメータに戻します。 Iキー : 感染状態の初期化 (※Rキーと同じような振る舞い)       (別の初期状態からスタートしたい場合) ※Ctrlキーと同時に押すと他のパラメータも起動時と同値に戻します。 <ウイルス&人の属性> Cキー : 変異有、無、の切り替え ※変異有モード時の仕様は後述 ※変異無モード時は、実行中でも強引に以下属性を変更可能に        していますが、これは感染中のウイルス全ての属性が瞬時に        切り替わるものですので現実離れした仕様です。        参考程度の見方をして下さい。 1キー : 接触時感染率 -1% 2キー : 接触時感染率 +1% 5キー : 感染期間 -1日 6キー : 感染期間 +1日 3キー : 潜伏期間 -1日 4キー : 潜伏期間 +1日 7キー : 無症状者率 -1% 8キー : 無症状者率 +1% 9キー : 免疫維持日数 -1日 0キー : 免疫維持日数 +1日 ;キー : 致死率 -1% :キー : 致死率 +1% [キー : 免疫維持期限 あり → なし (永久に免疫が維持されます) ]キー : 免疫維持期限 なし → あり (日数も調整して下さい) <感染対策関連操作> Lキー : 発生源地区封鎖(Lock Down)開始/解除 封鎖された地区内のみ通勤/通学/週1レジャー禁止          それ以外の地域で、4-4地区に通っていた人は          4-4地区以外に配転。          ※当初は特定の都市(武漢)を想定したものでしたが、全世界に          蔓延したウイルスでは意味なし。 Dキー : 地域分断開始/解除 ※全地域100地区(0-0〜9-9)を互いに分断 単純に地区間の交流を無くす。 出先とレジャースポットも自宅地区に 同時に地区封鎖もかけている時は4-4地区のみ封鎖扱い。 Pキー : 週一のレジャー禁止/解除 ↑キー : 移動制限(Stay Home)率 +1% ↓キー : 移動制限(Stay Home)率 -1% →キー : 移動距離レベル +1 (増減すると強制的に初期化されます) ←キー : 移動距離レベル -1 (増減すると強制的に初期化されます) Mキー : 感染対策(マスクなど)者率 +1% Nキー : 感染対策(マスクなど)者率 -1% <表示関連操作> Tキー : グラフの末尾表示する/しないの切り替え <CPU使用設定操作> +キー : 並列処理分割数 +1 (CPUの使い方なので感染の分析とは無関係) -キー : 並列処理分割数 -1 (CPUの使い方なので感染の分析とは無関係) ※並列処理数によって内部乱数が変わりますのでシミュレーション結果は異なります。  通常はRキーにて感染状態リセット後、Gキーにてシミュレーション再実行した場合は  結果が同じになりますが、この並列処理数を増減させることで内部乱数が変わるため  結果も変わります。乱数の違いで結果の違いを見たい場合には、ここの増減を利用し  て下さい。 <その他> F1キー : HELP.TXT(本文)を開く F2キー : KSS.INI(初期設定ファイル)を開く ----------------------------------------------------------------------- 【属性変化(変異)機能の仕様】  これは「おまけ機能」です。  変異と言っても塩基配列の変異(コピーミス)の視点を持っているものではあり ません。 仮に「ウイルス側にどんな属性変更があったら勢力を伸ばすのだろうか?」という 興味から付け加えたものです。  その各属性の増減を乱数を用いて適当な確率で繰り返し、結果どういう変異を持つ ものが残って行くか?  勝ち抜き戦のようにも見えますが、勝ち負けロジックが入っているわけではなく、 滅びるものは勝手に滅び、残るものは勝手に残る,,,だけのものです。  変異させるか否かは、実行前にC-Keyで切り替えることができます。左パネル 【ウイルス属性(変異有)】で確認できます。 変異パターンは現状(Ver0.90)では以下12種類になっています。 ・接触時感染率が+5%になるような変異 ・接触時感染率が-5%になるような変異 ・発症日数が+2日になるような変異 ・発症日数が-2日になるような変異 ・潜伏期間が+1日になるような変異 ・潜伏期間が-1日になるような変異 ・無症状者率が+5%になるような変異 ・無症状者率が-5%になるような変異 ・致死率が+1%になるような変異 ・致死率が-1%になるような変異 ・免疫持続日数が+5日になるような変異 ・免疫持続日数が-5日になるような変異  それぞれ表面上の属性で、実際あり得る変異か否かはわかりません。 例えば、免疫持続日数が変化するような変異?に着目しても、影響を与える 可能性のある箇所や仕組みは様々なものがあるはずで議論は絶えないと 思われます。 そのあたりはとりあえず無視して、とにかく上記属性の変化(変異)を許容する ようにしています。本シミュレータ実行中にある確率(乱数使用)によって12種類 のうちのひとつを選択して強制的に属性を変えています。  変異株は本シミュレータでは、感染したタイミングで出現するようにして います。元の株をベースに更に変異を加え新たに変異株Noとして登録し、感染 した各人にその変異株Noを持たせる仕組みです。 ランダム(中立)に上記の変異を加えますので、中には過去の変異株の状態に戻る ケースも多く出てきますが、変異株No(5ケタの整数)は別になります。  実行して、しばらくすると左パネル【変異有】の部分が変異株数に変わり、 陽性者占有率のTOP5が表示されます。 最初は初期株が圧倒的な勢力ですが、陽性者数で変異株が上回ってくると、 同時に、初期株から見た、最多変異体の異なる部分だけ -> で数値が併記され ます。  収束後は、"mutation.txt"に変異体一覧と、地区ごとの変異体別の抗体保有 者数(残像)を書き出します。残像は最後にその変異株に感染していた人の数に なります。  このログには各変異株ごとにPEEK陽性者数とそのPEEK日を書き出しています ので、グラフの波形分析をする場合にも参考になるかと思います。 ※変異させるか否かの判断は乱数を利用しています。基本的にこの乱数は実行 するたびに異なる流れになってしまいますので、結果も大きく異なってきます。 並列処理数が同じでも、それぞれのタスクの進み具合で乱数の使う順番が異なっ てきます。OS側のCPUの割り当てによって、乱数の使う順番が変わってしまう ということになりますので、基本的には2度と同じ結果を出すことはできないと ご理解下さい。 またVer0.83から、被感染者の持つ抗体(直近で罹った株No)と、晒された株No. 間の、世代間距離(プロラム内での変数名degree/人の親等にあたる)を考慮して います。 いくら免疫維持日数内でも、この世代間距離が1つにつき、とりあえず20%ほど 免疫力が減退し、5世代以上離れると全く免疫は活かされずに感染するという 処理を入れています。 実際の感染の状況と乖離させないためのフォローではありますが、ここは時と 場合によるかもしれません。気持ち程度のフォローとご理解下さい。 ----------------------------------------------------------------------- 【自身で使ってみた結果のまとめ】 色々な人に検証してもらったら、別の見解も出てくるかもしれませんが、 このシミュレーションモデル(対面での感染に焦点)が出す結果の見解。 ★Version0.86(2022/03/18)で新たに持った見解 〇Ver0.85で母数50000人/100年間のシミュレーションで変異株数のエリア配列 (100000株)が不足するため、配列を増やすことを考えたのですが、それも今ひと つな気がしたので、変異する確率を減らすことで確保エリアの拡大を避け、それ はそれでどんな結果になってゆくか?興味深いので、一石二鳥の気持ちで変異確 率を半分にしてみました。(※Ver0.85→0.86の変更箇所はkss.cppの244行目のみ)  あくまでも、本シミュレータ内の結果で感触としてですが、どうやら変異確率 を半分にした程度では、大局的な変異スピードは変わらないような感じです。 新たな変異株が勢力を伸ばす時というのは、感染者数の波がPeekに向かおうとす る時ですが、ほとんどの変異株は直ぐに消えてゆきます。一部ピックアップされ たものが残留してゆくわけですが、そのピックアップ候補が多いか少ないかだけ のことで、最大勢力交代の回数には影響を与えないからだろうと推測します。  結局、弱毒化という一般的な見方も、そのスピードに関しては、流行(感染者 数)の周期に依存していて、最終的には免疫維持日数とも関係しているのかも しれません。すなわち免疫維持日数が短いものほど弱毒化速度も速い? 実際もそうであればいいですね! ★Version0.85(2022/02/23)で新たに持った見解 〇変異株シミュレーションの結果から見た傾向は、  ・濃厚接触時感染率、無症状者率は、双方ともにプラスの方向に変異して   行き最終的に100%に至る。  ・潜伏期間は、プラス傾向  ・発症日数、プラス傾向  ・致死率は、なぜか若干増加傾向。なんでだろう?バグ?ロジック不備?  ・免疫維持日数は、意外にも方向性が無く変異に対しては中立のようだが、   稀に免疫維持日数のより少なくなった株の勢力が急激に増す傾向が出現、   最終的にほぼすべての株が0日(=免疫不全?)になるケースあり。こうなって   しまうと感染対策不能。   実際このようなことが起き得るか否かはわかりませんが、この現象は   どう解釈すればいいのか...少し懸念される点です。 ★Version0.80(2021/10/25)で新たに持った見解 COVID-19の日本における第5波についての雑感を兼ねて、 以下の本ソフト公開ページにまとめています。 https://akubi-soft.com/review/wave5.htm ★Version0.7(2020/08/26)で新たに持った見解 〇Version0.7にて、本シミュレータで扱うウイルス関連の属性レベルの 変異を許容する仕組みを試しましたが、実に色々な結果が出るものです から未だ頭がまとまっていません。 変異株の種類は日数と共に増えてきますが、ほとんどは途中で淘汰されて しまい残って行くものはごく一部になる傾向が見られます。 とりあえず変異株の中で一番勢力を伸ばしやすい項目は、「濃厚接触時の 感染率増加」や「潜伏期間の日数増加」あたりのようですが、そうとも 限らないケースも多いのでなんとも言えません。 終息日数が長くなってくると、これらの値がプラスになるような変異が 出現し、ある程度勢力を伸ばすと、その変異株をベースに他の属性もやや 感染拡大に寄与する方向の変異のものが残ってゆくというサイクルを繰り 返しているような感じです。 〇ただし、その方向への変異が、どんどん突き進むかというとそうでも ないところがありまして... しっくりこないので、しばらく考えこんでいたのですが、どうやらそれで OKと納得しました。 と言いますのは、結局致死性の高いウイルスがさほど蔓延しないのと同様、 異常に感染率が高くなるような変異株は、その周辺で直ぐに感染爆発を 起こしてしまい、局所的な集団免疫獲得により淘汰されてしまうことが 原因になっているのだろうと推測しています。 何回か繰り返して試していると、しばらく均衡を保っていたのに、ある タイミングから徐々に新規感染者の波が大きくなり、最後は集団免疫が 原動力で終息してしまうのですが、これはウイルス側にとっては適者保存 がうまく行かなかった例とみなすべきかもしれません。 〇結局、人間側予防レベルと、ウイルスの感染力とがバランスよく釣り 合っているところのものが残って行くようです。(適者保存?) ですので、ウイルスの感染力が一方的に強くなってゆくことを危惧する 必要はないような気がしてきました。 ★Version0.6(2020/08/15)で新たに持った見解 〇地域分断(D-Key)は、当初Ver0.5時点での確認では、顕著な効果に気が つかなかったのですが、Ver0.6で免疫維持日数を考慮した場合には、終息 しそうでなかなか終息に至らないケースが多く見られる中、最後の一手 として大変効果的であることが確認できました。  実はこのシミュレータを作る前から、期待できると思ってきたのですが、 前バージョンではそれに気が付かなかった部分です。 ウイルス側の立場で見ますと、人口を含む広大さも感染を維持してゆくため の重要な役割を持っていると言えます。感染が広まってくると、感染拡大 している地域と、そうでない地域ができてきますが、感染が終息しようと する地域にとって、人々の免疫が無くなってきている地域は、ウイルスの いいバックアップ先になってしまうという性質があるようです。経過日数 により集団免疫が維持できなくなってきた地域に飛火してゆくことを繰り 返してしまいます。 感染の封じ込めを詰将棋として見た場合、新規感染者0/陽性者0を実現する 最後の一手には地域分断も重視するべきかもしれません。これはシミュレ ーション中の分断時の格子内の様子を眺めていると意味が解ってくると 思います。  ここを甘く見過ごしてしまうとあっさり振り出しに戻ります。また感染 拡大中にこの一手を出しても、基本的な感染対策ができていない状況では 効果が見えてきません。(※これはあくまでも体内の免疫システムが永久 には維持できないと想定した場合のことです。) 〇地域分断は本シミュレータでは、横方向に10分割、縦方向に10分割した 格子状に分けた地域を想定したものです。  現実社会では色々なレベルがあるかと思います。まず最上位は国レベル、 それから都道府県レベル、市町村レベル,,,究極に細分化したのが世帯レベ ル(Stay Home)になるかと思います。  陽性者0を世帯レベルを基点にして徐々にレベルを上げてゆき、それぞれ のレベルで陽性者0を認定できた地域間でのみ交流を再開して行き、最後は 国レベルを開くというのがウイルス撲滅の基本に見えます。  それでも現実社会では何らかの保菌キャリアにより、陽性者がくすぶる 可能性はあるかもしれません。しかし徹底した理詰めの対策を積んでいな ければ、それがどこを由来したものかの分析は不可能に思えます。 〇感染対策が中途半端な場合においては、もうひとつ無視できない点があり ます。感染拡大の大局的な予測はほぼ不可能ではないかと思わせる結果が 見られます。  本シミュレータでは、+-Keyで並列処理数を変更できるのですが、実は これで内部の乱数発生の流れが変わります。難点ではあるのですが、これ を逆に利用して、結果の違いをチェックすると大変興味深い結果が見えて きます。  Stay Home率70%以上のような強力な予防策を取っている場合には、早期 終息確定でほぼ結果に違いは出ませんが、中途半端な予防策では、乱数の 違いで大きく結果が異なってきます。(※乱数は濃厚接触発生時に感染率 に応じた感染者判定に利用)  終息日数が何倍も違ったり、急に陽性率が高止まりしたり下げ止まりし たり、何度も新規感染者0まで到達しているのに、一人でも陽性者が残っ ているとあっさり振り出しに戻ったり、同じ条件でも乱数が変わだけでも 感染状況が激変してしまいます。 〇無症状者率は、本シミュレータでの扱いは、感染していても気が付かず、 外出を通常どうりに行う人の率になるのですが、これは感染が拡大するか 否かに大きく影響を与えているようです。極端な例として無症状者率を 100%にしてシミュレーションを行ってみるとよく判ります。  新型コロナウイルスは日々変異を繰り返しているようですが、複数の 変異型でも無症状者率に違いがあれば、無症状者率の高いものが流行した 地域では感染が収まりにくく、やがて感染が収まっている地域に飛火して しまう可能性がありそうです。  また少し異なる性質として、万一潜伏期間(kss.iniで設定)の長いタイプ の変異体が出現すれば同様のことが起きます。  このサイクルを繰り返すと、どんどん無症状化(弱毒化)は進み、感染者を 早期に見つけることができなくなり勢力を伸ばしてくる可能性を感じます。 高齢者もほとんどが無症状化するようなものが蔓延して解決なんてことが あるのか否か? 一時的には強毒化もあり得るでしょうから、いずれにせよ 悩ましいとしか言いようがありません。 変異体を生み出す余地を無くすのは早期終息しかありません。 ★Version0.5(2020/03/27)時点の見解 〇発生源地区封鎖は、当初他地域との往来を無くすだけにしていたのですが、 それだけでは全く効果がなかったため、仕様を変更して出勤や通学も含めて 外出禁止にしています。当然封鎖地区の感染抑制には即効性が出てきます。 一方、他地域がいつもどうりの生活では、他地域はやはり感染が爆発して しまいます。ここは想像どうりで、ある程度感染が広まってしまった段階 からは、他地域にとっては効果が期待できるものではないです。 (※感染ルートを追っかけるときには効果的かもしれませんが...) G-Keyでスタートして、数秒後(=数日後)L-Keyで封鎖しても手遅れ。 当たり前ではありますが、G-Keyでスタートする前に、L-Keyで封鎖や、 D-Keyでの地域分断しておけば期待どうりの結果にはなります。 ◎ただし、ひとつ妙な現象を確認しました。 発生源地区を封鎖しても、やはりいつかは解除しなくてはなりません。 その時には周りの感染爆発のあおりをうけて感染率が上がってしまう だろうと予想して、とりあえず途中で封鎖解除(L-Key)したところ、 結局感染率が廻りと同じぐらいになるだろうと見ていたのですが、 なぜか目に見えて封鎖された側の感染率だけは低くなっているようです。 ※発生源地区(封鎖地区)だけは、終息後ログ(KSS.TXT)に感染率が書き 出されますので確認できます。 これは意外な結果なので、バグかと思いましたが、ひとつには周りの 地区で感染爆発してしまい、周辺地区において集団免疫が形成されて からの封鎖解除だったことが判明したことと、もうひとつ想像できる ところでは封鎖中の間に封鎖地区内でも一部に集団免疫グループが安定化 (すべての構成員が陰性化)され、そのグループがストッパーになった という部分も含まれている可能性があります。ここは追及していません。 〇もうひとつ封鎖の仕様変更前のプログラムで、封鎖内の外出制限を加え ない段階の時の結果ですが、感染源地区を封鎖した場合、封鎖しない状態の 結果とのログ比較では、逆に封鎖直後は全体でみると感染率が一時的に 上がる時もありました。 これもバグかと思いましたが、封鎖後に封鎖地区内に勤めていた人たちが 配置転換により出先を変えざるを得なくなったことにより、新たな出会い= リスクが発生したためでした。 感染が広まってくると、一部集団免疫をもちつつあるグループが形成されて きますが、封鎖により行き場のなくなった人が、そうでない無感染のグループ との接触機会が発生して感染を広めています。とは言えその上昇率は大した ものではないです。 唯一効果が見られるたのは、実は封鎖された側の地区で、ブーメラン感染が なくなる分、若干感染が減る傾向が見られます。ただ、それも大した違いは 見られません。初期化(I-Key)の状態で逆の時もあったぐらいです。 ◎週一のレジャーを止める(P-Key)、これはまあまあ効果が見られました。 すなわち生活パターンを単純化(新しい接触/出会いを少なく)すればするほど 感染リスクが減るということ。最終的な累計感染率が減るため死者は減らせる。 ただし、逆に終息するのには時間がかかる。 ただほんとうは出勤や通学も含め1〜2か月止めればあっさり終息します。 これは設定では試せませんが、当初このプログラムを作り込んでいる時に、 全く感染が広がらないので、原因を調べたところ出先に移動できていなかった というバグがありました。当たり前といえば当たり前です。 ☆感染対策率(マスク着用)率の増減、これが意外な結果でした。 M Keyの連打で下方のステータスバー中央に表示される感染対策率を70% ぐらいまで上げていただければシミュレーション中でも感染が劇的に終息 して行きます。一瞬バグかなと思ってプログラム内を分析してみましたが、 そんなに難しいことではなく、うつされない効果ではなく、うつさない効果 が出ただけのことでした。 実はこれはWHOや多くの医療関係者の見解とも矛盾はしていません。 「マスクは予防効果はなく、保菌した人が感染を広げない効果がある。」 このシミュレータの内部処理もそうしています。その結果です。 ウイルスは多かれ少なかれ、無症状で感染に気が付いてない段階の人が 広めているケースがあるはずです。(※COVID-19はほぼ100%?) 「とりあえずマスクはしておきましょう!」の声明が欲しいところです。 とVersion0.5作成時には書きましたが、 6月6日「WHO、マスク指針を転換 密接場面で着用推奨」のニュースが入り まして、ほっとしました。 感染対策率(マスク着用率)に関してはもう少し試してみました。マスク着用率を シミュレーション中は一定にして、0.1ずつ上げていって比較してみますと、 0.5ぐらいまでは最終の累計感染率が減少してゆきますが、逆に終息日数が 長くなってしまう傾向がみられました。この段階ですと、まだ終息に至る 原動力は集団免疫に頼っているような状態です。一方0.6〜0.7ぐらいに なってくると急激に感染率が下がり、終息期間も一気に短くなってきます。 まさにねじ伏せた感があり気持ちいいです。 それから【はじめに】にも書きましたが、この分岐点の率は、実際にはブレが あると思います。ただ、ある比率以上になると劇的に感染が抑制できるライン が存在するというのが、このシミュレーションモデルの結論です。 ※子供も含め全世代で、すべての集団(会社,学校など)で満遍なく、そして どのタイミング(対面など)でも、その比率以上になっていることが前提です。 ついうっかりというのがあるかもしれないので、結構厳しいラインなのです。 止む無く一時的にマスクを外して会食やカラオケなどする人、マスク着用率 にはカウントできません。マスクを保有しているだけになります。 2月〜3月(2020年)は、もともと日本では花粉の季節と重なり、マスク着用の習慣 が多くの方にみられます。いくらマスクは役立たず、知識不足と言われても、 「花粉症だし、コロナうつされたくないもん」で皆がマスクしていたら、 実はうつさないほうで貢献していた? なんてことがあったかもしれません。 花粉が無くなってきてマスク着用率が下がってきた時は怖いです。 とVersion0.5作成時に書きましたが、最近ではかなり高率でマスク着用が みられますが、ほんとうに飛沫が飛び交うような時に、逆にうっかり外して いる場合もあり、マスク保有率は上がったものの、ほんとうに着用している と言えるのか?と考えると怪しいものです。 思いつく範囲で、もっともらしい条件を基にしただけのシミュレータですので、 どれぐらいの信憑性があるかは分かりません。 それでもマスクはやっておくに越したことはないと思います。 ゲーム性を考えていたわけではないのですが、→Key連打で感染対策者率や D-Keyの地域分断であっけなく終息するのを見るとストレス解消になります。 手洗いも重要ですが、これは排出口(主には口,鼻)からばら撒かれたウイルス を市中のどこかで触ってしまうからで、なんとかその排出口封鎖(マスク)で 絶対量を減らしてしまえば形勢も変わるのではと思います。 このシミュレーションモデル(対面感染)では無視されていますが、市中に ばら撒かれているウイルス量に焦点を当てたシミュレーションモデルであれば、 もっと顕著な効果になるでしょう。 ----------------------------------------------------------------------- 【バージョンアップ時の改善点/変更点】 〇Version0.85 → Version0.86の変更点(2022/03/17) ・母数50000人の場合に、変異株数エリアの制限100000株を超えるため、 配列を増やすことを検討したが、これもキリがないので、試しに変異する 確率を1/2にすることで確保エリアに余裕を持たせる状態に。 大変興味深い点は、この変異する確率を半分に減らしても、年単位で見ると 変異株の広まり方に大きな違いが見られないことです。 〇Version0.84 → Version0.85の変更点(2022/02/23) ・免疫維持日数増減キーの表記が致死率のものと重なっていたので  ;,:に変更 ・R(リセット)キー時のグラフ縦軸目盛り表記の残像解消 ・乱数の保管エリアを増加。より自然なバラつき具合に(シタツモリ) ・本ドキュメント(HELP.TXT)の不備の訂正 etc... 〇Version0.83 → Version0.84の変更点(2022/02/20) ・ウイルスvs人属性に致死率の追加 ・陽性者占有率ランキングをTOP10に増加 ・シミュレーション後に稀に落ちるケースの不具合改善 ・最小化から戻った時の表示不備の改善 ・免疫維持日数が0になった変異株(特異例)の扱い不備の改善 ・変異箇所を得るための乱数取得(ransuc)処理で並列処理が干渉して  同じ乱数値を連続して得てしまう不具合のフォロー処理 etc... 〇Version0.82 → Version0.83の変更点(2022/02/06) ・次操作の「N」キーが干渉して動作不能なため、「F」キーに変更 ・被感染者側の抗体(感染株)と変異株間の変異距離 (人間で言うところの親等)を考慮して感染の防御率を操作。 ・変異有モードを初期状態に変更 ・変異有時に変異株の陽性者占有率ランキングを左側に表示 etc... 〇Version0.81 → Version0.82の変更点(2022/01/23) ・IキーやRキー操作で「Ctrl」キー同時押しを行うと、パラメータを起動時に  リセット。 ・シミュレーション中のパラメータ変更で、一部結果がおかしくなる不具合修正 etc... 〇Version0.80 → Version0.81の変更点(2021/10/30) ・移動距離レベル(←,→キーで減増)の追加 ・キー操作のレイアウトを全般的に変更 etc... 〇Version0.71 → Version0.80の変更点(2021/10/25) ・Ctrlによる一時停止を可能に ・0〜9キーを各種属性の増減に割り当て ・キー操作による設定値変更を、終了時にkss.iniに反映 ・全般的に個体という表現を人に変更 ・「マスク着用率」を「感染対策者率」に名称変更 ・「Stay Home率」を「移動制限率」に名称変更 ・キー操作のレイアウトを全般的に変更 etc... 〇Version0.7 → Version0.71の変更点(2020/11/27) ・途中中断をポップアップメニューにも追加 〇Version0.6 → Version0.7の変更点(2020/08/26) ・ウイルスの変異を許容するオプションを追加(C-Keyで切替) ・実行中のウイルス属性の変更を不可に。 etc ,,, 〇Version0.5 → Version0.6の変更点(2020/08/15)】 ・パラメータとして免疫維持日数、無症状者率、Stay Home率の追加。 ・各種感染状況グラフの表示。 ・設定されているウイルス属性の画面表示。 ・感染状況の表示を画面表示。 ・初期設定ファイル(kss.ini)内で設定する率関連の単位を割合(最大1.0)  から%(最大100)に変更。 ・並列処理数を初期設定で4に固定。論理CPU数以上の設定も可能に。 ・免疫維持日数の概念(再感染あり)に伴い感染経験者数を表示 ・最小化時の描画処理の省略(高速化) ・乱数の扱いで、パターン化(周期化)を防止。(内部処理) etc ,,, ----------------------------------------------------------------------- 【改変される方へ】 ・本プログラムはWindows11(64bit)上で開発したもので、Microsoftが無償で 提供しているVisual Studio Communityのなるべく最新版でコンパイル・リンク しています。特殊なI/Fは使っていませんので追加ライブラリ(LIB)も不要です。 ※本プログラムのVersion0.9実行モジュール(kss.exe)は、 Visual Studio Community 2022 (Version17.14.13 August2025)で作成 ・同梱しているフォルダkssdev\下にソース(*.cpp,*.h,*.rc,*.ico)と Visual Studio用ソリューションファイル(kss.sln)も入っています。 このslnファイルをVisual Studioで読み込ませれば開発環境になります。 ・プログラム言語はC++言語です。Perlとか他の言語を扱った経験のある方で あれば、ソース(*.cpp,*.h,*.rc)を眺めていれば、だいたい何をやっているか は理解できると思います。C++言語の勉強などしていなくても、一部修正や機能 追加ぐらいであればできるはずです。解らないところは、検索とかして調べて 下さい。 ・難しい計算は一切行っていません。四則演算と割り算の余りの概念があれば 誰でも理解できる処理です。数学というより算数です。 (※例えば、演算子%は割り算の余りの部分を得るものです。 12 % 10 は 2 ) ・プログラム全体に関することですが、今回の処理で使っている変数は、 基本的に全て、global.cppで宣言し、それを外部変数としてextern宣言して いるのがkssex.hです。各関数内の処理の中で、いつでも関連変数をアクセス できるようにしています。手抜きですが、これぐらいの規模のプログラムで あれば手っ取り早いですし、途中で考え方を変更するのも楽です。 人の属性(PERSON)やウイルス属性(VIRUSINFO)はkssdef.h内の構造体で定義して いまして、kssinit.cpp 内で起動時やI-Key(初期化操作)時に呼び出して、 人の配置や最初の感染者など初期値をセットしています。この2つの構造体を 理解してもらえれば本シミュレータの仕様全貌が把握できます。 ・KSS.INIの中で定義するWIDTH(pixel値)の値で WIDTH x WIDTH の空間を 想定し、その中に乱数で自宅と出先の位置を一様に決めています。 また人数もKSS.INIの中のNUMERを参照するようにしています。家族の人数や 出先組織の人数は把握せず、WIDTHとNUMBERのバランスと、空間位置の間引き 方に頼っています。家族より出先の方の人数を多めにするのも位置の間引き に任せているという手抜き処理になっています。 横方向、縦方向は内部的に10分割していて、0-0〜9-9地区に分かれています。 出先は横方向にも縦方向にも乱数で決めていますが、隣の地区までの通勤通学 はありにしています。(kssinit.cpp) ここの距離をパラメータ化して検証するのも意味があるかもしれません。 注意:Ver0.80現在、色々と不具合があり、PERSON=10000 又は 50000以外は 設定できないようにしています。またWIDTHもそれぞれ強制的に200と500に 固定化しています。 ・グラフ表示を追加したのですが、この中の陽性/免疫比率は、何か終息に 至る時の条件に関係するかもしれないと思い追加したものなのですが、 現時点では特に何か重要な部分を見つけたわけではありません。 あまり役に立ちそうにないので無くしてもいいと思います。 ・もう少し追求したかった部分ですが、出先組織の人数や家族の人数の比率 など実社会に合わせるべく、人属性の中で家族番号や出先組織番号で管理して、 家族の定義、組織の定義などを別定義に、なんてことも頭の中にはあったの ですが、大変そうなのでやめました。うまくやれば高速化にも繋がるかもしれ ません。  またkssdef.hの中の構造体を見ていただければ解りますが、感染ルートを たどれるように、感染させられた相手の人番号とか何次感染かとかを一時期 入れようかと考えていました。時間かかりそうで止めましたが、ここも興味 深い結果が得られるかもしれません。 ・Ver0.84から、変異株の生き残りの傾向を見るため、ウイルス属性に致死率 を入れています。傾向を見るためにも初期値は少々大き目の致死率(15%)に していますが、今のところ変異が進む上で顕著に致死率が増減するような 結果は得られませんでした。 たまたまかもしれませんが、それよりも無症状者率が増えてくる傾向は 明らかに見えてきます。本シミュレーション内では無症状者は自宅待機 扱いにしていない処理ですので、勢力を伸ばすのは当たり前と言えば当たり 前です。これも、ひとつの弱毒化と言えるかもしれません。 死者を出すと母数が減るため、シミュレーション精度も今一つになるため 新たな感染経験なしの人を補充するような変則的フォローを入れています。 ・将来的には、感染経験毎の獲得免疫レベル増や、ワクチン接種者の免疫 維持日数などのパラメータも追加するべきかもしれませんが、今のところ 十分な知見がないため見送っています。想像で追加してもノイズにしかなら ない可能性もあります。また免疫や疫学研究者でない私では無理です。  このあたりの修正も構造体のPERSONに属性追加することで対処できるか と思いますが、実は既に感染回数も情報として持っているので、その情報 をベースに感染経験値(レベル)みたいなものを起こしてみて、感染処理時に 考慮するというのも手っ取り早いかもしれません。 ・マイクロソフトC++言語の乱数発生関数rand() (0〜32767を出力)ですが、 並列処理にしている別スレッド内での出力が、どうも時間が経っても乱数の 中身と順番が同じ?ようです。 スレッドごとに独立している感じ。仕様なのだろうと思います。  そのためのフォローで、二転三転してきましたが、現状(Ver0.84)では、 kss.cpp内のget_ransu関数やget_ransuc関数を用意して、乱数の流れが干渉 しないような苦し紛れのフォローを行っています。  並列処理数を変更したタイミングだけ、各スレッド(並列処理部)の乱数取り 出し開始位置の初期化を行っています。Rキー(リセット)操作のタイミングで は行っていません。  いまひとつな感触はあるものの、ここは逆に乱数の違いによる結果の違いが どれだけあるかの分析にも利用できます。例えば、中途半端な感染対策で、 並列処理数(乱数)を変えると、結果が全く異なることがありますが、これは どう解釈できるか?(先々の予測困難)と言う考察ができます。      2025/08/26 AKUBI SGT00340@nifty.com