1 说明

1.0.0.1 第 1 部分:从最佳赛车线计算最佳速度

本笔记本的第 1 部分采用了最佳赛车线,可以使用 Race-Line-Calculation.ipynb ( GitHub ) 生成,并为赛车线上的每个点生成最佳速度
输入:.py 文件,带有包含最佳赛车线的 2D 数组:2 列 (x,y)
输出:带有二维数组的 .py 文件:4 列(x、y、速度、预期时间)。这个数组可以插入到奖励函数中
注:赛车线的最后一个点被删除,因为它与第一个点相同

1.0.0.2 第 2 部分:计算动作空间

本笔记本的第 2 部分采用最佳赛车路线和速度,并使用 K-Means 和高斯噪声注入数据,计算动作空间

%matplotlib inlineimport numpy as np
import pandas as pd
from scipy import stats
import math# Ignore deprecation warnings we have no power over
import warnings
warnings.filterwarnings('ignore')
# Path of the optimal racing line (.npy file)
fpath = "./racelines/reInvent2019_track-1000-4-2019-11-09-113228.npy"# Change manually (this is only so that output files are named correctly)
TRACK_NAME = "reInvent2019_track"racing_track = np.load(fpath)# Convert np array to list and remove last point because it is the same point as the first one
racing_track = racing_track.tolist()[:-1]

2 Part 1 和 Part 2 的辅助函数

# Uses previous and next coords to calculate the radius of the curve
# so you need to pass a list with form [[x1,y1],[x2,y2],[x3,y3]]
# Input 3 coords [[x1,y1],[x2,y2],[x3,y3]]
def circle_radius(coords):# Flatten the list and assign to variables (makes code easier to read later)x1, y1, x2, y2, x3, y3 = [i for sub in coords for i in sub]a = x1*(y2-y3) - y1*(x2-x3) + x2*y3 - x3*y2b = (x1**2+y1**2)*(y3-y2) + (x2**2+y2**2)*(y1-y3) + (x3**2+y3**2)*(y2-y1)c = (x1**2+y1**2)*(x2-x3) + (x2**2+y2**2)*(x3-x1) + (x3**2+y3**2)*(x1-x2)d = (x1**2+y1**2)*(x3*y2-x2*y3) + (x2**2+y2**2) * \(x1*y3-x3*y1) + (x3**2+y3**2)*(x2*y1-x1*y2)# In case a is zero (so radius is infinity)try:r = abs((b**2+c**2-4*a*d) / abs(4*a**2)) ** 0.5except:r = 999return r# Returns indexes of next index and index+lookfront
# We need this to calculate the radius for next track section.
def circle_indexes(mylist, index_car, add_index_1=0, add_index_2=0):list_len = len(mylist)# if index >= list_len:#     raise ValueError("Index out of range in circle_indexes()")# Use modulo to consider that track is cyclicalindex_1 = (index_car + add_index_1) % list_lenindex_2 = (index_car + add_index_2) % list_lenreturn [index_car, index_1, index_2]def optimal_velocity(track, min_speed, max_speed, look_ahead_points):# Calculate the radius for every point of the trackradius = []for i in range(len(track)):indexes = circle_indexes(track, i, add_index_1=-1, add_index_2=1)coords = [track[indexes[0]],track[indexes[1]], track[indexes[2]]]radius.append(circle_radius(coords))# Get the max_velocity for the smallest radius# That value should multiplied by a constant multiplev_min_r = min(radius)**0.5constant_multiple = min_speed / v_min_rprint(f"Constant multiple for optimal speed: {constant_multiple}")if look_ahead_points == 0:# Get the maximal velocity from radiusmax_velocity = [(constant_multiple * i**0.5) for i in radius]# Get velocity from max_velocity (cap at MAX_SPEED)velocity = [min(v, max_speed) for v in max_velocity]return velocityelse:# Looks at the next n radii of points and takes the minimum# goal: reduce lookahead until car crashes bc no time to breakLOOK_AHEAD_POINTS = look_ahead_pointsradius_lookahead = []for i in range(len(radius)):next_n_radius = []for j in range(LOOK_AHEAD_POINTS+1):index = circle_indexes(mylist=radius, index_car=i, add_index_1=j)[1]next_n_radius.append(radius[index])radius_lookahead.append(min(next_n_radius))max_velocity_lookahead = [(constant_multiple * i**0.5)for i in radius_lookahead]velocity_lookahead = [min(v, max_speed)for v in max_velocity_lookahead]return velocity_lookahead# For each point in racing track, check if left curve (returns boolean)
def is_left_curve(coords):# Flatten the list and assign to variables (makes code easier to read later)x1, y1, x2, y2, x3, y3 = [i for sub in coords for i in sub]return ((x2-x1)*(y3-y1) - (y2-y1)*(x3-x1)) > 0# Calculate the distance between 2 points
def dist_2_points(x1, x2, y1, y2):return abs(abs(x1-x2)**2 + abs(y1-y2)**2)**0.5

