这个文档告诉我们:采样时,使用同轨策略的轨迹进行采样比使用均匀分布采样,可以更快逼近真实价值。
当然,也有危险,比如一次又一次地对相同区域更新,显然局部视野。
解释: 分支即状态间的通路,即当前状态可能转换成某几个状态中的一个:
#######################################################################
# Copyright (C) #
# 2018 Shangtong Zhang(zhangshangtong.cpp@gmail.com) #
# Permission given to modify the code as long as you keep this #
# declaration at the top #
#######################################################################
import numpy as np
import matplotlib
%matplotlib inline
import matplotlib.pyplot as plt
from tqdm import tqdm
# 2 actions
ACTIONS = [0, 1]
# each transition has a probability to terminate with 0
TERMINATION_PROB = 0.1
# maximum expected updates
MAX_STEPS = 20000
# epsilon greedy for behavior policy
EPSILON = 0.1
# break tie randomly
def argmax(value):
max_q = np.max(value)
return np.random.choice([a for a, q in enumerate(value) if q == max_q])
class Task():
# @n_states: number of non-terminal states
# @b: branch
# Each episode starts with state 0, and state n_states is a terminal state
"""
作者没有在一个具体的环境中迭代,而是抽象了一个环境:
- 有 n_states 个状态
- 每个 状态-动作 转移到下一个状态,这个对应表由 randint 产生
- reward 也由 N~(0,1) 产生
- 注意是环境是固定的
"""
def __init__(self, n_states, b):
self.n_states = n_states
self.b = b
# transition matrix, each state-action pair leads to b possible states
self.transition = np.random.randint(n_states, size=(n_states, len(ACTIONS), b))
# it is not clear how to set the reward, I use a unit normal distribution here
# reward is determined by (s, a, s')
self.reward = np.random.randn(n_states, len(ACTIONS), b)
def step(self, state, action):
if np.random.rand() < TERMINATION_PROB:
return self.n_states, 0
next = np.random.randint(self.b)
return self.transition[state, action, next], self.reward[state, action, next]
# Evaluate the value of the start state for the greedy policy
# derived from @q under the MDP @task
def evaluate_pi(q, task):
# use Monte Carlo method to estimate the state value
runs = 1000
returns = []
for r in range(runs):
rewards = 0
state = 0
while state < task.n_states:
action = argmax(q[state])
state, r = task.step(state, action)
rewards += r
returns.append(rewards)
return np.mean(returns)
# perform expected update from a uniform state-action distribution of the MDP @task
# evaluate the learned q value every @eval_interval steps
def uniform(task, eval_interval):
performance = []
q = np.zeros((task.n_states, 2))
for step in tqdm(range(MAX_STEPS)):
"""
值得学习:
step 是一个 0,..,20000 的自然数列
想通过 step 遍历 (state, action) 所有可能(均匀采样)
使用如下两行方法
"""
state = step // len(ACTIONS) % task.n_states
action = step % len(ACTIONS)
next_states = task.transition[state, action]
q[state, action] = (1 - TERMINATION_PROB) * np.mean(
task.reward[state, action] + np.max(q[next_states, :], axis=1))
if step % eval_interval == 0:
v_pi = evaluate_pi(q, task)
performance.append([step, v_pi])
"""
zip(*performance) 可以理解为 performance 的转置
实际上是 c = zip(a, b) 的逆过程,即将 c 解压为 [a, b]
"""
return zip(*performance)
# perform expected update from an on-policy distribution of the MDP @task
# evaluate the learned q value every @eval_interval steps
def on_policy(task, eval_interval):
performance = []
q = np.zeros((task.n_states, 2))
state = 0
for step in tqdm(range(MAX_STEPS)):
if np.random.rand() < EPSILON:
action = np.random.choice(ACTIONS)
else:
action = argmax(q[state])
next_state, _ = task.step(state, action)
next_states = task.transition[state, action]
q[state, action] = (1 - TERMINATION_PROB) * np.mean(
task.reward[state, action] + np.max(q[next_states, :], axis=1))
if next_state == task.n_states:
"""
如果到达最终状态,从初始状态开始
即开启新的一幕
"""
next_state = 0
state = next_state
"""
评估初始状态价值
"""
if step % eval_interval == 0:
v_pi = evaluate_pi(q, task)
performance.append([step, v_pi])
return zip(*performance)
num_states = [1000, 10000]
branch = [1, 3, 10]
methods = [on_policy, uniform]
# average accross 30 tasks
n_tasks = 30
# number of evaluation points
"""
每根曲线有100个结点
即要评估 MAX_STEPS / x_ticks 次初始状态价值
"""
x_ticks = 100
plt.figure(figsize=(10, 20))
for i, n in enumerate(num_states):
plt.subplot(2, 1, i+1)
for b in branch:
tasks = [Task(n, b) for _ in range(n_tasks)]
for method in methods:
value = []
for task in tasks:
steps, v = method(task, MAX_STEPS / x_ticks)
value.append(v)
value = np.mean(np.asarray(value), axis=0)
plt.plot(steps, value, label='b = %d, %s' % (b, method.__name__))
plt.title('%d states' % (n))
plt.ylabel('value of start state')
plt.legend()
plt.subplot(2, 1, 2)
plt.xlabel('computation time, in expected updates')
plt.show()
100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1335.05it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1262.11it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1371.83it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1348.94it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1364.65it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1365.30it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1373.52it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1358.54it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1377.30it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1354.98it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1387.30it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1359.65it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1362.60it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1371.08it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1321.71it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1380.27it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1358.78it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1362.49it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1367.25it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1333.36it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1413.74it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1378.89it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1403.23it/s] 100%|████████████████████████████████| 20000/20000 [00:13<00:00, 1435.77it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1421.83it/s] 100%|████████████████████████████████| 20000/20000 [00:13<00:00, 1442.90it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1420.87it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1414.48it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1415.36it/s] 100%|████████████████████████████████| 20000/20000 [00:13<00:00, 1437.42it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1294.24it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1246.80it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1351.94it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1247.78it/s] 100%|████████████████████████████████| 20000/20000 [00:13<00:00, 1445.74it/s] 100%|████████████████████████████████| 20000/20000 [00:13<00:00, 1436.69it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1411.07it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1428.38it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1419.01it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1259.30it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1215.63it/s] 100%|████████████████████████████████| 20000/20000 [00:13<00:00, 1442.82it/s] 100%|████████████████████████████████| 20000/20000 [00:13<00:00, 1431.22it/s] 100%|████████████████████████████████| 20000/20000 [00:13<00:00, 1438.86it/s] 100%|████████████████████████████████| 20000/20000 [00:13<00:00, 1435.50it/s] 100%|████████████████████████████████| 20000/20000 [00:13<00:00, 1438.25it/s] 100%|████████████████████████████████| 20000/20000 [00:13<00:00, 1443.10it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1415.60it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1412.20it/s] 100%|████████████████████████████████| 20000/20000 [00:13<00:00, 1448.54it/s] 100%|████████████████████████████████| 20000/20000 [00:13<00:00, 1445.12it/s] 100%|████████████████████████████████| 20000/20000 [00:13<00:00, 1446.74it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1266.88it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1287.25it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1339.90it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1349.48it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1384.85it/s] 100%|████████████████████████████████| 20000/20000 [00:13<00:00, 1442.22it/s] 100%|████████████████████████████████| 20000/20000 [00:13<00:00, 1435.42it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1345.74it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1410.26it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1422.37it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1409.88it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1369.35it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1405.79it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1408.48it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1417.69it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1356.40it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1303.83it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1323.33it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1319.03it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1320.11it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1338.84it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1294.98it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1369.54it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1323.28it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1229.76it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1232.98it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1229.65it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1219.65it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1352.18it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1352.61it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1301.99it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1360.33it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1356.33it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1346.13it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1177.13it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1276.44it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1239.63it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1306.91it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1240.28it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1252.95it/s] 100%|████████████████████████████████| 20000/20000 [00:18<00:00, 1105.38it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1241.33it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1347.02it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1361.05it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1369.02it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1309.73it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1224.01it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1339.65it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1281.00it/s] 100%|████████████████████████████████| 20000/20000 [00:19<00:00, 1050.23it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1300.14it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1326.58it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1333.10it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1352.41it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1335.29it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1341.33it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1349.05it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1332.70it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1354.95it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1356.63it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1349.73it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1351.97it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1356.07it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1312.36it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1360.53it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1355.99it/s] 100%|█████████████████████████████████| 20000/20000 [00:20<00:00, 988.50it/s] 100%|█████████████████████████████████| 20000/20000 [00:31<00:00, 629.81it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1328.42it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1380.90it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1377.01it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1387.40it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1376.82it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1384.91it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1378.84it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1383.63it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1376.26it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1372.22it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1359.65it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1368.46it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1364.73it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1373.62it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1367.25it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1372.32it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1249.20it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1359.03it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1376.63it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1379.85it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1353.57it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1366.41it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1368.00it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1389.94it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1385.29it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1375.45it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1365.57it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1357.20it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1366.84it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1371.36it/s] 100%|████████████████████████████████| 20000/20000 [00:17<00:00, 1150.16it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1362.87it/s] 100%|████████████████████████████████| 20000/20000 [00:19<00:00, 1002.67it/s] 100%|█████████████████████████████████| 20000/20000 [00:23<00:00, 837.01it/s] 100%|█████████████████████████████████| 20000/20000 [00:25<00:00, 798.33it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 904.51it/s] 100%|████████████████████████| 20000/20000 [00:21<00:00, 915.64it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 866.52it/s] 100%|████████████████████████| 20000/20000 [00:21<00:00, 938.39it/s] 100%|████████████████████████| 20000/20000 [00:21<00:00, 925.15it/s] 100%|████████████████████████| 20000/20000 [00:24<00:00, 807.13it/s] 100%|████████████████████████| 20000/20000 [00:25<00:00, 792.62it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 867.08it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 846.28it/s] 100%|█████████████████████████████████| 20000/20000 [00:24<00:00, 804.14it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 864.18it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 852.83it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 854.97it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 879.60it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 883.62it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 867.21it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 880.46it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 880.89it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 893.78it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 881.04it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 847.43it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 876.71it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 900.65it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 896.22it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 895.94it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 889.45it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 871.22it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 838.00it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 861.49it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 871.01it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 873.52it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 859.13it/s] 100%|████████████████████████| 20000/20000 [00:26<00:00, 741.81it/s] 100%|████████████████████████| 20000/20000 [00:21<00:00, 913.57it/s] 100%|████████████████████████| 20000/20000 [00:24<00:00, 825.00it/s] 100%|████████████████████████| 20000/20000 [00:21<00:00, 915.62it/s] 100%|████████████████████████| 20000/20000 [00:21<00:00, 910.65it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 905.94it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 907.05it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 904.91it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 903.55it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 907.85it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 866.93it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 900.27it/s] 100%|████████████████████████| 20000/20000 [00:21<00:00, 912.25it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 884.74it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 843.36it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 850.50it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 857.97it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 865.67it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 851.74it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 871.42it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 861.49it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 863.41it/s] 100%|████████████████████████| 20000/20000 [00:23<00:00, 862.81it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 889.03it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 886.40it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 899.91it/s] 100%|████████████████████████| 20000/20000 [00:21<00:00, 923.67it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 892.67it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 878.15it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 901.04it/s] 100%|████████████████████████| 20000/20000 [00:21<00:00, 917.56it/s] 100%|████████████████████████| 20000/20000 [00:21<00:00, 930.92it/s] 100%|████████████████████████| 20000/20000 [00:21<00:00, 925.96it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 881.19it/s] 100%|████████████████████████| 20000/20000 [00:22<00:00, 904.53it/s] 100%|████████████████████████| 20000/20000 [00:21<00:00, 932.72it/s] 100%|████████████████████████| 20000/20000 [00:21<00:00, 917.30it/s] 100%|████████████████████████| 20000/20000 [00:21<00:00, 918.03it/s] 100%|████████████████████████| 20000/20000 [00:21<00:00, 921.26it/s] 100%|████████████████████████| 20000/20000 [00:21<00:00, 928.68it/s] 100%|████████████████████████| 20000/20000 [00:21<00:00, 926.01it/s] 100%|████████████████████████| 20000/20000 [00:21<00:00, 918.41it/s] 100%|████████████████████████| 20000/20000 [00:26<00:00, 758.11it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1261.38it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1257.58it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1417.00it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1291.57it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1382.24it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1186.93it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1275.89it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1392.76it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1409.09it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1401.16it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1375.68it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1368.98it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1386.63it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1376.16it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1369.40it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1377.68it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1368.55it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1368.72it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1373.90it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1379.15it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1355.42it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1375.41it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1376.16it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1372.40it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1372.40it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1365.95it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1363.81it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1364.72it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1334.58it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1367.53it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1370.47it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1378.06it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1376.25it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1373.06it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1370.89it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1356.65it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1373.71it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1366.88it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1357.95it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1385.86it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1383.09it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1388.07it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1395.02it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1389.43it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1387.30it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1389.71it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1393.18it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1397.74it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1339.57it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1353.32it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1388.36it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1395.63it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1390.56it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1382.52it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1394.64it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1284.65it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1380.99it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1387.40it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1388.26it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1395.09it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1388.87it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1393.60it/s] 100%|████████████████████████████████| 20000/20000 [00:19<00:00, 1039.62it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1225.84it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1417.36it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1373.14it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1349.32it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1313.59it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1320.62it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1296.27it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1322.96it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1253.54it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1328.04it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1266.81it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1419.69it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1425.16it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1359.77it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1271.86it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1282.56it/s] 100%|████████████████████████████████| 20000/20000 [00:13<00:00, 1431.15it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1404.50it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1385.96it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1390.96it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1366.10it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1354.74it/s] 100%|████████████████████████████████| 20000/20000 [00:17<00:00, 1164.97it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1220.85it/s] 100%|████████████████████████████████| 20000/20000 [00:18<00:00, 1083.06it/s] 100%|████████████████████████████████| 20000/20000 [00:14<00:00, 1380.33it/s] 100%|████████████████████████████████| 20000/20000 [00:17<00:00, 1130.77it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1292.77it/s] 100%|████████████████████████████████| 20000/20000 [00:19<00:00, 1027.51it/s] 100%|████████████████████████████████| 20000/20000 [00:17<00:00, 1170.15it/s] 100%|████████████████████████████████| 20000/20000 [00:17<00:00, 1132.15it/s] 100%|████████████████████████████████| 20000/20000 [00:19<00:00, 1031.85it/s] 100%|████████████████████████████████| 20000/20000 [00:17<00:00, 1160.29it/s] 100%|█████████████████████████████████| 20000/20000 [00:21<00:00, 944.04it/s] 100%|████████████████████████████████| 20000/20000 [00:19<00:00, 1039.97it/s] 100%|████████████████████████████████| 20000/20000 [00:18<00:00, 1105.75it/s] 100%|████████████████████████████████| 20000/20000 [00:17<00:00, 1119.56it/s] 100%|████████████████████████████████| 20000/20000 [00:17<00:00, 1155.24it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1214.24it/s] 100%|████████████████████████████████| 20000/20000 [00:17<00:00, 1165.50it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1220.19it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1306.54it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1270.73it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1305.58it/s] 100%|████████████████████████████████| 20000/20000 [00:19<00:00, 1037.79it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1239.29it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1289.46it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1292.30it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1302.57it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1197.28it/s] 100%|████████████████████████████████| 20000/20000 [00:17<00:00, 1127.10it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1200.67it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1260.91it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1283.78it/s] 100%|████████████████████████████████| 20000/20000 [00:17<00:00, 1150.04it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1179.73it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1258.56it/s] 100%|█████████████████████████████████| 20000/20000 [00:21<00:00, 910.84it/s] 100%|█████████████████████████████████| 20000/20000 [00:23<00:00, 839.04it/s] 100%|█████████████████████████████████| 20000/20000 [00:21<00:00, 917.53it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1299.22it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1301.34it/s] 100%|████████████████████████████████| 20000/20000 [00:16<00:00, 1214.88it/s] 100%|█████████████████████████████████| 20000/20000 [00:21<00:00, 916.12it/s] 100%|████████████████████████████████| 20000/20000 [00:17<00:00, 1147.11it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1266.39it/s] 100%|████████████████████████████████| 20000/20000 [00:15<00:00, 1330.42it/s] D:\Anaconda3\lib\site-packages\matplotlib\cbook\deprecation.py:107: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance. warnings.warn(message, mplDeprecation, stacklevel=1)