強(qiáng)化學(xué)習(xí) 課件 第5、6章 強(qiáng)化學(xué)習(xí)的實(shí)驗(yàn)環(huán)境與工具、策略梯度法_第1頁(yè)
強(qiáng)化學(xué)習(xí) 課件 第5、6章 強(qiáng)化學(xué)習(xí)的實(shí)驗(yàn)環(huán)境與工具、策略梯度法_第2頁(yè)
強(qiáng)化學(xué)習(xí) 課件 第5、6章 強(qiáng)化學(xué)習(xí)的實(shí)驗(yàn)環(huán)境與工具、策略梯度法_第3頁(yè)
強(qiáng)化學(xué)習(xí) 課件 第5、6章 強(qiáng)化學(xué)習(xí)的實(shí)驗(yàn)環(huán)境與工具、策略梯度法_第4頁(yè)
強(qiáng)化學(xué)習(xí) 課件 第5、6章 強(qiáng)化學(xué)習(xí)的實(shí)驗(yàn)環(huán)境與工具、策略梯度法_第5頁(yè)
已閱讀5頁(yè),還剩83頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第五章

強(qiáng)化學(xué)習(xí)的實(shí)驗(yàn)環(huán)境與工具

目錄實(shí)驗(yàn)環(huán)境Gym實(shí)驗(yàn)工具TensorFlow實(shí)驗(yàn)環(huán)境GymGym簡(jiǎn)介Gym(/)是OpenAI推出的強(qiáng)化學(xué)習(xí)實(shí)驗(yàn)環(huán)境庫(kù):提供了強(qiáng)化學(xué)習(xí)中與智能體(agent)交互的環(huán)境(environment)用于構(gòu)建、評(píng)估和比較強(qiáng)化學(xué)習(xí)算法的工具庫(kù)兼容TensorFlow、Theano、Keras等框架下編寫的程序除了依賴的少量商業(yè)庫(kù)外,整個(gè)項(xiàng)目是開源免費(fèi)的Gym簡(jiǎn)介Gym庫(kù)內(nèi)置了上百種強(qiáng)化學(xué)習(xí)的實(shí)驗(yàn)環(huán)境:經(jīng)典控制環(huán)境簡(jiǎn)單文本環(huán)境算法環(huán)境二維方塊(Box2D)環(huán)境Atari游戲環(huán)境機(jī)械控制環(huán)境……Gym的安裝Gym支持Windows系統(tǒng)、Linux系統(tǒng)和macOS系統(tǒng)在Anaconda3環(huán)境里安裝Gym庫(kù)(要求Python版本為3.5+)安裝Gym庫(kù)(安裝版本為0.15.3):pipinstallgym==0.15.3……Gym中的環(huán)境查看Gym庫(kù)里包含的環(huán)境fromgymimportenvsenv_spaces=envs.registry.all()env_ids=

[env_space.idforenv_spaceinenv_spaces]print(env_ids)Gym庫(kù)里的環(huán)境每一個(gè)環(huán)境都有一個(gè)形如“xxxxx_vd”的ID,如“CartPole-v0”、“LunarLander-v2”等,ID中包含名稱和版本號(hào)懸崖尋路問(wèn)題(CliffWalking)目標(biāo)是從起點(diǎn)移動(dòng)到終點(diǎn)可以采取上、下、左、右四種動(dòng)作進(jìn)行移動(dòng)到達(dá)除懸崖以外的方格獎(jiǎng)勵(lì)為-1到達(dá)懸崖獎(jiǎng)勵(lì)為-100并返回起點(diǎn)離開方格的動(dòng)作會(huì)保持當(dāng)前狀態(tài)不動(dòng)并獎(jiǎng)勵(lì)-1加載環(huán)境importgym#加載CliffWalking-v0環(huán)境env=gym.make('CliffWalking-v0’)#以圖形化的方式顯示當(dāng)前的環(huán)境狀態(tài)env.render()使用make()函數(shù)加載gym庫(kù)中的”懸崖尋路”環(huán)境如果需要加載其它環(huán)境,只需將make函數(shù)中的參數(shù)換成其它環(huán)境的ID即可加載環(huán)境”懸崖尋路“問(wèn)題的環(huán)境描述起點(diǎn)