3 改变LOOK_AHEAD_POINTS以影响算法向前看多少点(越高,汽车越早开始坏掉)

  • 改变MIN_SPEED和MAX_SPEED适应轨道和模型!
LOOK_AHEAD_POINTS = 1
MIN_SPEED = 1.4
MAX_SPEED = 4# Calculate optimal speed
velocity = optimal_velocity(track=racing_track, min_speed=MIN_SPEED, max_speed=MAX_SPEED, look_ahead_points=LOOK_AHEAD_POINTS)

3.0.0.1

from matplotlib import pyplot as plt
import seaborn as snsx = [i[0] for i in racing_track]
y = [i[1] for i in racing_track]# Without lookahead
velocity_no_lookahead = optimal_velocity(track=racing_track,min_speed=MIN_SPEED, max_speed=MAX_SPEED, look_ahead_points=0)fig, ax = plt.subplots(figsize=(8, 5))
ax = sns.scatterplot(x=x, y=y, hue=velocity_no_lookahead,palette="vlag").set_title("Without lookahead")fig, ax = plt.subplots(figsize=(8, 5))
ax = sns.scatterplot(x=x, y=y, hue=velocity, palette="vlag").set_title(f"With lookahead: {LOOK_AHEAD_POINTS}")

3.0.0.2

distance_to_prev = []
for i in range(len(racing_track)):indexes = circle_indexes(racing_track, i, add_index_1=-1, add_index_2=0)[0:2]coords = [racing_track[indexes[0]],racing_track[indexes[1]]]dist_to_prev = dist_2_points(x1=coords[0][0], x2=coords[1][0], y1=coords[0][1], y2=coords[1][1])distance_to_prev.append(dist_to_prev)time_to_prev = [(distance_to_prev[i]/velocity[i]) for i in range(len(racing_track))]total_time = sum(time_to_prev)
print(f"Total time for track, if racing line and speeds are followed perfectly: {total_time} s")

如果完全遵循赛车路线和速度,赛道总时间:9.211515584763472 s

3.1

# Now we have list with columns (x,y,speed,distance,time)
racing_track_everything = []
for i in range(len(racing_track)):racing_track_everything.append([racing_track[i][0],racing_track[i][1],velocity[i],time_to_prev[i]])
# Round to 5 decimals
racing_track_everything = np.around(racing_track_everything, 5).tolist()
# Write to txt file
with open(f'optimals_newest_{TRACK_NAME}.txt', 'w') as f:f.write("[")for line in racing_track_everything:f.write("%s" % line)if line != racing_track_everything[-1]:f.write(",\n")f.write("]")

4

