張鵬海, 畢 璐, 劉 斌, 旺堆次仁
(1.西藏民族大學(xué)院體育學(xué)院, 陜西 咸陽 712082; 2.陜西科技大學(xué)電氣與信息工程學(xué)院, 陜西 西安 710021; 3.拉薩市北京中學(xué), 拉薩 850000)
運(yùn)動(dòng)員的比賽成績受多方面的因素影響,比如賽場(chǎng)的情況、天氣環(huán)境、比賽期間的飲食、運(yùn)動(dòng)員賽前的心理狀態(tài)等[1],如果遇到這類不確定的問題,除了需要運(yùn)動(dòng)員有良好的適應(yīng)力和應(yīng)變力,能迅速給運(yùn)動(dòng)員提供教練員的知識(shí)經(jīng)驗(yàn)和處理方法則是首要選項(xiàng)。運(yùn)動(dòng)員訓(xùn)練專家系統(tǒng)就是把教練員的處理方案和涉及運(yùn)動(dòng)員選拔和訓(xùn)練的知識(shí)經(jīng)驗(yàn)在計(jì)算機(jī)上建立一個(gè)知識(shí)經(jīng)驗(yàn)數(shù)據(jù)庫,使用Java語言進(jìn)行系統(tǒng)前端用戶界面的開發(fā),使用Prolog邏輯編程語言構(gòu)建輔助訓(xùn)練專家系統(tǒng),該系統(tǒng)在給定環(huán)境模式進(jìn)過簡(jiǎn)潔準(zhǔn)確推理,即可得到待解決問題的專家建議或者訓(xùn)練計(jì)劃安排[2]。
專家系統(tǒng)知識(shí)庫的建立首先需要大量收集運(yùn)動(dòng)員教練時(shí)的比賽和訓(xùn)練經(jīng)驗(yàn),然后把這類文字性知識(shí)經(jīng)驗(yàn)進(jìn)行分類整理,按照邏輯總體分為三個(gè)模塊,每個(gè)模塊根據(jù)教練的經(jīng)驗(yàn)知識(shí)劃分為3-6個(gè)不同方面的考察點(diǎn)[3],最后得到一個(gè)樹狀邏輯結(jié)構(gòu)圖(如圖1),為了保證知識(shí)結(jié)構(gòu)化的細(xì)化和深入,以及知識(shí)經(jīng)驗(yàn)的充實(shí)性,要能判斷每個(gè)模塊的子模塊是否可以再分。最后將總結(jié)好的知識(shí)經(jīng)驗(yàn)存入到計(jì)算機(jī)的數(shù)據(jù)庫中以備調(diào)用[4-5]。
運(yùn)動(dòng)員選拔模塊主要根據(jù)身體形態(tài)和生理機(jī)能的各種指標(biāo)對(duì)運(yùn)動(dòng)員進(jìn)行擇優(yōu)培養(yǎng),達(dá)到最初運(yùn)動(dòng)員就占有一定身體優(yōu)勢(shì)的目的。運(yùn)動(dòng)員訓(xùn)練計(jì)劃安排模塊是知識(shí)介紹性的模塊,根據(jù)運(yùn)動(dòng)員的生理機(jī)能指標(biāo),專家系統(tǒng)就會(huì)給出詳細(xì)而準(zhǔn)確的訓(xùn)練計(jì)劃安排,將運(yùn)動(dòng)員的身體機(jī)能指標(biāo)訓(xùn)練到最佳狀態(tài)。訓(xùn)練和比賽中的故障排除的主要任務(wù)是根據(jù)訓(xùn)練和比賽過程中可能出現(xiàn)的特殊狀況給出解決方案,比如賽場(chǎng)的情況、天氣環(huán)境、比賽期間的飲食、運(yùn)動(dòng)員賽前的心理狀態(tài)等[6]。
以知識(shí)庫的第三個(gè)模塊-訓(xùn)練和比賽中的故障排除為例,使用判斷樹來描述這個(gè)功能模塊的處理過程,其基本思路是:從問題出發(fā),列出所有可能影響訓(xùn)練和比賽的因素,主要通過用戶來選擇產(chǎn)生問題的原因,然后顯示出專家給出的解決方案。這種方法直觀、方便的表現(xiàn)出了知識(shí)庫的邏輯[7]。
圖1 運(yùn)動(dòng)員訓(xùn)練專家系統(tǒng)樹狀邏輯結(jié)構(gòu)圖
判斷樹是一種自頂向下的判斷方法。通常判斷樹這種樹形結(jié)構(gòu)有三種不同的樹枝節(jié):①?zèng)Q策結(jié)點(diǎn):主要作用就是判斷決策的走向,本系統(tǒng)在運(yùn)動(dòng)員選拔模塊所用的是二叉判斷樹,因此只有兩種決策分支。②狀態(tài)結(jié)點(diǎn):每個(gè)結(jié)點(diǎn)代表一種解決方案,通過對(duì)各個(gè)狀態(tài)結(jié)點(diǎn)的對(duì)比選擇出所屬問題的最佳解決方案。③結(jié)果結(jié)點(diǎn):也就是決策樹從根結(jié)點(diǎn)延伸到最后的葉子結(jié)點(diǎn),也叫決策結(jié)果,這個(gè)結(jié)點(diǎn)可以清楚的看出該模型有多少個(gè)類別[8],存儲(chǔ)的內(nèi)容是專家提供的解決方案或運(yùn)動(dòng)員訓(xùn)練計(jì)劃。按照判斷樹的這種層次結(jié)構(gòu)模型建立了如圖2所示的“運(yùn)動(dòng)員選拔”判斷樹。
通常使用判斷樹進(jìn)行推理時(shí),主要是通過用戶交互界面向用戶提問來收集信息,然后根據(jù)用戶點(diǎn)擊的答案按鈕確定判斷樹的分支,這樣隨著分支的深入,直到葉子結(jié)點(diǎn)止,也就是專家系統(tǒng)給出的最終解決方案或建議。在用戶界面中,使用單選按鈕為用戶選擇答案提供顯示,并用文本框控件來顯示最后的解決方案或運(yùn)動(dòng)員訓(xùn)練計(jì)劃。充分使用Prolog程序的搜索和匹配功能,對(duì)所建立的知識(shí)庫進(jìn)行動(dòng)態(tài)加載,結(jié)合Java語言生成選擇按鈕和顯示最后的解決方案或運(yùn)動(dòng)員訓(xùn)練計(jì)劃[9]。
圖2 判斷樹的一個(gè)分支
在判斷樹中,不但要記錄每個(gè)結(jié)點(diǎn)所存儲(chǔ)的數(shù)據(jù)內(nèi)容,而且還要記錄結(jié)點(diǎn)之間的關(guān)系和結(jié)點(diǎn)之間轉(zhuǎn)移的條件。在結(jié)點(diǎn)中所存儲(chǔ)的數(shù)據(jù)內(nèi)容一般是中文字符串的形式,但是系統(tǒng)使用的Amzi! Prolog編程環(huán)境不支持中文,改進(jìn)方式為使用MySQL數(shù)據(jù)庫來存儲(chǔ)這些結(jié)點(diǎn)中需要顯示的中文字符串和結(jié)點(diǎn)名,需要注意的是每個(gè)結(jié)點(diǎn)命名也必須是英文字符串,將結(jié)點(diǎn)名當(dāng)做事實(shí)語句的參數(shù)和查詢條件來查詢結(jié)點(diǎn)中所存儲(chǔ)的中文字符串[10]。
以下為系統(tǒng)定義的三個(gè)基本事實(shí):
Contain事實(shí):定義為父結(jié)點(diǎn)和子結(jié)點(diǎn)之間的關(guān)系,包含兩種參數(shù),一個(gè)代表父結(jié)點(diǎn),另一個(gè)表示父結(jié)點(diǎn)下的所有子結(jié)點(diǎn),是一個(gè)列表類型。列表中的數(shù)據(jù)具體表現(xiàn)為運(yùn)動(dòng)員的選拔標(biāo)準(zhǔn):“體重超重或不足、身高超高或不足、體重/身高×1000、下肢長/身高×100”擇優(yōu)錄取這四種情況。用Prolog的事實(shí)表示就是:“contain(不達(dá)標(biāo)的原因是什么,[體重超重或不足、身高超高或不足、體重/身高×1000、下肢長/身高×100擇優(yōu)錄取])?!?。
connect事實(shí):定義父結(jié)點(diǎn)與其子結(jié)點(diǎn)間的動(dòng)態(tài)聯(lián)系,包含三個(gè)參數(shù),參數(shù)一表示父結(jié)點(diǎn)本身,參數(shù)二代表用戶的選擇,是用戶自己輸入關(guān)鍵詞或點(diǎn)擊按鈕,參數(shù)三表示在用戶的輸入下會(huì)由父結(jié)點(diǎn)轉(zhuǎn)到的子結(jié)點(diǎn),用Prolog的事實(shí)表示就是:“connect(不達(dá)標(biāo)的原因是什么,ans1,體重超重或不足)?!?,具體在運(yùn)動(dòng)員選拔模塊實(shí)現(xiàn)的流程是:如果運(yùn)動(dòng)員的身體形態(tài)不達(dá)標(biāo),系統(tǒng)會(huì)提問“不達(dá)標(biāo)的原因是什么?”,此時(shí)用戶輸入ans1或點(diǎn)擊解決方案按鈕,當(dāng)前結(jié)點(diǎn)會(huì)轉(zhuǎn)到“體重超重或不足”結(jié)點(diǎn)。
end事實(shí):表示最終的葉子結(jié)點(diǎn),用Prolog的事實(shí)表示就是:“end(解決方案1)?!?也就是代表:“解決方案1”是一個(gè)葉子結(jié)點(diǎn)。
該運(yùn)動(dòng)員訓(xùn)練專家系統(tǒng)的程序設(shè)計(jì)使用的是Java語言和Prolog邏輯編程語言混合編程,充分利用了各自語言的優(yōu)點(diǎn)。因Java語言特有的代碼簡(jiǎn)單、平臺(tái)無關(guān)性、解釋性等優(yōu)點(diǎn),所以選擇使用Java語言進(jìn)行前端的用戶交互界面程序設(shè)計(jì)[11]。Prolog語言在邏輯推理上具有代碼可讀性強(qiáng)、實(shí)現(xiàn)的推理功能豐富、易移植等優(yōu)點(diǎn),近乎用自然語言的方式描述了各種邏輯推理運(yùn)算,使得程序更簡(jiǎn)單,占用內(nèi)存更小,是開發(fā)專家系統(tǒng)這一人工智能程序的最常用工具,選擇使用Prolog程序設(shè)計(jì)語言進(jìn)行專家系統(tǒng)推理機(jī)制的程序設(shè)計(jì)。將Java和Prolog這兩大開發(fā)語言的優(yōu)勢(shì)充分結(jié)合起來,各顯其能,使程序更嚴(yán)謹(jǐn)整潔,縮短開發(fā)周期,可實(shí)現(xiàn)運(yùn)動(dòng)員訓(xùn)練專家系統(tǒng)的開發(fā)[12]。
Amzi! Prolog不僅為Java(通過Java Servlets)和許多其他工具提供了插件,而且提供了基于規(guī)則的服務(wù)。Amzi! Prolog+邏輯服務(wù)器(Logic Server)可以將基于規(guī)則的組件與Windows和其他應(yīng)用程序集成在一起[13]。集成是通過“邏輯服務(wù)器API(Logic Server API)”實(shí)現(xiàn)的,它可以像訪問數(shù)據(jù)庫一樣輕松地訪問規(guī)則的邏輯庫。其結(jié)果是一個(gè)可管理且行為良好的接口,使得在需要的任何地方都可以運(yùn)用基于規(guī)則的編程。
Amzi!Prolog提供了Java與Prolog程序的編程接口。它包含一個(gè)封裝了Prolog引擎及其API的主要LogicServer類和一個(gè)用于錯(cuò)誤處理的LSException類[14]。它們都包含在一個(gè)Java包中,'amzi.ls',如圖3所示。
圖3 Java package包封裝圖
專家系統(tǒng)給出的內(nèi)容都是判斷樹的結(jié)點(diǎn)中包含的信息,通過Prolog設(shè)計(jì)的基于規(guī)則和事實(shí)的推理程序進(jìn)行搜索匹配,當(dāng)匹配到對(duì)應(yīng)結(jié)點(diǎn)中的內(nèi)容,會(huì)將結(jié)點(diǎn)所包含的內(nèi)容動(dòng)態(tài)加載到Java的窗體中[15]。在專家系統(tǒng)的用戶交互界面中顯示專家提問、解決方案、運(yùn)動(dòng)員訓(xùn)練計(jì)劃等內(nèi)容即是采用了這種模式匹配和動(dòng)態(tài)加載,在充分利用了各自語言的優(yōu)點(diǎn)的基礎(chǔ)上,Prolog程序采用自然語言表達(dá)那些適用于計(jì)算機(jī)規(guī)則的復(fù)雜的不精確的語言,應(yīng)用于基于事實(shí)和推論的知識(shí)庫,用Java程序直接控制用戶界面的顯示(見圖4)。
(1)Java的程序設(shè)計(jì)。
① 新建一個(gè)Java工程。
② 在主窗體中放入JRadioButton控件,用來顯示根結(jié)點(diǎn)內(nèi)容;設(shè)置文本框控件,其內(nèi)容為接收專家知識(shí)提問內(nèi)容;為窗體增加控制進(jìn)程的按鈕,提供進(jìn)行“下一步”的選項(xiàng)。
③ 初始化Prolog程序,加載Prolog生成的.xpl文件,調(diào)用特定的對(duì)象方法初始化Logic Server,初始化邏輯服務(wù)器的函數(shù)是:lsInit,它的定義形式如下:RC lsInit(ENGid cureng, STRptr ininame)。
④ 根據(jù)用戶已經(jīng)選擇的結(jié)點(diǎn)按鈕,獲得當(dāng)前的結(jié)點(diǎn)的名字,使用Java程序進(jìn)行訪問,通過“下一步”、“上一步”或者“返回”按鈕控制程序的進(jìn)程。其中下一步選項(xiàng)的部分代碼及偽代碼如下。
//或者所選的結(jié)點(diǎn)的內(nèi)容
Component[] components = choice.getComponents();
next_node_name = jr.getText();
try {
pro_next_node_name = ls.CallStr(“node(Node,Type,”+next_node_name+“,Answer,_)”);
java_next_node_name = ls.GetStrArg(pro_next_node_name, 1);
node_type = ls.GetStrArg(pro_next_node_name, 2);
//ls.AssertzStr(“current_node(”+current_node_name+“)”);
}
//判斷結(jié)點(diǎn)類型偽代碼
if(node_type == 答案結(jié)點(diǎn))
獲取答案結(jié)點(diǎn)名字,將當(dāng)前結(jié)點(diǎn)設(shè)為答案結(jié)點(diǎn);
答案顯示區(qū)域生成;
從數(shù)據(jù)庫中調(diào)取相應(yīng)答案結(jié)點(diǎn)的內(nèi)容;
else(node_type == 判斷結(jié)點(diǎn))
調(diào)用next規(guī)則,將當(dāng)前結(jié)點(diǎn)設(shè)置為所選結(jié)點(diǎn);
獲取當(dāng)前結(jié)點(diǎn)的子結(jié)點(diǎn)內(nèi)容;
動(dòng)態(tài)生成當(dāng)前結(jié)點(diǎn)選項(xiàng)內(nèi)容;
繼續(xù)選取下一結(jié)點(diǎn)。
圖4 訓(xùn)練知識(shí)節(jié)點(diǎn)界面顯示
(2)Prolog程序設(shè)計(jì)。
Prolog程序主要是動(dòng)態(tài)加載當(dāng)前結(jié)點(diǎn)以及當(dāng)前結(jié)點(diǎn)子結(jié)點(diǎn)的所包含的內(nèi)容,通過兩種Prolog功能可以完成對(duì)列表list的訪問。其中l(wèi)ist是變量通過模式匹配得到當(dāng)前l(fā)ist的內(nèi)容,允許引用列表的第一個(gè)元素和剩余的元素列表符號(hào),其中X被綁定成為列表的第一個(gè)元素,稱為頭部,T被綁定到剩余元素的列表中,稱為尾部。之后通過show_radiolist()遞歸獲得每個(gè)子結(jié)點(diǎn)的內(nèi)容,為之后動(dòng)態(tài)加載選項(xiàng)提供基礎(chǔ)內(nèi)容,具體代碼如下。
list_question(X,[H|T]):-%獲取列表中的內(nèi)容
list_question(X,T). %訪問列表頭部和尾部元素
show_radiolist:- %動(dòng)態(tài)獲得每個(gè)子結(jié)點(diǎn)內(nèi)容模塊
current_node(Node), %加載當(dāng)前結(jié)點(diǎn)
node(Node,_,_,_,List),%訪問當(dāng)前結(jié)點(diǎn)列表中的內(nèi)容
list_question(X,List),%加載當(dāng)前結(jié)點(diǎn)子結(jié)點(diǎn)
node(X,decision,Question,_,_),%獲取子結(jié)點(diǎn)中的內(nèi)容
write(Question), %寫入問題
asserta(store_radio(Question)), %加載列表中第一個(gè)子句到數(shù)據(jù)庫
nl,
fail.
以圖2所示的運(yùn)動(dòng)員選拔模塊為例,詳細(xì)介紹使用判斷樹方法進(jìn)行推理的過程:設(shè)定一個(gè)當(dāng)前結(jié)點(diǎn)的位置,我們選擇s結(jié)點(diǎn)為當(dāng)前結(jié)點(diǎn),此時(shí)專家系統(tǒng)的界面上會(huì)顯示專家提問:“運(yùn)動(dòng)員身體形態(tài)是否達(dá)標(biāo)?”和備選答案“不達(dá)標(biāo)的原因是什么?”、“身體機(jī)能測(cè)評(píng)”,若用戶選擇了“不達(dá)標(biāo)的原因是什么?”,則進(jìn)入下一個(gè)結(jié)點(diǎn)s1。用戶界面又會(huì)顯示結(jié)點(diǎn)s1所對(duì)應(yīng)的信息備選答案“體重超重或不足”、“身高超高或不足”“體重/身高×1000、下肢長/身高×100擇優(yōu)錄取”,這時(shí)s1成為新當(dāng)前結(jié)點(diǎn)。在這個(gè)推理過程中,專家系統(tǒng)掃描到的當(dāng)前結(jié)點(diǎn)信息需要被記住,并且結(jié)點(diǎn)的信息在更新時(shí)需要釋放之前結(jié)點(diǎn)的數(shù)據(jù)內(nèi)容。
Prolog程序在運(yùn)行時(shí)的動(dòng)態(tài)控制表現(xiàn)為:解釋器會(huì)把程序的所有子句存入到系統(tǒng)內(nèi)存中,但是專家系統(tǒng)掃描到的當(dāng)前結(jié)點(diǎn)信息需要被記錄,結(jié)點(diǎn)的信息在更新時(shí)需要釋放之前結(jié)點(diǎn)的數(shù)據(jù)內(nèi)容。本文中會(huì)使用一些謂詞來對(duì)內(nèi)存中的子句進(jìn)行動(dòng)態(tài)控制,主要有:①asserta(X),把第一個(gè)子句載入到動(dòng)態(tài)數(shù)據(jù)庫中;②retract(X),從動(dòng)態(tài)數(shù)據(jù)庫中刪除子句X,此過程完全不可逆。專家系統(tǒng)對(duì)父結(jié)點(diǎn)訪問結(jié)束后需要訪問其子結(jié)點(diǎn)時(shí),將執(zhí)行如下代碼:
next:-
retract(current_node(_)),%刪除當(dāng)前結(jié)點(diǎn)內(nèi)容
next_node(Node),%獲得用戶輸入的結(jié)點(diǎn)
asserta(current_node(Node)),%將下一結(jié)點(diǎn)變?yōu)楫?dāng)前結(jié)點(diǎn)
clear_radio,%刪除上一結(jié)點(diǎn)子結(jié)點(diǎn)內(nèi)容
if_leaf. %判斷是否為答案結(jié)點(diǎn)
專家系統(tǒng)顯示的內(nèi)容存儲(chǔ)在分支結(jié)點(diǎn)和葉子結(jié)點(diǎn)中,next謂詞可使專家系統(tǒng)對(duì)父結(jié)點(diǎn)訪問結(jié)束后轉(zhuǎn)移訪問其子結(jié)點(diǎn),實(shí)現(xiàn)訪問狀態(tài)的改變。如果當(dāng)前結(jié)點(diǎn)到達(dá)了葉子結(jié)點(diǎn),需要進(jìn)行回溯時(shí),需要判斷是否到達(dá)了葉子結(jié)點(diǎn),使用cut謂詞來判斷不同情況,cut謂詞的用法和其他程序開發(fā)語言中if語句的用法一樣。在程序中用“!”來表示。
Prolog語言的查詢依賴與模式匹配,查詢的模板為目標(biāo),如果有某個(gè)事實(shí)與目標(biāo)相匹配,查詢即為成功,否則為查詢失敗,使用截?cái)嘀^詞cut,如果系統(tǒng)的事實(shí)成功匹配到目標(biāo)進(jìn)行回溯時(shí),前面的選擇就會(huì)被釋放,不需要重新考慮,查詢就成功了。如圖5(A)所示帶有cut謂詞的程序?qū)Σ樵兛刂屏鞯挠绊?,每一個(gè)方塊代表一個(gè)目標(biāo),目標(biāo)就是需要查詢的內(nèi)容。當(dāng)目標(biāo)進(jìn)行回溯遇到cut時(shí),控制權(quán)發(fā)生轉(zhuǎn)移,迅速轉(zhuǎn)移給上一級(jí)的目標(biāo),而不是其他目標(biāo),這樣其他目標(biāo)就會(huì)被自動(dòng)篩選掉,縮短查詢時(shí)間。圖5(B)是對(duì)單個(gè)目標(biāo)的端口和控制流程的說明,具體工作流程為:從調(diào)用端口(call)進(jìn)入目標(biāo),如果經(jīng)過目標(biāo)匹配成功,就進(jìn)入退出端口(exit),反之進(jìn)入失敗端口(fail),如果用戶需要重新查詢或者引起回溯,則控制進(jìn)入重試端口(redo),來重新進(jìn)入目標(biāo)。
圖5 (A)cut對(duì)控制流的影響,(B)goal(目標(biāo))的4個(gè)端口及控制流程
If_leaf的第一個(gè)子句表示獲取當(dāng)前的結(jié)點(diǎn)位置,接下來判斷是否到達(dá)了葉子結(jié)點(diǎn),如果到達(dá)葉子結(jié)點(diǎn),則專家系統(tǒng)界面會(huì)顯示解決方案或運(yùn)動(dòng)員的訓(xùn)練計(jì)劃等內(nèi)容。下一步就需要使用cut謂詞執(zhí)行截?cái)嗨阉?,阻止回溯。如果第一個(gè)子句不滿足目標(biāo)條件,則說明未到達(dá)葉子結(jié)點(diǎn),程序會(huì)進(jìn)入到第二個(gè)子句,使用了cut后,還需要滿足第一個(gè)子句在cut之前就被目標(biāo)排除了這一條件,這種情況下Prolog程序才會(huì)考慮第二個(gè)子句是否滿足目標(biāo),從而進(jìn)行搜索匹配流程。具體程序如下:
if_leaf:-
current_node(Node), %獲取當(dāng)前結(jié)點(diǎn)
node(Node,answer,Question,Answer,_), %判斷當(dāng)前結(jié)點(diǎn)是否為葉子結(jié)點(diǎn)
retract(store_answer(_)), %清空答案列表的內(nèi)容
asserta(store_answer(Answer)), %插入答案結(jié)點(diǎn)
!,
fail.
if_leaf:-
current_node(Node), %獲取當(dāng)前結(jié)點(diǎn)
node(Node,decision,Question,_,_), %判斷當(dāng)前結(jié)點(diǎn)是否為分支結(jié)點(diǎn)
nl,
show_radiolist, % 列出子結(jié)點(diǎn)
!,
fail.
本專家系統(tǒng)在大量收集了運(yùn)動(dòng)員教練的知識(shí)經(jīng)驗(yàn)的基礎(chǔ)上構(gòu)建專家系統(tǒng)知識(shí)庫。同時(shí)在輔助訓(xùn)練專家系統(tǒng)中引入判斷樹方案,并采用Prolog和Java混合編程技術(shù)來具體實(shí)現(xiàn),用Prolog語言實(shí)現(xiàn)判斷樹的推理機(jī)制,Java平臺(tái)實(shí)現(xiàn)動(dòng)態(tài)用戶界面的生成,充分發(fā)揮了各自程序設(shè)計(jì)語言的優(yōu)點(diǎn),建立的專家系統(tǒng)占用內(nèi)存小,程序便于修改和擴(kuò)展,結(jié)構(gòu)整潔靈活,經(jīng)試驗(yàn),本系統(tǒng)可以對(duì)提出的問題給出專家建議,達(dá)到了輔助訓(xùn)練運(yùn)動(dòng)員,幫助運(yùn)動(dòng)員在比賽中取得優(yōu)異的成績的目的,收到了滿意的效果。