終點(diǎn)

懸崖

獎(jiǎng)勵(lì)描述

狀態(tài)空間和動(dòng)作空間每個(gè)環(huán)境都定義了自己的狀態(tài)空間和動(dòng)作空間加載環(huán)境之后使用環(huán)境的observation_space屬性查看狀態(tài)空間,使用環(huán)境的action_space屬性查看動(dòng)作空間#查看環(huán)境的觀測(cè)空間print(‘狀態(tài)空間:',env.observation_space)#查看環(huán)境的動(dòng)作空間print('動(dòng)作空間:',env.action_space)輸出觀測(cè)空間和動(dòng)作空間觀測(cè)空間和動(dòng)作空間即可以是離散空間(取值是有限個(gè)離散的值)也可以是連續(xù)空間(取值是連續(xù)的)離散空間一般用Discrete()表示,連續(xù)空間一般用Box()表示例如“CliffWalking-v0“環(huán)境的觀測(cè)空間是Discrete(48),表示該環(huán)境有48個(gè)狀態(tài),動(dòng)作空間是Discrete(4),表示該環(huán)境有4個(gè)動(dòng)作智能體有48個(gè)狀態(tài),在每個(gè)狀態(tài),智能體有上下左右四個(gè)動(dòng)作可以選擇環(huán)境對(duì)象的step()函數(shù)環(huán)境對(duì)象的step()函數(shù)接收智能體的動(dòng)作并返回以下四個(gè)參數(shù):observations:代表對(duì)特定環(huán)境的觀測(cè)值reward:執(zhí)行當(dāng)前行動(dòng)所獲得的獎(jiǎng)勵(lì)值done:布爾型變量,表示該回合是否完成了任務(wù)info:其它信息,例如狀態(tài)間的轉(zhuǎn)移概率每個(gè)時(shí)間步,智能體都會(huì)選擇一個(gè)動(dòng)作,然后返回結(jié)果和獎(jiǎng)勵(lì)值環(huán)境對(duì)象的step()函數(shù)fortinrange(10):

#在動(dòng)作空間中隨機(jī)選擇一個(gè)動(dòng)作action=env.action_space.sample()

#執(zhí)行一個(gè)動(dòng)作observation,reward,done,info=env.step(action)

print("action:{},observation:{},reward:{},done:{},info:{}".format(action,observation,reward,done,info))Gym中常用函數(shù)使用make()函數(shù)加載環(huán)境對(duì)象使用reset()函數(shù)重置環(huán)境對(duì)象使用render()函數(shù)以圖形化的方式顯示當(dāng)前的環(huán)境狀態(tài)使用action_space.sample()函數(shù)從環(huán)境的動(dòng)作空間隨機(jī)選擇一個(gè)動(dòng)作使用step()函數(shù)使智能體執(zhí)行一個(gè)動(dòng)作使用close()函數(shù)關(guān)閉環(huán)境Sarsa算法流程回顧

使用Sarsa尋找最佳策略設(shè)置算法參數(shù)以及初始化Q表importnumpyasnp##學(xué)習(xí)率設(shè)置alpha=

0.8##折扣因子設(shè)置gamma=

0.95##迭代輪數(shù)num_episodes=

600##創(chuàng)建一個(gè)48行4列的空的Q表q_table=np.zeros([env.observation_space.n,env.action_space.n])使用Sarsa尋找最佳策略

def

epsilon_greedy(state,epsilon):

##探索

ifnp.random.uniform(0,

1)

<epsilon:

returnenv.action_space.sample()

##利用

else:

returnnp.argmax(q_table[state,:])使用Sarsa尋找最佳策略

使用Sarsa尋找最佳策略

##進(jìn)行循環(huán)