# Calculate the radius for every point of the racing_track
radius = []
for i in range(len(racing_track)):indexes = circle_indexes(racing_track, i, add_index_1=-1, add_index_2=1) # CHANGE BACK? 1;2coords = [racing_track[indexes[0]],racing_track[indexes[1]], racing_track[indexes[2]]]radius.append(circle_radius(coords))# Calculate curve direction
left_curve = []
for i in range(len(racing_track)):indexes = circle_indexes(racing_track, i, add_index_1=-1, add_index_2=1)coords = [racing_track[indexes[1]],racing_track[indexes[0]], racing_track[indexes[2]]]left_curve.append(is_left_curve(coords))# Calculate radius with + and - for direction (+ is left, - is right)
radius_direction = []
for i in range(len(racing_track)):radius_with_direction = radius[i]if left_curve[i] == False:radius_with_direction *= -1radius_direction.append(radius_with_direction)# Calculate steering with + and -
dist_wheels_front_back = 0.165 # meters
steering = []
for i in range(len(racing_track)):steer = math.degrees(math.asin(dist_wheels_front_back/radius_direction[i]))steering.append(steer)# Merge relevant lists into dataframe
all_actions = pd.DataFrame({"velocity":velocity,"steering":steering})
min(radius)
# Visualize action space
ax = sns.scatterplot(data=all_actions, x="steering", y="velocity")
ax.invert_xaxis()
ax.set_title(f"With lookahead: {LOOK_AHEAD_POINTS}")

可视化空间

4.1 可视化所有动作

# Visualize all actions
plt.figure(figsize=(10, 5))
sns.lineplot(data=all_actions["velocity"], color="r")
ax2 = plt.twinx()
sns.lineplot(data=all_actions["steering"], color="g", ax=ax2)
plt.axhline(0, ls='--', color="g")
a = plt.title("Speed (red), Steering (green; positive=left)")

4.0.0.1

# Steering: Find standard deviation so that probability of >10 degrees steering is 5%
steering_sd = -15 / stats.norm.ppf(0.05)
steering_sd
sns.distplot(np.random.normal(0,steering_sd,10000))

# Velocity: Find standard deviation so that probability of >0.25m/s deviation is 0%
# Note: Here, probability is set to 0%, so no noise regarding velocity
velocity_sd = -0.25 / stats.norm.ppf(0.00)
velocity_sd
sns.distplot(np.random.normal(0,velocity_sd,10000))

all_actions_norm = all_actions.copy()all_actions_norm_len = len(all_actions_norm)
resample_size = 1000# Add gaussian noise to action space
for i in range(all_actions_norm_len):v_true = all_actions_norm.iloc[i]["velocity"]s_true = all_actions_norm.iloc[i]["steering"]v_norm = np.random.normal(loc=v_true, scale=velocity_sd, size=resample_size)s_norm = np.random.normal(loc=s_true, scale=steering_sd, size=resample_size)vs_norm = pd.DataFrame(np.column_stack([v_norm,s_norm]), columns=["velocity","steering"])all_actions_norm = pd.concat([all_actions_norm,vs_norm], axis=0, ignore_index=True)# Take out actions with max speed, so that they are not affected by gaussian noise
# We do this because there are disproportionally many points with max speed, so
# K-Means will focus too much on these
all_actions_norm = all_actions_norm[all_actions_norm["velocity"] < MAX_SPEED]# Add initial actions to action space (to make clustering more focused on initial actions)
add_n_initial_actions = int(resample_size / 8)
add_initial_actions = pd.DataFrame()
for i in range(add_n_initial_actions):add_initial_actions = pd.concat([add_initial_actions,all_actions], axis=0, ignore_index=True)
all_actions_norm = pd.concat([all_actions_norm,add_initial_actions], axis=0, ignore_index=True)# Display actions shape
all_actions_norm.shape
all_actions_norm_less = all_actions_norm.sample(frac=0.01).reset_index(drop=True) # sample bc less compute time
ax = sns.kdeplot(data=all_actions_norm_less["steering"],data2=all_actions_norm_less["velocity"])
ax.invert_xaxis()

