將人工智能應(yīng)用于棋類游戲開(kāi)發(fā)中的一般步驟 1

ef="https://zhuanlan.zhihu.com/write#_Toc6652176">一、摘" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁(yè) > 營(yíng)銷資訊 > 網(wǎng)站運(yùn)營(yíng) > 將人工智能應(yīng)用于棋類游戲開(kāi)發(fā)中的一般步驟

將人工智能應(yīng)用于棋類游戲開(kāi)發(fā)中的一般步驟

時(shí)間:2023-05-26 22:48:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)

時(shí)間:2023-05-26 22:48:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)

將人工智能應(yīng)用于棋類游戲開(kāi)發(fā)中的一般步驟:

Demo:

將人工智能應(yīng)用于棋類游戲開(kāi)發(fā)中的一般步驟

目錄

將人工智能應(yīng)用于棋類游戲開(kāi)發(fā)中的一般步驟 1

ef="https://zhuanlan.zhihu.com/write#_Toc6652176">一、摘要: 1

ef="https://zhuanlan.zhihu.com/write#_Toc6652177">二、三子棋 1

"https://zhuanlan.zhihu.com/write#_Toc6652178">三、游戲界面編寫 2

f="https://zhuanlan.zhihu.com/write#_Toc6652179">四、人工智能 3

f="https://zhuanlan.zhihu.com/write#_Toc6652180">五、機(jī)器學(xué)習(xí) 3

ref="https://zhuanlan.zhihu.com/write#_Toc6652181">1、定義 4

ref="https://zhuanlan.zhihu.com/write#_Toc6652182">2、設(shè)計(jì) 4

2.1、選擇訓(xùn)練經(jīng)驗(yàn) 5

2.2、選擇目標(biāo)函數(shù) 5

2.3、選擇目標(biāo)函數(shù)的表示 6

2.4、選擇函數(shù)逼近算法 12

"https://zhuanlan.zhihu.com/write#_Toc6652187">六、應(yīng)用程序架構(gòu) 12

1.域名:tictactoe.js.org 12

2. 系統(tǒng)類型:純靜態(tài)網(wǎng)站 12

2.1 ReactJs 12

2.2 Ant Design 13

f="https://zhuanlan.zhihu.com/write#_Toc6652192">3. 源代碼 13

3.1 目標(biāo)函數(shù)的表示 13

3.2 檢查棋盤的邊 14

3.3 函數(shù)逼近算法 15

4. CI/CD: 15

七、評(píng)估以及后續(xù)工作: 15

href="https://zhuanlan.zhihu.com/write#_Toc6652198">簡(jiǎn)化 15

href="https://zhuanlan.zhihu.com/write#_Toc6652199">復(fù)雜化 15

href="https://zhuanlan.zhihu.com/write#_Toc6652200">趣味性 15

="https://zhuanlan.zhihu.com/write#_Toc6652201">八、參考文獻(xiàn): 16







一、摘要:

2016 年 3 月,AlphaGo 【1】擊敗世界圍棋冠軍李世石,使得人工智能引起人們的廣泛討論。如今,人工智能創(chuàng)業(yè)潮不斷涌現(xiàn),這個(gè)話題不僅活躍于科技教育界,甚至進(jìn)入了街頭巷尾,成為了人們的日常談資。

各種人工智能框架的出現(xiàn),也大大降低了人工智能編程的門檻。比如 tensorflow 不僅開(kāi)源,還提供了一個(gè)在線訓(xùn)練人工神經(jīng)網(wǎng)絡(luò)的界面:https://playground.tensorflow.org【2、3】。這使得開(kāi)發(fā)人員可以利用各種強(qiáng)大的工具,給自己的應(yīng)用賦能,讓傳統(tǒng)的應(yīng)用程序變得“聰明”。

通過(guò)使用這些工具,開(kāi)發(fā)人員不需要理解人工智能的根本原理,知其然而不知其所以然。即如果需要從 0 開(kāi)始,編寫具有智能特性的程序,往往不知道如何下手。原因是這些框架本身是為了解決實(shí)際的應(yīng)用問(wèn)題而產(chǎn)生,并不是用來(lái)學(xué)習(xí)人工智能的知識(shí)和思想的。

