質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

611閲覧

シミュレーションの可視化コードがうまくいかない

yuremu_gon

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/01/11 08:34

前提・実現したいこと

シミュレーションするプログラミングについて勉強しています。
その時に、このサイトにあるサンプルコードを使用させていただきました。
セルオートマトン法を用いた森林火災シミュレーションのアニメーションを導き出したいです。
ご回答宜しくお願い致します。

発生している問題・エラーメッセージ

実行時にエラーメッセージはなく、アニメーション作成・GIF画像の部分が実行されていないようで、 step1の状態しか表示されません。 Google Colaboratoryを使用しています。

該当のソースコード

import numpy as np np.random.seed(42) # 乱数のシードを固定する。 # 状態 GROUND = 0 # 地面 TREE = 1 # 木 BURNING = 2 # 燃えている木 BURNED = 3 # 燃え尽きた木 # パラメータ size = 10, 10 # 地面の大きさ prob = 0.7 # 地面に木が生えてる確率 # (1) マップを生成する。 field = np.random.choice([GROUND, TREE], size, p=[1 - prob, prob]) # (2) マップの一箇所をランダムに選択し、2とする。 rows = np.arange(size[0]) # 行方向のインデックス一覧 cols = np.arange(size[1]) # 列方向のインデックス一覧 field[np.random.choice(rows), np.random.choice(cols)] = BURNING history = [field] # 履歴 while True: # (3) 各反復の処理 new_field = field.copy() # (3.1) 現在の状態が BURNING のセルは、BURNED にする。 new_field[field == BURNING] = BURNED # (3.2) 「現在の状態が TREE」かつ「上下左右のいずれかのセルが BURNING」のセルは、 # BURNING にする。 bottom = np.take(field, rows - 1, axis=0, mode="clip") top = np.take(field, rows + 1, axis=0, mode="clip") left = np.take(field, cols - 1, axis=1, mode="clip") right = np.take(field, cols + 1, axis=1, mode="clip") indices_to_burn = (field == TREE) & ( (bottom == BURNING) | (top == BURNING) | (left == BURNING) | (right == BURNING) ) new_field[indices_to_burn] = BURNING # マップを更新する。 field = new_field history.append(field) # (4) 燃えている木がない場合は終了する。 if np.all(field != BURNING): break # (5) 最終的に燃えてしまう土地の面積は全体の何割かを求める。 burned_ratio = np.count_nonzero(field == BURNED) / field.size print(f"{burned_ratio:.2%}") # 55.00% import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from matplotlib import colors # カラーマップを作成する。 cmap = colors.ListedColormap(["gray", "green", "red", "black"]) norm = colors.BoundaryNorm(np.arange(5), cmap.N) fig = plt.figure() def plot(i): plt.cla() plt.imshow(history[i], cmap=cmap, norm=norm) plt.title(f"step={i}") # アニメーションを作成する。 anim = FuncAnimation(fig, plot, frames=len(history), interval=1000, repeat=True) # gif 画像として保存する。 anim.save("animation.gif", writer="pillow")

試したこと

def plot(i):
plt.cla()
plt.imshow(history[i], cmap=cmap, norm=norm)
plt.title(f"step={i}")
の変数iの部分を数字に変更すると、その時の状態のシミュレーションを反映させるために
変数ⅰを0~15まで代入して実行するコードを自分なりにやってみましたが、
すべてエラーになりました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2022/01/11 10:31

手元の環境(Python3.9/matplotlib 3.5.1)で実行してみましたが、0〜16step の画像による GIF アニメーションファイルが作成されました(火災を示す赤色のブロックが外縁方法へ移動していく状況)。
yuremu_gon

2022/01/12 04:34

ご回答ありがとうございます。 返答が遅くなり申し訳ございません。 Google Coraboratory内で実行するとGIF画像は違うところに保存されていたりするのでしょうか? 何度試してもコードの下に静止画が出てきて、変化する様子がありません。 迅速な対応ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問