X = all_actions_norm# Calculate action space with KMeansfrom sklearn.preprocessing import MinMaxScaler
from sklearn.cluster import MiniBatchKMeans# Rescale data with minmax
minmax_scaler = MinMaxScaler()
X_minmax = pd.DataFrame(minmax_scaler.fit_transform(X), columns=["velocity","steering"])# KMeans
# remove 2 actions from KMeans so that low speed & high steering actions can be manually included
n_clusters = 21-2
model = MiniBatchKMeans(n_clusters=n_clusters).fit(X_minmax)# Centroids (interpretable)
from sklearn.preprocessing import MinMaxScaler
minmax_scaler = MinMaxScaler()
X_minmax_fit = minmax_scaler.fit(X)
X_centroids = pd.DataFrame(X_minmax_fit.inverse_transform(model.cluster_centers_), columns=["velocity","steering"])# Add 2 manual actions
# Reason: When car starts new episode, it does not start on or direction of racing line, so
# it cannot steer enough to get on racing line
manual_actions = pd.DataFrame({"velocity":[MIN_SPEED,MIN_SPEED],"steering":[30,-30]})
X_centroids = pd.concat([X_centroids,manual_actions], ignore_index=True)action_space_e = X_centroids.copy()
ax = sns.scatterplot(data=all_actions, x="steering", y="velocity", alpha=.1)
ax = sns.scatterplot(data=action_space_e, x="steering", y="velocity")
ax.invert_xaxis()

# Output JSON format
action_space_for_json = action_space_e[["steering","velocity"]].copy()action_space_for_json = action_space_for_json.round(4)
action_space_for_json.columns = ["steering_angle","speed"]
action_space_for_json["index"] = action_space_for_json.index
json_text = action_space_for_json.to_json(orient="records", lines=False)action_space_for_json

with open(f'AS21_newest_{TRACK_NAME}.txt', 'w') as f:f.write(json_text)

optimals_newest_reInvent2019_track.txt