while

True:

##在狀態(tài)下執(zhí)行動(dòng)作,返回獎(jiǎng)勵(lì)和下一狀態(tài)next_state,reward,done,_=env.step(action)

##根據(jù)??-greedy選擇下一動(dòng)作next_action=epsilon_greedy(next_state,

0.1)

##更新Q值q_table[state,action]

+=alpha*

(reward+gamma*q_table[next_state,next_action]

-q_table[state,action])

##更新當(dāng)前狀態(tài)和行為state=next_stateaction=next_action

##若達(dá)到終止?fàn)顟B(tài),結(jié)束循環(huán)

ifdone:

break使用Sarsa尋找最佳策略迭代完成后,根據(jù)Q表找出最佳策略best_route_value=

[]##初始化狀態(tài)next_state=env.reset()

best_route_value.append(next_state)while

True:

action=np.argmax(q_table[next_state,

:])next_state,_,done,_=env.step(action)

best_route_value.append(next_state)

ifdone:

breakbest_route_value[36,24,12,0,1,2,3,4,5,6,7,8,9,10,11,23,35,47]Q-learning算法流程回顧

使用Q-learning尋找最佳策略設(shè)置算法參數(shù)以及初始化Q表importnumpyasnp##學(xué)習(xí)率設(shè)置alpha=

0.8##折扣因子設(shè)置gamma=

0.95##迭代輪數(shù)num_episodes=

600##創(chuàng)建一個(gè)48行4列的空的Q表q_table_learning=np.zeros([env.observation_space.n,env.action_space.n])使用Q-learning尋找最佳策略

def

epsilon_greedy(state,epsilon):

##探索

ifnp.random.uniform(0,

1)

<epsilon:

returnenv.action_space.sample()

##利用

else:

returnnp.argmax(q_table_learning[state,:])使用Q-learning尋找最佳策略進(jìn)行迭代,首先初始化狀態(tài)##進(jìn)行迭代foriinrange(num_episodes):

##初始化狀態(tài)state=env.reset()

使用Q-learning尋找最佳策略

##進(jìn)行循環(huán)

while

True:

##根據(jù)??-greedy選擇動(dòng)作action=epsilon_greedy(state,

0.5)

##在狀態(tài)下執(zhí)行動(dòng)作,返回獎(jiǎng)勵(lì)和下一狀態(tài)next_state,reward,done,_=env.step(action)

##更新Q值q_table_learning[state,action]

+=alpha*

(reward+gamma*max(q_table_learning[next_state])

-q_table_learning[state,action])

##更新當(dāng)前狀態(tài)state=next_state

##若達(dá)到終止?fàn)顟B(tài),結(jié)束循環(huán)

ifdone:

break使用Q-learning尋找最佳策略迭代完成后,根據(jù)Q表找出最佳策略best_route_value_learning=

[]##初始化狀態(tài)next_state=env.reset()

best_route_value_learning.append(next_state)while

True:

action=np.argmax(q_table_learning[next_state,

:])next_state,_,done,_=env.step(action)

best_route_value_learning.append(next_state)

ifdone:

breakbest_route_value_learning[36,24,25,26,27,28,29,30,31,32,33,34,35,47]##初始化環(huán)境s=env.reset()d=

Falsewhiled!=

True:

##每次選擇最優(yōu)動(dòng)作a=np.argmax(Q[s,:])s1,r,d,_=env.step(a)s=s1