所以本文嘗試通過(guò)一個(gè)實(shí)際的例子(https://tictactoe.js.org/),展示人工智能程序開(kāi)發(fā)的一般步驟。出于演示目的,本文選擇了三子棋(tic-tac-toe)這個(gè)最簡(jiǎn)單的棋類游戲來(lái)舉例。簡(jiǎn)化,也是學(xué)習(xí)根本原理的通用方法,通過(guò)簡(jiǎn)化的問(wèn)題和模型排除不必要的干擾,讓人看清原理。在掌握了原理之后,即可推而廣之,解決更復(fù)雜的問(wèn)題。

本文展示的一般步驟,不僅可以應(yīng)用于棋類游戲開(kāi)發(fā),而且是所有人工智能程序開(kāi)發(fā)的一般步驟。當(dāng)然,復(fù)雜的程序步驟會(huì)更繁雜,但仍然會(huì)以本文列出的一般步驟為主干。

二、三子棋

三子棋,起源于古希臘【4】,也稱為井字棋,或者圈圈叉叉。因?yàn)槠灞P是一個(gè)九宮格,或者說(shuō)像漢字中的“井”字,所以得名井字棋;又因?yàn)橐粋€(gè)玩家通過(guò)打圈,另一個(gè)玩家打叉來(lái)玩這個(gè)游戲,所以得名為圈圈叉叉。本文稱其為三子棋,是因?yàn)樵谶@個(gè)游戲中,當(dāng)玩家的棋子能夠三子成線時(shí),即為獲勝,故名三子棋。







圖 2.1:三子棋盤







圖 2.2:一個(gè) X 方取勝的例子

三子棋是最簡(jiǎn)單的棋類游戲,它只有 765 個(gè)可能局面,26830 個(gè)棋局。如果要實(shí)現(xiàn)一個(gè)人機(jī)對(duì)戰(zhàn)的三子棋游戲,由于棋局的可能性并不多,完全可以使用窮舉法做到。但是這樣做,代碼量并不少,而且對(duì)人類玩家來(lái)說(shuō),由于機(jī)器對(duì)手每次策略都一樣,所以趣味性不高。

本文展示的人工智能程序的編寫,不僅大大縮減了代碼量(因?yàn)椴恍枰鎯?chǔ)取勝策略),而且由于程序的學(xué)習(xí)是一個(gè)動(dòng)態(tài)過(guò)程,對(duì)于人類玩家的同樣的走法,程序可能會(huì)給予不同的回應(yīng),這樣下棋的趣味性更高。

三、游戲界面編寫

游戲界面不涉及人工智能部分,但卻是玩家必須要通過(guò)界面來(lái)與程序交互。本文選擇了網(wǎng)頁(yè)版界面,無(wú)需安裝即可使用,而且便于傳播。

要編寫優(yōu)秀的網(wǎng)頁(yè)界面,有很多優(yōu)秀的開(kāi)發(fā)框架可供選擇。本文采用了 ReactJs【5】,不僅因?yàn)樗悄壳白顑?yōu)秀的前端框架之一,而且它的官方教程恰好提供了一個(gè)詳細(xì)的編寫井字棋游戲的教程【6】。

按照教程編寫出來(lái)的界面是一個(gè)可以運(yùn)行的井字棋游戲,可以由兩人交替走子:https://codepen.io/gaearon/pen/gWWZgR?editors=0010。







圖3.1:按照 ReactJs 官方教程編寫的游戲界面

四、人工智能

據(jù)維基百科【7】解釋,人工智能(英語(yǔ):Artificial Intelligence,縮寫為AI)也稱為機(jī)器智能,指由人制造出來(lái)的機(jī)器所表現(xiàn)出來(lái)有智能。通常人工智能是指通過(guò)普通計(jì)算機(jī)程序來(lái)呈現(xiàn)人類智能的技術(shù)。

本文聚焦在這個(gè)定義的后一段,即通過(guò)編寫一個(gè)普通的計(jì)算機(jī)程序來(lái)呈現(xiàn)人類智能。