[[0.63069, 2.80612, 1.71139, 0.06701],
[0.63367, 2.6908, 1.75437, 0.06576],
[0.64672, 2.57569, 1.76294, 0.06571],
[0.66972, 2.46184, 1.76458, 0.06583],
[0.70252, 2.35023, 1.76247, 0.06601],
[0.74488, 2.24178, 1.76247, 0.06606],
[0.79653, 2.13733, 1.76291, 0.0661],
[0.85714, 2.03762, 1.76981, 0.06593],
[0.92634, 1.94325, 1.78728, 0.06547],
[1.00366, 1.85469, 1.81944, 0.06462],
[1.08862, 1.77223, 1.87047, 0.0633],
[1.18065, 1.69601, 1.94466, 0.06145],
[1.27917, 1.62597, 2.04661, 0.05906],
[1.38351, 1.56189, 2.18166, 0.05613],
[1.49304, 1.50337, 2.35694, 0.05269],
[1.60709, 1.44988, 2.58409, 0.04875],
[1.72504, 1.40077, 2.88608, 0.04427],
[1.8463, 1.3553, 3.31575, 0.03906],
[1.97026, 1.31267, 4.0, 0.03277],
[2.09618, 1.27199, 4.0, 0.03308],
[2.22315, 1.23232, 4.0, 0.03326],
[2.35577, 1.19068, 4.0, 0.03475],
[2.48814, 1.14836, 4.0, 0.03474],
[2.6201, 1.10491, 4.0, 0.03473],
[2.75156, 1.06007, 4.0, 0.03472],
[2.88246, 1.01371, 4.0, 0.03472],
[3.01284, 0.96594, 4.0, 0.03471],
[3.14278, 0.91698, 4.0, 0.03472],
[3.2724, 0.86711, 4.0, 0.03472],
[3.40179, 0.81664, 4.0, 0.03472],
[3.52534, 0.76799, 4.0, 0.0332],
[3.64883, 0.72099, 3.41089, 0.03874],
[3.77225, 0.67658, 3.03142, 0.04327],
[3.89566, 0.63577, 2.77372, 0.04686],
[4.01913, 0.59935, 2.58331, 0.04983],
[4.14273, 0.56803, 2.43691, 0.05233],
[4.26652, 0.5424, 2.3237, 0.0544],
[4.39051, 0.52303, 2.23855, 0.05606],
[4.51466, 0.51041, 2.17893, 0.05727],
[4.6389, 0.50498, 2.14332, 0.05802],
[4.76312, 0.50709, 2.13044, 0.05832],
[4.8872, 0.517, 2.13044, 0.05843],
[5.01096, 0.53487, 2.13882, 0.05846],
[5.13423, 0.56074, 2.16678, 0.05813],
[5.2568, 0.59459, 2.21241, 0.05747],
[5.37847, 0.63625, 2.27363, 0.05656],
[5.49902, 0.68552, 2.34835, 0.05546],
[5.61825, 0.74209, 2.43447, 0.05421],
[5.73595, 0.80562, 2.52998, 0.05287],
[5.85194, 0.87573, 2.63301, 0.05148],
[5.96605, 0.95201, 2.74176, 0.05006],
[6.07813, 1.03404, 2.85456, 0.04866],
[6.18805, 1.1214, 2.9698, 0.04728],
[6.2957, 1.21366, 3.08591, 0.04594],
[6.40099, 1.31043, 3.20128, 0.04467],
[6.50386, 1.41132, 3.31423, 0.04348],
[6.60426, 1.51598, 3.42298, 0.04237],
[6.70214, 1.62407, 3.52558, 0.04136],
[6.79747, 1.73528, 3.61995, 0.04047],
[6.89022, 1.84935, 3.70388, 0.03969],
[6.98037, 1.96604, 3.77507, 0.03906],
[7.06789, 2.08511, 3.83124, 0.03857],
[7.15274, 2.20639, 3.87024, 0.03824],
[7.23487, 2.32968, 3.88964, 0.03809],
[7.31419, 2.45484, 3.86775, 0.03831],
[7.39063, 2.58173, 3.82435, 0.03873],
[7.46407, 2.7102, 3.76008, 0.03935],
[7.53435, 2.84012, 3.67631, 0.04018],
[7.6013, 2.97136, 3.5751, 0.04121],
[7.66469, 3.10378, 3.45901, 0.04244],
[7.72428, 3.23722, 3.33098, 0.04387],
[7.77975, 3.37151, 3.19402, 0.04549],
[7.83077, 3.50645, 3.05116, 0.04728],
[7.87696, 3.6418, 2.90525, 0.04923],
[7.91791, 3.77731, 2.75888, 0.05131],
[7.95317, 3.91265, 2.61443, 0.0535],
[7.98227, 4.04748, 2.47402, 0.05575],
[8.00473, 4.18141, 2.33958, 0.05804],
[8.02008, 4.31398, 2.21289, 0.06031],
[8.02783, 4.44473, 2.09563, 0.0625],
[8.02756, 4.57311, 1.98939, 0.06454],
[8.01887, 4.69859, 1.89569, 0.06635],
[8.00143, 4.82057, 1.81591, 0.06786],
[7.97497, 4.93849, 1.75127, 0.069],
[7.93933, 5.05174, 1.70272, 0.06973],
[7.89443, 5.15975, 1.67087, 0.07001],
[7.84031, 5.26197, 1.65588, 0.06985],
[7.77711, 5.35788, 1.65588, 0.06937],
[7.70509, 5.44702, 1.65737, 0.06915],
[7.6246, 5.52897, 1.67442, 0.0686],
[7.53611, 5.60338, 1.70552, 0.06779],
[7.44017, 5.66995, 1.74864, 0.06678],
[7.33739, 5.72846, 1.80125, 0.06566],
[7.22847, 5.77874, 1.86049, 0.06448],
[7.11414, 5.82067, 1.9233, 0.06332],
[6.99516, 5.8542, 1.98658, 0.06222],
[6.87233, 5.8793, 2.0475, 0.06123],
[6.74642, 5.89599, 2.10368, 0.06038],
[6.61821, 5.90433, 2.15353, 0.05966],
[6.48845, 5.90439, 2.19641, 0.05908],
[6.35786, 5.89627, 2.23276, 0.0586],
[6.22712, 5.88008, 2.26412, 0.05819],
[6.09684, 5.85599, 2.29305, 0.05778],
[5.96758, 5.82417, 2.3229, 0.05731],
[5.83982, 5.78483, 2.35771, 0.0567],
[5.71395, 5.73825, 2.40208, 0.05587],
[5.5903, 5.68472, 2.46121, 0.05475],
[5.46907, 5.62464, 2.5412, 0.05324],
[5.35038, 5.55844, 2.64969, 0.05129],
[5.23424, 5.48663, 2.79713, 0.04882],
[5.12056, 5.40981, 2.99849, 0.04576],
[5.00914, 5.32863, 3.27059, 0.04215],
[4.89973, 5.24377, 3.62244, 0.03822],
[4.79201, 5.15593, 3.97056, 0.035],
[4.68576, 5.06561, 4.0, 0.03486],
[4.58079, 4.97316, 3.94856, 0.03542],
[4.48082, 4.88243, 3.51944, 0.03836],
[4.3796, 4.7942, 3.1665, 0.04241],
[4.27684, 4.70907, 2.90483, 0.04594],
[4.17225, 4.6277, 2.69104, 0.04924],
[4.06554, 4.55072, 2.53358, 0.05193],
[3.95644, 4.47878, 2.42459, 0.0539],
[3.84475, 4.41244, 2.35856, 0.05508],
[3.73031, 4.35216, 2.33246, 0.05545],
[3.61306, 4.29823, 2.33246, 0.05533],
[3.493, 4.25083, 2.34526, 0.05504],
[3.37022, 4.20992, 2.39839, 0.05396],
[3.24488, 4.17531, 2.49653, 0.05209],
[3.11717, 4.14663, 2.65019, 0.04939],
[2.98738, 4.12334, 2.89781, 0.0455],
[2.85585, 4.10467, 3.12469, 0.04252],
[2.72282, 4.09006, 3.39762, 0.03939],
[2.58852, 4.07896, 3.69739, 0.03645],
[2.45315, 4.07089, 3.73147, 0.03634],
[2.31676, 4.0658, 3.3717, 0.04048],
[2.18425, 4.05787, 3.01192, 0.04407],
[2.05357, 4.04652, 2.73912, 0.04789],
[1.92516, 4.03106, 2.47077, 0.05234],
[1.79951, 4.01084, 2.31587, 0.05496],
[1.67722, 3.98511, 2.14251, 0.05833],
[1.55874, 3.95349, 1.99732, 0.0614],
[1.44467, 3.91541, 1.8927, 0.06354],
[1.33565, 3.87043, 1.77514, 0.06644],
[1.23223, 3.8183, 1.69754, 0.06822],
[1.13519, 3.75862, 1.6452, 0.06924],
[1.0452, 3.69128, 1.6136, 0.06966],
[0.96286, 3.61637, 1.6, 0.06958],
[0.88871, 3.53415, 1.6, 0.0692],
[0.82324, 3.44505, 1.60155, 0.06904],
[0.76687, 3.34963, 1.61505, 0.06862],
[0.71994, 3.24861, 1.63698, 0.06804],
[0.68272, 3.14281, 1.6637, 0.06741],
[0.65542, 3.03313, 1.69162, 0.06682],
[0.63816, 2.92055, 1.71139, 0.06655]]