##展示每一步的游戲進(jìn)程env.render()…………使用Q-learning尋找最佳策略展示每一步的游戲進(jìn)程Sarsa會(huì)選擇較為安全的路徑;Q-learning會(huì)選擇步數(shù)最少的最優(yōu)路徑整體來(lái)看,Sarsa每輪迭代的累積獎(jiǎng)勵(lì)略高于Q-learning,但算法穩(wěn)定性不如Q-learningSarsa和Q-learning的對(duì)比SarsaQ-learning實(shí)驗(yàn)工具TensorFlowTensorFlow簡(jiǎn)介TensorFlow是一個(gè)運(yùn)用數(shù)據(jù)流圖進(jìn)行數(shù)值計(jì)算的開源軟件庫(kù):靈活的架構(gòu)可以在多種平臺(tái)上展開計(jì)算用于構(gòu)建強(qiáng)化學(xué)習(xí)算法中機(jī)器學(xué)習(xí)或深度學(xué)習(xí)模型的構(gòu)建、訓(xùn)練和調(diào)試官方網(wǎng)站:/中文社區(qū):/張量(Tensor)張量是一個(gè)數(shù)據(jù)容器0維張量:標(biāo)量1維張量:向量2維張量:矩陣3維張量:彩色圖像……數(shù)據(jù)流圖數(shù)據(jù)流圖又稱為計(jì)算圖,是TensorFlow的基本計(jì)算框架,用于定義深度學(xué)習(xí)的網(wǎng)絡(luò)結(jié)構(gòu)TensorFlow中的基本數(shù)據(jù)流圖為靜態(tài)圖,即一旦創(chuàng)建不支持動(dòng)態(tài)修改TensorFlow中亦引入了動(dòng)態(tài)圖機(jī)制(Eager)數(shù)據(jù)流圖圖中包含一些操作(Operation)對(duì)象,稱為計(jì)算節(jié)點(diǎn)Tensor對(duì)象則是表示在不同的操作間的數(shù)據(jù)節(jié)點(diǎn)在定義圖的時(shí)候定義不同的名稱域并在其中定義變量和Operation,方便后續(xù)查找常量、變量常量:數(shù)值不能改變的Tensor,一旦被賦值,就不能改變使用tf.constant()函數(shù)創(chuàng)建TensorFlow常量

#創(chuàng)建一個(gè)常量x x=tf.constant(10)變量:數(shù)值可變的Tensor,用于計(jì)算圖中其它操作的輸入使用tf.Variable()函數(shù)創(chuàng)建TensorFlow變量#定義一個(gè)服從正態(tài)分布的變量賦給w,并將其命名為weightw=tf.Variable(tf.random_normal([3,2],stddev=

0.1),name=‘weight’)變量范圍在復(fù)雜的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)中,層與層之間的連接、節(jié)點(diǎn)與節(jié)點(diǎn)之間的連接會(huì)存在許多的變量或操作,會(huì)導(dǎo)致變量出現(xiàn)混亂不清使用_scope()或tf.variable_scope()設(shè)置變量范圍,可以降低復(fù)雜性,通過(guò)將相關(guān)層的變量或操作集中在一個(gè)范圍內(nèi)有助于更好的理解模型importtensorflowastf#重置計(jì)算圖tf.reset_default_graph()withtf.name_scope("layer1"):a=tf.constant(1,name=

'a')

print(a.name)

withtf.name_scope("layer1-1"):b=tf.constant(2,name=

'b')

print(b.name)輸出變量范圍使用tf.variable_scope()設(shè)置變量范圍importtensorflowastf#重置計(jì)算圖tf.reset_default_graph()withtf.variable_scope("layer1"):a=tf.Variable(1,name="a")

print(a.name)

withtf.variable_scope("layer1-1"):b=tf.Variable(2,name="b")

print(b.name)輸出占位符占位符是只定義類型和維度但不賦值的Tensor使用tf.placeholder()函數(shù)創(chuàng)建TensorFlow占位符#創(chuàng)建一個(gè)維度為3x2,類型為float類型的占位符y=tf.placeholder(shape=[3,2],dtype="float")占位符有一個(gè)shape參數(shù),用于指定數(shù)據(jù)的維度,如果shape設(shè)置為None,則在運(yùn)行時(shí)可以輸入任意維度的數(shù)據(jù)激活函數(shù)、損失函數(shù)

