-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtucom3.py
141 lines (109 loc) · 4.8 KB
/
tucom3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
チューリングパターンのシミュレーションは通常微分方程式を用いて行われるが、
ここではグラフ理論を用いて、周囲六個の分子と接する10000個の色素分子のシミュレーションをする。
二種類の色素分子について、
1.周り一周の色素分子のうち色が異なるものが4種類以上なら、裏返す
2.周り二周の色素分子と色が同じならば、裏返す
という二つの性質を仮定すると、蛇のような模様ができる。
2015/5/3に放送された「目がテン!大実験…オセロの石で生き物の模様を作ってみよう!」の実験を参考にした。
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
import matplotlib.pyplot as plt
import numpy as np
import random
class Basalt:
def __init__(self):
random.seed(910)
self.ht = [random.randrange(2) for i in range(10000)] # 10000個で試す
self.j = 0
self.width = 100 # 幅は100
def adj(self, i):
adj = []
if i % self.width > 0:
adj.append(i - 1)
if i > self.width:
adj.append(i - 1 - self.width)
if i >= self.width:
adj.append(i - self.width)
if i < len(self.ht) - self.width:
adj.append(i + self.width)
if i % self.width < self.width - 1:
adj.append(i + 1)
if i < len(self.ht) - self.width - 1:
adj.append(i + 1 + self.width)
return adj
def adj3(self, i):
if len(self.adj(i)) == 6:
wre = 0
for k in self.adj(i):
if len(self.adj(k)) == 6:
wre += 1
if wre == 6:
return "ok"
def adj2(self, i): # 頂点の周りの頂点の更に周り
adj2 = []
adj2.append(i-2-2*(self.width))
adj2.append(i-1-2*(self.width))
adj2.append(i-2*(self.width))
adj2.append(i-2-(self.width))
adj2.append(i+1-(self.width))
adj2.append(i-2)
adj2.append(i+2)
adj2.append(i+2+2*(self.width))
adj2.append(i+1+2*(self.width))
adj2.append(i+2*(self.width))
adj2.append(i-1+(self.width))
adj2.append(i+2+(self.width))
return adj2
def omaru0628(self):
while self.j < 5:
self.j += 1
candidate = []
q = []
for i in range(len(self.ht)): # 全ての頂点に関して
a = 0
q.append(i)
for p in self.adj(i): # 周囲の頂点に関して
if self.ht[p] != self.ht[i]: # 中心と周囲の色が異なっている場合の数をカウント
a += 1
if a > 4: # 中心と異なっている色の頂点の数が4以上で、中心を色を変えるリストへ入れる
candidate.append(i)
print("i", i)
if a == 0: # 中心と異なっている色の頂点がない場合
if self.adj3(i) == "ok": # もう一周外側もあるのか確認
for h in self.adj2(i): # もう一周外側の頂点全てに対して
if self.ht[h] != self.ht[i]: # 異なる色の頂点がある場合は除外
break
candidate.append(i) # 周囲二周の色が同じ場合、中心を裏返す
print("b")
for f in candidate: # 指定された場所を裏返す
if self.ht[f] == 0:
self.ht[f] = 1
elif self.ht[f] == 1:
self.ht[f] = 0
self.omaru0628()
self.hsksidi()
def hsksidi(self):
self.s = []
self.t = []
for h in range(self.width):
for g in range(self.width*(h-1),self.width*(h-1)+self.width,1):
if self.ht[g]==1:
self.s.append(h)
self.t.append(g-self.width*(h-1))
def draw_heatmap(self,s ,t):
heatmap, xedges, yedges = np.histogram2d(s, t, bins=self.width)
extent = [xedges[0], xedges[self.width], yedges[0], yedges[self.width]]
plt.figure()
plt.imshow(heatmap, extent=extent)
plt.show()
plt.savefig('ploplot.png')
# In[ ]:
def test():
b = Basalt()
print(b.adj(0))
b.omaru0628()
b.draw_heatmap(b.s,b.t)
print(test())
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
実行結果は
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""