参考

https://github.com/dgnzlz/Capstone_AWS_DeepRacer

https://github.com/cdthompson/deepracer-k1999-race-lines

https://github.com/cdthompson/deepracer-k1999-race-lines/blob/master/racelines/reInvent2019_track-1000-4-2019-11-09-113228.npy

https://github.com/cdthompson/deepracer-k1999-race-lines/blob/master/racelines/reInvent2019_track-1000-4-2019-11-09-113228.py

DeepRacer 根据路线计算Action Space RaceLine_Speed_ActionSpace相关推荐

  1. 【论文阅读】Parametrized Deep Q-Networks Learning: RL with Discrete-Continuous Hybrid Action Space

    [论文阅读-深度强化学习打王者荣耀]Parametrized Deep Q-Networks Learning: Reinforcement Learning with Discrete-Contin ...

  2. 关于AssertionError: You must specify a action space.

    关于AssertionError: You must specify a action space. 解决方法:可能是gym版本过高,尝试将gym版本降低,比如我是将原来的gym==0.26.0降到g ...

  3. 【国内火车运行路线计算与展示】

    在微信小程序中实现了一个功能,可以计算当前国内列车的运行线路,并显示在电子地图当中. 列车路径是按照设计好的算法算出来的,每次调图后会重新计算并更新. 目前总共收录车次约14,000个,线路超过550 ...

  4. Struts2→拦截器、工作原理、拦截器计算Action执行时间、Struts2自带拦截器、拦截器栈

    工作原理 实现拦截器 样例 Struts2自带拦截器 拦截器栈(先进后出) TOKEN防表单重复提交 文字拦截器 AJAX

  5. aws课程_AWS DeepRacer,Reinforcement Learning 101和一门关于AI管治的小课程

    aws课程 Dear readers, hope you are all doing well. I recently participated in an AWS DeepRacer tournam ...

  6. 文献阅读笔记 # Space/Aerial-Assisted Computing Offloading for IoT Applications: A Learning-Based Approach

    这次分享的是一篇 2019 年发表在<IEEE JOURNAL ON SELECTED AREAS IN COMMUNICATIONS>的文章 SCI 1区,通信 Top 期刊,IF=9. ...

  7. 【文献阅读】PS 综述 in Continuous Action Domains: an Overview

    Policy Search in Continuous Action Domains: an Overview Brief 18年综述,这篇太长了,翻到吐血-- 作者是 Oliver Sigaud 法 ...

  8. Oracle如何精确计算row的大小

    第一步:计算整个Block Header的大小         数据块头部所需要的空间大小由以下公式计算:         Space after headers (hsize) = DB_BLOCK ...

  9. AI在出行场景的应用实践:路线规划、ETA、动态事件挖掘…

    简介: 本文是#春招专栏#系列的第1篇,根据高德机器学习研发部负责人damon在AT技术讲坛所分享的<AI在出行领域的应用实践>的内容整理而成. 前言:又到春招季!作为国民级出行服务平台, ...

  10. 1000Blocks | Space Apes smart NFTs (太空猿智能NFTS)

    1000Blocks | Space Apes smart NFTs (太空猿智能NFTS) 什么是 太空猿智能NFTS 官网: https://1000blocks.space/ Play to E ...