優(yōu)化器不同的優(yōu)化算法是TensorFlow計(jì)算圖中解決優(yōu)化問(wèn)題的一個(gè)Operation,需要在會(huì)話中運(yùn)行常用的優(yōu)化器:tf.train.GradientDescentOptimizertf.train.MomentumOptimizertf.train.RMSPropOptimizertf.train.AdamOptimizertf.train.AdadeltaOptimizertf.train.AdagradOptimizer……會(huì)話執(zhí)行數(shù)據(jù)流圖中的操作需要使用TensorFlow會(huì)話使用tf.Session()函數(shù)創(chuàng)建一個(gè)會(huì)話importtensorflowastf#常見(jiàn)一個(gè)常量a和常量ba=tf.constant(3)b=tf.constant(5)#定義一個(gè)加法計(jì)算c=tf.add(a,b)#創(chuàng)建一個(gè)會(huì)話sess=tf.Session()#執(zhí)行定義的操作sess.run(c)#關(guān)閉會(huì)話sess.close()構(gòu)建計(jì)算圖創(chuàng)建session利用傳進(jìn)的數(shù)據(jù)進(jìn)行計(jì)算TensorBoardTensorBoard是TensorFlow的可視化工具,用于可視化計(jì)算圖通過(guò)將TensorFlow程序輸出的日志文件的信息可視化使得程序的理解、調(diào)試和優(yōu)化更加簡(jiǎn)單高效使用的三個(gè)步驟:定義FileWriter對(duì)象將需要可視化的graph或數(shù)據(jù)添加到FileWriter對(duì)象中啟動(dòng)TensorBoard服務(wù)端程序,在前端查看訓(xùn)練過(guò)程狀態(tài)官方文檔:/tensorflow/tensorboardTensorBoardimporttensorflowastf#重置計(jì)算圖tf.reset_default_graph()#定義常量a、b和加法操作a=tf.constant(3,name=

'a')b=tf.constant(5,name=

'b')c=tf.add(a,b,name=

'add1')#定義常量d、e和加法操作d=tf.constant(2,name=

'd')e=tf.constant(4,name=

'e')f=tf.add(d,e,name=

'add2')#定義乘法操作g=tf.multiply(c,f,name=

'mul')#創(chuàng)建會(huì)話withtf.Session()

assess:

#將構(gòu)建的計(jì)算圖寫入到文件中writer=tf.summary.FileWriter("output",sess.graph)

print(sess.run(g))writer.close()在終端中找到工作目錄,然后啟動(dòng)TensorBoard可視化的計(jì)算圖importtensorflowastf#重置計(jì)算圖tf.reset_default_graph()withtf.name_scope("part1"):

#定義常量a、b和加法操作a=tf.constant(3,name=

'a')b=tf.constant(5,name=

'b')c=tf.add(a,b,name=

'add1')withtf.name_scope("part2"):

#定義常量d、e和加法操作d=tf.constant(2,name=

'd')e=tf.constant(4,name=

'e')f=tf.add(d,e,name=

'add2')withtf.name_scope("Result"):

#定義乘法操作g=tf.multiply(c,f,name=

'mul')#創(chuàng)建會(huì)話withtf.Session()

assess:

#將構(gòu)建的計(jì)算圖寫入到文件中writer=tf.summary.FileWriter("output",sess.graph)

print(sess.run(g))writer.close()TensorBoard設(shè)置變量范圍后的可視化計(jì)算圖值函數(shù)近似算法流程回顧

使用值函數(shù)近似尋找最佳策略

使用值函數(shù)近似尋找最佳策略利用TensorFlow構(gòu)建值函數(shù)模型——定義占位符##載入TensorFlow庫(kù)importtensorflowastf#重設(shè)默認(rèn)計(jì)算圖tf.reset_default_graph()##設(shè)置輸入層占位符,表示狀態(tài)inputs=tf.placeholder(shape=[1,

48],dtype=tf.float32)##設(shè)置預(yù)測(cè)Q值的占位符,維度為1×4,表示4種不同動(dòng)作對(duì)應(yīng)的Q值outputs=tf.placeholder(shape=[1,

