<p>FHTMitchell提出的解决方案是正确的,但效率低下。<code>sum</code>操作要求在每次迭代中执行O(L)个工作,使整个程序成为O(L*n\u时间)。你知道吗</p>
<p>请注意:</p>
<ul>
<li>开始时<code>occupied_state_count</code>为0</li>
<li><code>occupied_state_count</code>应该只在零状态转换为一状态时递增</li>
<li>只有当一个状态被切换到零时,<code>occupied_state_count</code>才应该递减</li>
<li>如果您已经处于目标状态,则不需要更改,短路可以避免对<code>random()</code>的不必要调用</li>
<li>最后,当两个状态在相反的方向上切换时(你最后的<code>elif</code>),没有必要改变<code>occupied_state_count</code>。你知道吗</li>
</ul>
<p>应用以上所有方法可以得到以下O(nаu time)实现,这要快得多:</p>
<pre><code>import random
import matplotlib.pyplot as plt
fig, axs = plt.subplots(nrows=2, sharex=True)
L = 100 # Number of lattice sites
alpha = 0.2 # Rate of entry
beta = 0.4 # Rate of exit
n_time = 200000 # Simulation steps
record_each = 2000
state = [0]*(L + 1)
occupied_state_count = 0
record = [] # store a record of the total number of states occupied
for itr in range(n_time):
rand_int = random.randint(0, L)
if rand_int == 0:
if state[1] == 0 and random.random() < alpha:
state[1] = 1
occupied_state_count += 1
elif rand_int == L:
if state[L] == 1 and random.random() < beta:
state[L] = 0
occupied_state_count -= 1
elif state[rand_int] == 1 and state[rand_int + 1] == 0:
state[rand_int + 1] = 1
state[rand_int] = 0
if itr % record_each == 0:
yaxis = [i for i in range(L) if state[i + 1] == 1]
axs[1].plot([itr]*len(yaxis), yaxis, 'r.')
record.append(occupied_state_count) # add the total number of states to the record
axs[0].plot(range(0, n_time, record_each), record) # plot the record
axs[1].set_xlabel('Number of steps')
axs[1].set_ylabel('System configuration')
axs[0].set_ylabel('Number of states occupied')
plt.show()
</code></pre>