人工智能的研究課題非常之多,其中之一是機(jī)器學(xué)習(xí),本文所展示的程序,更精確地說(shuō),是一個(gè)機(jī)器學(xué)習(xí)程序。本文所要展示的程序開(kāi)發(fā)步驟,也即機(jī)器學(xué)習(xí)程序的開(kāi)發(fā)步驟。

五、機(jī)器學(xué)習(xí)

機(jī)器學(xué)習(xí)是人工智能的一個(gè)分支【8】。人工智能的研究歷史有著一條從以“推理”為重點(diǎn),到以“知識(shí)”為重點(diǎn),再到以“學(xué)習(xí)”為重點(diǎn)的自然、清晰的脈絡(luò) 。顯然,機(jī)器學(xué)習(xí)是實(shí)現(xiàn)人工智能的一個(gè)途徑,即以機(jī)器學(xué)習(xí)為手段解決人工智能中的問(wèn)題。

1、定義

通常有以下幾種定義:

一種更精確的教科書式的定義如下:

對(duì)于某類任務(wù) T 和性能度量 P,如果一個(gè)計(jì)算機(jī)程序在 T 上以 P 衡量的性能隨著經(jīng)驗(yàn) E 而自我改善,那么我們稱這個(gè)計(jì)算機(jī)程序在從經(jīng)驗(yàn) E 中學(xué)習(xí)。

比如具體到我們的井字棋游戲,就是:對(duì)于學(xué)習(xí)下井字棋的計(jì)算機(jī)程序,它可以通過(guò)和自己下棋獲取經(jīng)驗(yàn);它的任務(wù)是參與井字棋對(duì)弈;它的性能用它贏棋的能力來(lái)衡量。







圖 5.1:三子棋學(xué)習(xí)問(wèn)題的抽象

2、設(shè)計(jì)

那么如何來(lái)設(shè)計(jì)一個(gè)機(jī)器學(xué)習(xí)系統(tǒng)呢?一般有以下幾個(gè)步驟:







圖 5.2:設(shè)計(jì)學(xué)習(xí)系統(tǒng)的一般步驟

2.1、選擇訓(xùn)練經(jīng)驗(yàn)

本程序選擇了兩種訓(xùn)練經(jīng)驗(yàn):

當(dāng)然,除了以上兩種訓(xùn)練經(jīng)驗(yàn),還可以選擇其他的訓(xùn)練經(jīng)驗(yàn),比如一個(gè)使用固定評(píng)估函數(shù)走子的棋局產(chǎn)生器。

2.2、選擇目標(biāo)函數(shù)

目標(biāo)函數(shù),也就是機(jī)器學(xué)習(xí)程序的評(píng)估函數(shù),對(duì)程序的性能表現(xiàn)進(jìn)行打分。大致地說(shuō),這個(gè)目標(biāo)函數(shù)應(yīng)該對(duì)好的表現(xiàn)打高分,對(duì)差的表現(xiàn)打低分。

具體到本三子棋程序,對(duì)于集合 B 中的任意棋局狀態(tài) b,我們定義如下目標(biāo)函數(shù) V(b):

當(dāng)然,你也可以選擇其他的目標(biāo)函數(shù),比如,如果是最終勝局,令 V(b)=100;如果是負(fù)局,令 V(b)=-100 等。如果是和局,令 V(b)=0 顯然是一個(gè)合適的選擇。那么這里為什么選擇了勝局時(shí),令 V(b)=π/2 呢?

因?yàn)檫@里做了一個(gè)假設(shè):即棋局的表現(xiàn),在達(dá)到終局前,是介于勝局與負(fù)局之間的,如果用一個(gè)連續(xù)函數(shù)來(lái)表示這種趨勢(shì)(向勝局或者向負(fù)局的趨勢(shì)),應(yīng)該是如下圖所示的一個(gè)曲線:







圖 2.2:arctan 函數(shù)圖形(紅色曲線)

這很自然讓人聯(lián)想到 y=arctan(x) 這個(gè)反三角函數(shù),而這個(gè)函數(shù)正好介于 -π/2 與 π/2 之間,故采用它們分別做為負(fù)局和勝局的表現(xiàn)得分,這樣就省去了做函數(shù)變換的麻煩。

2.3、選擇目標(biāo)函數(shù)的表示