4],dtype=tf.float32)##設(shè)置目標(biāo)Q值的占位符,維度為1×4target_q=tf.placeholder(shape=[1,

4],dtype=tf.float32)使用值函數(shù)近似尋找最佳策略利用TensorFlow構(gòu)建值函數(shù)模型——構(gòu)建值函數(shù)模型def

value_function_model(x):

##設(shè)置輸出層權(quán)重和偏置

withtf.variable_scope('output',reuse=tf.AUTO_REUSE):w=tf.Variable(tf.truncated_normal([48,

4],

0,

0.1))

##前向傳播

x=tf.matmul(x,w)

returnx##輸出預(yù)測(cè)Q值predict_q=value_function_model(inputs)##根據(jù)Q值,選擇最佳動(dòng)作action_choose=tf.argmax(predict_q,

1)使用值函數(shù)近似尋找最佳策略利用TensorFlow構(gòu)建值函數(shù)模型——定義損失函數(shù)和優(yōu)化方法##設(shè)置損失函數(shù)為MSEloss=tf.reduce_sum(tf.square(target_q-predict_q))##優(yōu)化方法為梯度下降trainer=tf.train.AdamOptimizer(learning_rate=0.1)updateModel=trainer.minimize(loss)使用值函數(shù)近似尋找最佳策略

def

epsilon_greedy(state,episode,num_episodes):

#設(shè)置探索率epsilon=np.linspace(0.1,

0,num_episodes,endpoint=False)

#探索,探索率隨迭代次數(shù)的增加而減少

ifnp.random.uniform(0,

1)

<epsilon[episode]:

returnnp.array([env.action_space.sample()])

#利用

else:

returnsess.run(action_choose,feed_dict={inputs:

np.identity(48)[state:state+1]})使用值函數(shù)近似尋找最佳策略進(jìn)行迭代,初始化變量和狀態(tài)##創(chuàng)建會(huì)話withtf.Session()

assess:

##變量初始化sess.run(tf.global_variables_initializer())

##迭代200次

foriinrange(200):

##初始化環(huán)境s=env.reset()使用值函數(shù)近似尋找最佳策略訓(xùn)練模型,進(jìn)行循環(huán),若循環(huán)次數(shù)達(dá)到99或者到達(dá)終止?fàn)顟B(tài),結(jié)束循環(huán),返回進(jìn)行下一次迭代j=

0whilej<

99:

j+=

1

##計(jì)算當(dāng)前狀態(tài)下的預(yù)測(cè)Q值predict=sess.run(predict_q,feed_dict={inputs:

np.identity(48)[s:s+1]})

##根據(jù)??-greedy選擇動(dòng)作action=epsilon_greedy(s,i,

200)

##獲取獎(jiǎng)勵(lì)和下一狀態(tài)next_s,reward,done,_=env.step(action[0])

##計(jì)算下一狀態(tài)的Q值next_q=sess.run(predict_q,feed_dict={inputs:

np.identity(48)[next_s:next_s+1]})

##初始化當(dāng)前狀態(tài)下的目標(biāo)Q值target=predict

##計(jì)算當(dāng)前狀態(tài)下的目標(biāo)Q值target[0,action[0]]

=reward+gamma*np.max(next_q)

##反向傳播更新參數(shù)_,cost=sess.run([updateModel,loss],feed_dict={inputs:

np.identity(48)[s:s+1],target_q:target})

##更新?tīng)顟B(tài)s=next_s

##若達(dá)到終止?fàn)顟B(tài),結(jié)束循環(huán)

ifdone:

break使用值函數(shù)近似尋找最佳策略根據(jù)訓(xùn)練好的值函數(shù)模型求出最佳策略

[36,24,25,26,27,28,29,30,31,32,33,34,35,47]

##進(jìn)行驗(yàn)證s=env.reset()d=

False

whiled!=

True:

#使用模型預(yù)測(cè)下一步的動(dòng)作

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論