最新文章

  1. golang 基础知识4
  2. python gpu加速库比matlab快吗_为什么异步库比此I/O绑定操作的线程慢?
  3. arcball 鼠标 相机转动
  4. JUnit 5 –架构
  5. 大连理工18秋计算机应用基础,大连理工大学网络教育本科计算机应用基础入学考试模拟题...
  6. Android usb 权限广播,android10.0 USB弹窗权限流程解析
  7. linux11g导入10g 怎么改版本,Oracle 11g导入到10g引起的错误
  8. cocos2d-lua 搓牌效果_夏天这样洗澡才叫爽,用它搓一搓,脏东西都出来了
  9. Nutanix推出云基础架构远程管理IT解决方案
  10. c#通过OleDb连接sybase 15.5
  11. Python用format格式化字符串
  12. 如何在电脑上删除磁盘碎片
  13. jsp:param能不能传递变量_变量、作用域与内存
  14. 编写36选7的彩票程序
  15. python将word文档转换为txt
  16. html返回按钮 超链接,ppt超链接返回键
  17. Delphi中使用ReportMachine 6.5中汇总行不进行汇总的设置问题
  18. 数据的存储------计算机中常见数据类型的存储方式(C语言解析)
  19. Floyd最短路径算法
  20. 奖励来了!四川省中央引导地方科技发展资金认定条件范围及申报奖励补贴

热门文章

  1. php获取微信生成签名的时间戳,微信开发中access_token,js_ticket,时间戳,签名工具
  2. Java集合的所有知识点详解,偏通俗易懂,集合笔记
  3. android file hascode,AndroidStudio集成Lombok
  4. linux定时删除文件,Linux下定时删除文件
  5. vivadohlsdsp_FPGA硬件加速学习vivado hls-----------------卷积加速
  6. fluentmigrator连接mysql_如何利用FluentMigrator实现数据库迁移
  7. echart legends换行固定数量显示
  8. vue-router 修改或添加新参数
  9. 杭电多校第一场补题-1002 Balanced Sequence
  10. code review平台Rietveld应用指南