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

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

新規登録して質問してみよう
ただいま回答率
85.48%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1765閲覧

パイソン、森林火災シミュレーションの延焼ステップについて

RYO_A128

総合スコア3

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/11/29 14:51

前提・実現したいこと

二次元配列を用いた森林火災のシミュレーションをプログラミングで作成しています。使用している言語はpythonです。visual studio を利用しています。
<概要>
N×Nマス上の地面に、木を配置していきます。確率pで木が生えている(状態:1)。確率1-pで木が生えていない(状態:0) 例:map1[x][y]=1→木が生えている といった感じ。
燃えている木の状態を2、鎮火した状態の木を3とする。
map1[x][y]の初期値は0か1とし、最初のステップでどこかの木を2にし、完全に鎮火するまでステップを更新していく。(x、y)が1の時、隣接するマスのうち、どこか一つでも2の状態のマスがあれば(x、y)は2となり、次のステップで3となる。2が広がるのは1ステップで1マスのみとなっている。

<問題>
1ステップの間に2マス以上の延焼が起こってしまいます。私の方針として4隅、4辺、中といった場合分けでコードを作成しました。延焼のステップを何度か書き換えてみましたが、やはりうまくいかなかったです。

どこら辺がおかしいか教えていただけますでしょうか。
よろしくお願いします。

該当のソースコード

python

1import random 2import itertools 3 4random.seed(50) 5 6p = 0.7 #木の生えている確率 7N = 5 #森の広さ 8haji = [0,-1] 9tyousei = [1,-1] 10 11map1 = [] 12for x in range(N): 13map1.append([0]*N) 14for y in range(N): 15 if random.random() <= p: 16 map1[x][y] = 1 17 18map2 = [] 19for _ in range (N): 20map2.append([0]*N) 21 22while True: 23a = random.randint(0,N-1) 24b = random.randint(0,N-1) 25if map1[a][b] == 1: 26 map1[a][b] = 2 27 break 28 29print(*map1, sep="\n") 30 31all_list = itertools.chain(*map1) 32all_list = list(all_list) 33 34while 2 in all_list: 35for x in haji: #隅っこ 36 if x == 0: #左端の隅っこ 37 for y,z in zip(haji,tyousei): 38 if map1[y][x] == 1: 39 right = map1[y][x+1] 40 updown = map1[y+z][x] 41 if right == 2 or updown == 2: 42 map2[y][x] = 2 43 else: 44 map2[y][x] = 1 45 elif map1[y][x] == 2: 46 map2[y][x] = 3 47 else: 48 map2[y][x] = map1[y][x] 49 else: #右端の隅っこ 50 for y,z in zip(haji,tyousei): 51 if map1[y][x] == 1: 52 left = map1[y][x-1] 53 updown = map1[y+z][x] 54 if left == 2 or updown == 2: 55 map2[y][x] = 2 56 else: 57 map2[y][x] = 1 58 elif map1[y][x] == 2: 59 map2[y][x] = 3 60 else: 61 map2[y][x] = map1[y][x] 62 63for x,z in zip(haji,tyousei): 64 for y in range(1,N-1): #上下の縁 65 if map1[x][y] == 1: 66 left = map1[x][y-1] 67 right = map1[x][y+1] 68 updown = map1[x+z][y] 69 if left == 2 or right == 2 or updown == 2: 70 map2[x][y] = 2 71 else: 72 map2[x][y] = 1 73 elif map1[x][y] == 2: 74 map2[x][y]=3 75 else: 76 map2[x][y] = map1[x][y] 77 78for y,z in zip(haji,tyousei): 79 for x in range(1,N-1): #左右の縁 80 if map1[x][y] == 1: 81 up = map1[x-1][y] 82 down = map1[x+1][y] 83 side = map1[x][y+z] 84 if up == 2 or down == 2 or side == 2: 85 map2[x][y] = 2 86 else: 87 map2[x][y] = 1 88 elif map1[x][y] == 2: 89 map2[x][y] = 3 90 else: 91 map2[x][y] = map1[x][y] 92 93for x in range(1, N-1): #縁以外 94 for y in range(1, N-1): 95 if map1[x][y] == 1: 96 up = map1[x-1][y] 97 down = map1[x+1][y] 98 left = map1[x][y-1] 99 right = map1[x][y+1] 100 if up == 2 or down == 2 or left == 2 or right == 2: 101 map2[x][y] = 2 #延焼 102 else: 103 map2[x][y] = 1 #変化なし 104 elif map1[x][y] == 2: 105 map2[x][y] = 3 #鎮火 106 else: 107 map2[x][y] = map1[x][y] #変化なし 108 109map1 = map2 110all_list = itertools.chain(*map1) 111all_list = list(all_list) 112print("============") 113print(*map1, sep="\n") 114

試したこと

乱数の値は固定しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1import copy

を追加して

diff

1- map1 = map2 2+ map1 = copy.deepcopy(map2)

投稿2020/11/29 23:26

ozwk

総合スコア13528

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

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

RYO_A128

2020/11/30 03:42

解決しました!! ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問