有了目標(biāo)函數(shù),如何將它表示出來(lái),即如何將它表示成一系列自變量的函數(shù)形式呢?

首先,目標(biāo)函數(shù)是受棋局的狀態(tài)所影響的,所以自變量肯定是棋局上的狀態(tài)。其次,不同的狀態(tài)對(duì)于目標(biāo)函數(shù)的影響是不同的,即不同的自變量,其權(quán)重不同。

如何找到合適的自變量,以及將目標(biāo)函數(shù)表示成這些自變量的什么函數(shù),沒(méi)有一定的標(biāo)準(zhǔn)。但是一旦確定了這個(gè)目標(biāo)函數(shù)的表示,那么機(jī)器學(xué)習(xí)的過(guò)程,就轉(zhuǎn)化成了一個(gè)函數(shù)調(diào)參的過(guò)程。

通過(guò)改變不同自變量的權(quán)重,將目標(biāo)函數(shù)計(jì)算出來(lái)的值逼近給定的實(shí)驗(yàn)數(shù)據(jù)(即經(jīng)驗(yàn)集合),即是機(jī)器學(xué)習(xí)的過(guò)程。

本學(xué)習(xí)程序把 V(b) 表示成對(duì)一個(gè)線性函數(shù)求反正切值(線性函數(shù)單調(diào),但是無(wú)界。通過(guò)求反正切值,使得這個(gè)函數(shù)值滿足了我們的有界性要求): V(b)=arctan(w0+w1x1+w2x2+w3x3+w4x4+w5x5),其中 w0 到 w5 為數(shù)字系數(shù),或者叫做權(quán),由學(xué)習(xí)算法來(lái)選擇。而 x1 到 x5 為棋盤狀態(tài)值,權(quán) w1 到 w5 決定了不同的棋盤特征的相對(duì)重要性,而權(quán) w0 為一個(gè)附加的棋盤狀態(tài)值常量。

再次強(qiáng)調(diào),自變量的選擇并沒(méi)有一定的標(biāo)準(zhǔn),這里選擇的 5 個(gè)自變量,是經(jīng)過(guò)一些不同的實(shí)驗(yàn)之后,最后總結(jié)出來(lái)的可以達(dá)到很好效果但是數(shù)量又比較少的一個(gè)變量組合。有沒(méi)有可能選擇其他的變量組合來(lái)得到更好的效果,還值得進(jìn)一步探討。

這里的 5 個(gè)變量分別是:

圖 2.3.1: 棋盤上對(duì)我方形成的一個(gè)威脅示意圖

圖 2.3.2: 壞交叉點(diǎn)示意圖

圖 2.3.3:機(jī)會(huì)邊示意圖

圖 2.3.4:占中示意圖

圖 2.3.5:我方贏面機(jī)會(huì)所帶來(lái)的潛在威脅

x1 到 x4 都很簡(jiǎn)單直觀,而 x5 則是高手走法,通過(guò)前面的鋪墊,在某一步,落一子而給對(duì)方造成兩條邊上的威脅。而在下一步中對(duì)方最多只能防一條邊。

回顧:針對(duì)這個(gè)具體的三子棋學(xué)習(xí)任務(wù),我們把它轉(zhuǎn)換成了一個(gè)學(xué)習(xí)目標(biāo)函數(shù)表示中的系數(shù)(或說(shuō)參數(shù))w0 到 w5 的值的問(wèn)題(調(diào)參問(wèn)題)。







圖 2.3.6:?jiǎn)栴}的轉(zhuǎn)換

2.4、選擇函數(shù)逼近算法

這個(gè)過(guò)程也被稱作估計(jì)訓(xùn)練值,就是選擇權(quán)重值的過(guò)程。我們可以從任意的權(quán)重值開(kāi)始,然后不斷調(diào)整權(quán)值,直到找到一個(gè)比較好的權(quán)重值組合。

本程序采用了 LMS 最小均方法,對(duì)于每一個(gè)訓(xùn)練樣例,它能把權(quán)值向減小這個(gè)訓(xùn)練數(shù)據(jù)誤差的方向略為調(diào)整。

詳細(xì)地說(shuō),LMS 權(quán)值更新法則是這樣的【9】:

對(duì)于 每一個(gè)訓(xùn)練樣例<b, Vtrain(b)>

這里是一個(gè)小的常數(shù)(本示例程序采用的值是0.1),用來(lái)調(diào)整權(quán)值更新的幅度。直觀地說(shuō),當(dāng)誤差為0時(shí),權(quán)不會(huì)被改變。當(dāng)為正時(shí)(例如,當(dāng)太低時(shí)),每一個(gè)權(quán)值會(huì)根據(jù)其對(duì)應(yīng)的特征值增加一定的比例。這會(huì)提升的值而減小誤差。注意,如果某個(gè)參數(shù)為0,那么它的值不會(huì)因這個(gè)誤差而改變,這樣就使只有那些在訓(xùn)練樣例的棋局中確實(shí)出現(xiàn)的特征的權(quán)值才被更新。在一定的條件下,這種簡(jiǎn)單的權(quán)值調(diào)整方法被證明可以收斂到值的最小誤差平方逼近。

六、應(yīng)用程序架構(gòu)

1.域名:http://tictactoe.js.org

采用了 http://js.org 的二級(jí)域名 tictactoe,即三子棋的英文名稱。http://Js.org 提供免費(fèi)的二級(jí)域名,尤其樂(lè)意為 js 應(yīng)用提供服務(wù),而本應(yīng)用正好是一個(gè)純 js 應(yīng)用。

2. 系統(tǒng)類型:純靜態(tài)網(wǎng)站

托管在 Github Pages 上。Github Pages 非常適合托管靜態(tài)網(wǎng)站,而且是免費(fèi)的。

2.1 ReactJs

第三章已經(jīng)說(shuō)明,本程序的游戲界面基于 ReactJs 的經(jīng)典教程。ReactJs是一款用來(lái)構(gòu)建用戶界面的優(yōu)秀的JavaScript庫(kù),是由Facebook出品的開(kāi)源框架。

2.2 Ant Design

Ant Design是阿里推出的開(kāi)源React組件庫(kù),包含了豐富的界面交互組件以及優(yōu)美的設(shè)計(jì)風(fēng)格。

3. 源代碼

完整的源代碼托管在 github 上:https://github.com/Jeff-Tian/tic-tac-toe-ai。這里重點(diǎn)介紹一下前面幾章介紹的機(jī)器學(xué)習(xí)的關(guān)鍵步驟代碼:

3.1 目標(biāo)函數(shù)的表示

程序里使用目標(biāo)函數(shù)來(lái)對(duì)棋局打分:

getBoardScore: function (bitmap, weights) {
weights = weights || Strategy.getInitialWeights();

let {lost, win, factors} = Strategy.getBoardStatus(bitmap);

if (lost) {
return {
factors: factors,
namedFactors: Strategy.getNamedStrategy(factors),
total: -Math.PI / 2
}
}

if (win) {
return {
factors: factors,
namedFactors: Strategy.getNamedStrategy(factors),
total: Math.PI / 2
}
}

let score = Math.atan(factors.map((s, i) => s * weights[i]).reduce((prev, next) => prev + next, 0));

return {
factors: factors,
namedFactors: Strategy.getNamedStrategy(factors),
total: score
};
}

求出的分?jǐn)?shù)即 score,注意這個(gè)分?jǐn)?shù)是x1到x5與權(quán)重的加權(quán)和再求arctan,從而讓分?jǐn)?shù)單調(diào)有界。2.3詳細(xì)地說(shuō)明了x1到x5這5個(gè)自變量,在代碼里,將它們放在了一個(gè)factors數(shù)組里。這個(gè)factors 是由getBoardStatus來(lái)計(jì)算的,這里抽象成一個(gè)方法,好處是,如果要換自變量,那么這個(gè)打分的函數(shù)不用改變。如前所述,自變量的挑選,并不是確定的。

3.2 檢查棋盤的邊

上面的代碼中有一個(gè)重要的函數(shù):getBoardStatus,它的核心是去檢查棋盤的邊,得到棋盤的狀態(tài)。在程序里,棋盤被表示成一個(gè)長(zhǎng)度為9的數(shù)組,每個(gè)元素要么是1、要么是0、要么是-1。分別表示當(dāng)前宮格里是我方的棋子,為空以及敵方的棋子。棋盤一共8條邊,檢查棋盤的邊的函數(shù)是這樣的:

function checkSides(bitmap) {
let d = 0;
let dead = 0;
let w = 0;
let c = 0;

for (let i = 0; i < sides.length; i++) {
let side = bitmap.filter((_, j) => sides[i].indexOf(j) >= 0);

let negatives = side.filter(b => b === -1);
let zeros = side.filter(b => b === 0);
let ones = side.filter(b => b === 1);

if (negatives.length === 2 && zeros.length === 1) {
d++;
}

if (negatives.length === 3) {
dead++;
}

if (ones.length === 3) {
w++;
}

if (ones.length === 2 && zeros.length === 1) {
c++;
}
}

return {danger: d, lost: dead, chance: c, win: w};
}

3.3 函數(shù)逼近算法

函數(shù)逼近的過(guò)程,也即學(xué)習(xí)的過(guò)程。這里表現(xiàn)為一個(gè)名字叫l(wèi)earn()的函數(shù)。這個(gè)函數(shù)接收兩個(gè)參數(shù),即上一棋局,以及當(dāng)前棋局。注意之前2.2 提到,函數(shù)逼近算法,是不斷用當(dāng)前的權(quán)值,對(duì)新出現(xiàn)的棋局打分來(lái)估計(jì)前一棋局的分?jǐn)?shù)。所以這個(gè)函數(shù)會(huì)使用同樣的權(quán)重對(duì)前后兩個(gè)棋局打分,并通過(guò)這個(gè)分?jǐn)?shù)的差值,采用LMS方法來(lái)調(diào)整權(quán)重:

learn(lastSquares, currentSquares) {
if (!lastSquares) {
return;
}
let estimatedLastScore = Judger.getBoardScore(lastSquares, this.weights);
let actualScore = Judger.getBoardScore(currentSquares, this.weights);
let diff = actualScore.total - estimatedLastScore.total;

for (let i = 0; i < estimatedLastScore.factors.length; i++) {
this.weights[i] = this.weights[i] + 0.1 * diff * estimatedLastScore.factors[i];
}
}

4. CI/CD:

采用了 Travis CI系統(tǒng),只需要提交代碼,Travis 會(huì)自動(dòng)運(yùn)行測(cè)試、分析代碼。然后發(fā)布至 Github pages。

七、評(píng)估以及后續(xù)工作:

本程序很好地演示了一個(gè)最簡(jiǎn)單的人工智能程序的編寫步驟,不需要任何復(fù)雜的AI框架,可以從0開(kāi)始編寫。不過(guò),仍然存在優(yōu)化的可能性,比如:

簡(jiǎn)化

對(duì)于目標(biāo)函數(shù)的表示,有沒(méi)有更好的或者更簡(jiǎn)潔的表示形式呢?是否可以進(jìn)一步減少自變量的數(shù)量?

復(fù)雜化

除了簡(jiǎn)化,還可以朝另一個(gè)方向發(fā)展,即迭代更復(fù)雜的游戲。比如,擴(kuò)展棋盤,或者擴(kuò)展成五子棋等等。

趣味性

從游戲趣味性上擴(kuò)展,可以考慮增加一個(gè)用戶系統(tǒng),開(kāi)發(fā)出排行榜的功能,讓純靜態(tài)網(wǎng)站變得動(dòng)態(tài)等。

八、參考文獻(xiàn):

【1】https://zh.wikipedia.org/wiki/AlphaGo

【2】https://www.tensorflow.org/

【3】https://playground.tensorflow.org

【4】https://zh.wikipedia.org/wiki/%E4%BA%95%E5%AD%97%E6%A3%8B

【5】https://zh-hans.reactjs.org/

【6】https://zh-hans.reactjs.org/tutorial/tutorial.html

【7】https://zh.m.wikipedia.org/zh-cn/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD

【8】https://zh.m.wikipedia.org/wiki/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0

【9】[美]米歇爾(Mitchell, T. M.).機(jī)器學(xué)習(xí)[M]. 曾華軍等譯.杭州:機(jī)械工業(yè)出版社,2003.

關(guān)鍵詞:游戲,步驟

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