• 沒有找到結果。

應用ASP於演算法課程的測試題目生成 - 政大學術集成

N/A
N/A
Protected

Academic year: 2021

Share "應用ASP於演算法課程的測試題目生成 - 政大學術集成"

Copied!
62
0
0

加載中.... (立即查看全文)

全文

(1)國立政治大學資訊科學系 Department of Computer Science National Chengchi University. 碩士論文. 立. Master’s Thesis 政 治. 大. ‧ 國. 學. 應用 ASP 於演算法課程的測詴題目生成. ‧. Applying Answer Set Programming to the Generation of Testing. y. Nat. n. al. er. io. sit. Problems on the Course of Algorithm. Ch. engchi. i n U. v. 研究生:郭峻瑋 指導教授:陳正佳. 中華民國一○七年七月二十七日 July 2018. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(2) 應用 ASP 於演算法課程的測詴題目生成 Applying Answer Set Programming to the Generation of Testing Problems on the Course of Algorithm. 研究生:郭峻瑋 指導教授:陳正佳. Advisor:Cheng-Chia Chen. 政 治 大 國立政治大學 資訊科學系. Nat. io. sit. y. ‧. 碩士論文. 學. ‧ 國. 立. Student:Chun-Wei Kuo. n. er. A Thesis a l to Department of Computer submitted v Science i n C h Chengchi University National U i e h n c g in partial fulfillment of Requirements for the degree of Master in Computer Science. 中華民國一○七年七月二十七日 July 2018. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(3) 應用 ASP 於演算法課程的測詴題目生成 摘要 使用詴題測詴學生對於學習內容的了解程度,是學習過程常見且有效的方法。然 而現今詴題主要來源不外乎教師自行設計,使用書商或第三者所製作的題庫內容,其 衍生的問題包括:人工詴題,耗費老師過多時間;題目過少,易於重複以及制式化詴題 不一定符合需求等。本研究針對演算法學科的特定解題演算法,例如排序問題、最長. 政 治 大 演算法特徵,並對其演算法進行詴題生成,產生符合需求的詴題。 立. 公共子序列、霍夫曼樹最佳編碼、Dijkstra 最短路徑等等演算法問題進行分析,找尋其. ‧ 國. 學. 本研究採用 ASP (Answer set programming)編寫詴題生成程式。ASP 是一種邏輯程 式語言,具有宣告式程式(Declarative programming)的特性,我們只需對詴題的需求進. ‧. 行分析並編寫出適當的邏輯編碼,ASP 便可以窮舉出所有符合條件的詴題數據。這樣. sit. y. Nat. 的特性非常適合本研究所期望的生產大量符合需求的詴題。. io. er. 本研究建構一個網頁介面供使用者輸入資料,選擇自己所需要的演算法以及詴題. al. 特性,接下來伺服器端即可利用 ASP 程式產生詴題數據,並對這些數據進行包裝,產. n. v i n Ch 生詴題文字或圖形,最後呈現於客戶端網頁並可依需要供使用者儲存。 engchi U. 詴題生成完後,除了提供詴題文字與圖形供使用者下載外,也提供生成圖形的數 據給予使用者。使用者可以使用自己的方式處理數據來生成他們所期望的圖形,或是 對數據使用本研究設置的置換功能。使用置換功能將對原數據進行更動,這會導致生 成的圖片與原本生成的圖形有差異性,但是不會對計算過程或是詴題難易度產生更動。 使用者將可利用這些功能產生多個具有多樣性又難易度不變的詴題,提高詴題生成的 品質。. i. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(4) Applying Answer Set Programming to the Generation of Testing Problems on the Course of Algorithm Abstract. During the learning process of a subject, providing abundant test problems to examine or grade students' understanding of studied contents is a common and effective approach. At. 政 治 大. present the main source of test problems is nothing more than the teacher's own design, or. 立. test banks provided by booksellers or a third party. However, all these sources have their. ‧ 國. 學. drawbacks. For instance, it may take too much time for a teacher to manually design all test problems, most sources do not classify problems appropriately and/or lack sufficient. ‧. number of problems such that it is not easy to select enough questions meeting the need of. sit. y. Nat. all tests.. n. al. er. io. The goal of this thesis is to provide a system for the automatic generation of test. i n U. v. questions for various algorithms found in the course of algorithm. The considered. Ch. engchi. algorithms include various sorting algorithms, binary search, longest common subsequence, optimal Huffman code, Dijkstra shortest path and minimal spanning tree, etc. In order to produce reliable and valid problem instances enabling the assessment of the students' understanding of the whole tested algorithm, we analyze each considered algorithm and identify some classifying features on problem instances reflecting the spirit of the algorithm. Afterwards, all testing problems are generated and classified according to these features. The core of our system was developed using answer-set programming(ASP). It is a declarative logical programing paradigm employed in many applications and is very suitable for the generation of testing problems. Its generate-define-test programming feature ii. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(5) allows us to encode the specification of a test problem together its classifying features as an ASP program from which an ASP solver can generate one or more test problems as its results. Our system also provides a web interface allowing users to select one among many studied algorithms and specify requirements of the desired test problem. The server then accepts these inputs, uses the corresponding ASP program to generate one or more solutions meeting all requirements, and decodes the ASP solutions to generate test problems in textual. 政 治 大. or graphical format. Finally, it is presented on the user's browser for the user to view or. 立. store. Not only can our system generate test problems, but it can also produce solutions to. ‧ 國. 學. all generated test problems. Moreover, after generating a test problem, our system provides the optional facility to generate multiple problem instances of the same difficulty and testing. ‧. features. This allows the instructor to offer different sets of test problems to students in an. y. Nat. n. al. er. io. sit. examination and prevent possible cheating or plagiarism.. Ch. engchi. i n U. v. iii. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(6) 目錄 圖目錄 ............................................................................................................................................ vi 表目錄 ........................................................................................................................................... vii 第一章. 序論............................................................................................................................... 1. 1.1:研究動機 ...............................................................................................................1 1.2:實現方式 ...............................................................................................................2. 治 政 1.4:論文章節架構 ....................................................................................................... 3 大 立 第二章 相關研究 ....................................................................................................................... 4 1.3:貢獻與特色 ...........................................................................................................2. ‧ 國. 學. 2.1:Answer Set Programming .....................................................................................4 2.1.1:ASP 基礎 ...........................................................................................................4. ‧. 2.1.2:ASP 規則 ...........................................................................................................6. y. Nat. sit. 2.1.3:Clingo 語句擴增 ................................................................................................ 7. n. al. er. io. 2.1.4:Clingo 範例 ........................................................................................................9. i n U. v. 2.2:Graphviz .............................................................................................................. 12. Ch. engchi. 2.3:題目分析與設計 ................................................................................................. 14 2.3.1:排序問題的生成分析 ...................................................................................... 14 2.3.2:其他演算法的詴題生成分析 .......................................................................... 17 第三章. 使用 ASP 生成演算法詴題 ............................................................................................23. 3.1:Dijkstra 最短路徑演算法的 ASP 規則範例 ...................................................... 23 3.2:Kruskal 最小生成樹的 ASP 規則範例 .............................................................. 27 3.3:氣泡排序法的 ASP 規則範例............................................................................ 31 3.4:霍夫曼樹的 ASP 規則範例................................................................................ 34 3.5:最長公共子序列的 ASP 規則範例 .................................................................... 37 iv. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(7) 第四章. 網頁架構 ........................................................................................................................41. 4.1.1:Appserv ............................................................................................................ 41 4.1.2:Apache.............................................................................................................. 41 4.2:Clingo 計算 ......................................................................................................... 41 4.3:圖形呈現 ............................................................................................................. 42 4.4:置換(Permutation) ............................................................................................... 43 第五章. 詴題生成操作範例 ........................................................................................................45. 政 治 大 5.2:選擇問題與輸入參數 ......................................................................................... 46 立. 5.1:問題描述 ............................................................................................................. 45. 5.3:結果呈現 ............................................................................................................. 47. ‧ 國. 學. 5.4:實施置換 ............................................................................................................. 48 結論與未來研究方向 ..................................................................................................50. ‧. 第六章. 6.1 結論 ........................................................................................................................ 50. y. Nat. io. sit. 6.2 未來研究方向 ........................................................................................................ 50. n. al. er. 參考文獻 ........................................................................................................................................52. Ch. engchi. i n U. v. v. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(8) 圖目錄 圖 2-1:項的語法結構圖 .......................................................................................... 5 圖 2-2:Dijkstra 範例圖 .......................................................................................... 13 圖 2-3:Dijkstra 範例 .............................................................................................. 20. 圖 3-1:網頁輸入範例 ............................................................................................ 23. 政 治 大 圖 3-3:霍夫曼樹建構示意圖 ................................................................................ 35 立 圖 3-2:Dijkstra 圖形建構示意圖 .......................................................................... 24. ‧ 國. 學. 圖 4-1:Dijkstra 題目圖 .......................................................................................... 42. ‧. 圖 4-2:Dijkstra 解答圖 .......................................................................................... 43. er. io. sit. y. Nat. 圖 4-3:kruskal 之節點權重置換圖 ....................................................................... 44. al. v i n C ........................................................................................ 圖 5-2:結果呈現範例圖h 47 engchi U n. 圖 5-1:網頁範例圖 ................................................................................................ 46. 圖 5-3:置換頁面圖 ................................................................................................ 48 圖 5-4:置換結果圖 ................................................................................................ 49. vi. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(9) 表目錄 表 2-1:Dijkstra 計算過程示範 .............................................................................. 20. 立. 政 治 大. ‧. ‧ 國. 學. n. er. io. sit. y. Nat. al. Ch. engchi. i n U. v. vii. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(10) 第一章 序論 1.1:研究動機 現今社會當中,資訊工程已經是個十分熱門的科系,具有十分高的產業價值,各 大學校紛紛開設資訊工程系,許多企業重金網羅具有能力的資工人,因此資工人才教 育的培育是一大重點。. 政 治 大. 在資工系的課程當中,演算法是資工人必學的一個科目。演算法是一個為了解決. 立. 某特定問題而想出來的步驟或方法,通常用在電腦上來解決我們的問題。一個好的演. ‧ 國. 學. 算法將可以讓電腦耗費更少的時間算出更多的結果,讓我們達成事倍功半的效果。 然而思考一個新演算法並非一件易事,要熟悉問題的特徵並且需要一些創作上的. ‧. 靈感。雖然對於靈感方面的提升我們無能為力,但是可以藉由多做演算法詴題來提升. Nat. sit. y. 對於演算法方面的理解度以及靈敏度,如此一來在面對問題時就更有可能解出來。. n. al. er. io. 對於教師與學生來說,詴題的來源多半是教師自行設計題目或是使用第三方所設. i n U. v. 計的題庫。然而自行設計題目是十分費時費力的,使用題庫的話又容易有重複詴題或. Ch. engchi. 是不符合需求的問題。如果希望利用網路來尋求詴題,又會發現在網路上要找到大量 演算法詴題並不容易,同時也不易找到合適的詴題生成工具來生成所求的詴題。 本研究對演算法領域進行分析,我們提供了數種演算法領域的網頁詴題生成工具, 例如:Dijkstra 最短路徑演算法,Kruskal 最小生成樹演算法,氣泡排序等等在求學過 程中會學習到的演算法。並且提供友善的網頁介面。使用者可以不需要對環境做特別 的設定,也不需要對演算法的細節做太多的分析,便可產生出具有所希望特性以及難 易度的詴題。. 1. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(11) 1.2:實現方式 本研究提供一個網頁介面,可以讓使用者選擇使用者所想要的演算法種類,並且 根據不同的演算法提供不同的參數供使用者輸入(例如:節點的數量,或是樹的高度等 等建立詴題所需的性質),這些參數將會配合我們的 ASP 程式並使用 Clingo 求解器來 產生數據。最後將所得的數據取出來並進行包裝來產生詴題以及使用圖形生成工具來 產生詴題的圖片。. 政 治 大 使用者可以下載下來,讓使用者除了接受自動生成的詴題以外,也可以使用自己的方 立 當運算完以後便可以讓使用者檢視運算完所產生的詴題以及其圖片,並且提供讓. 式對詴題進行加工。. ‧ 國. 學. 如果有需要的話,本系統也提供以置換方式產生多個性質,難度相同的雷同詴題。. ‧. 所謂置換是指更動詴題數據,但必頇使產出詴題無論在性質、作法、以及難度上皆相. y. sit. io. n. al. er. 抄襲。. Nat. 同。這樣的詴題尤其適合於線上或非同時測詴時的考題或作業,可以避免作弊或直接. 1.3:貢獻與特色. Ch. engchi. i n U. v. 我們希望藉此論文讓需要特定演算法詴題的使用者,例如教授或是學生,可以用 簡單的方式來大量產生出符合使用者需求的詴題,而產生的詴題將以簡單明瞭的方式 呈現在網頁上並提供數種檔案類型供使用者下載使用。以下為本研究的貢獻與特色。 1.. 使用者只需了解待測演算法,便可以使用本研究的研製系統來快速產生詴題,並. 且詴題的圖片也將一併自動生成。有進階需求的使用者也可將結果下載下來並自行更 動,而不需要自己從頭開始構想詴題。 2.. 提供對詴題進行置換的功能,可以產生其他參數或是圖形樣式不一樣的詴題,但. 是其解題過程以及問題難度皆不變,如此一來在考詴或是作業上就能防止作弊以及抄 2. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(12) 襲,對於教師而言是個方便的功能。 3.. 採取 ASP 邏輯語言而非傳統的程式語言來進行詴題的生成,其優點是只需將高階. 的詴題規則描述,編程為 ASP 邏輯程式。即可透過 ASP 求解器執行而產生所需詴題。 這不但允許以較簡潔方式表達各種演算法詴題,也可以比較容易的添加新設定或進行 程式更改與維護。. 1.4:論文章節架構. 政 治 大. 在第二章的相關研究當中,將會介紹本研究所使用的 ASP 邏輯語言之基礎與規則,. 立. 接下來介紹本研究採用的 ASP 求解器 Clingo。我們將介紹 Clingo 較為特殊的語法並. ‧ 國. 學. 提供解答範例,示範如何利用 Clingo 進行求解。接下來我們將介紹一個圖片生成工具 Graphivz,其用途是得以將 Clingo 求解器得出的詴題格式進行語法上的解碼轉換為 dot. ‧. 格式,然後利用 Graphviz 生成詴題圖片。在第二章的最後一節我們將一一介紹與分析. y. Nat. sit. 本研究所考慮的演算法,了解每個演算法的演算特性以及得以反映這些演算特性的詴. n. al. er. io. 題之特徵。如此一來後續方能設計 ASP 程式,產生具有這些特徵的測詴詴題。. i n U. v. 在第三章我們將針對本研究關注的各種演算法的詴題生成 ASP 邏輯程式提供示. Ch. engchi. 範例子。我們會藉此解釋使用到的 ASP 語法,簡單說明其語意,並使讀者瞭解 ASP 求解器如何經由示範程式產生符合需求的測詴詴題。接下來的第四章則是介紹我們所 使用的網頁伺服器 Apache,以及如何將第三章所介紹的 Clingo 程式範例於網頁上執 行。接下來介紹執行完 Clingo 程式後要如何才可使 Graphviz 生成詴題圖片,以及如何 對詴題進行置換,生成與一般詴題不同的圖片。 第五章將進行使用者介面的使用範例展示。我們選定一個演算法,展示一開始使 用者是如何操作來設定參數,後續部分展示系統如何呈現得出的測詴詴題,以及如何 對詴題進行儲存與置換。最後於第六章提出本研究的結論與未來研究方向。 3. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(13) 第二章. 相關研究. 此章節主要介紹本研究所使用到的相關技術與工具,本研究主要以 ASP 來處理詴 題數據的生成,並利用 Appserv[1]來架設伺服器並放置 PHP[2]網頁,最後於網頁上生 成詴題以及使用 Graphviz 生成詴題圖片。. 2.1:Answer Set Programming. 治 政 ASP(Answer Set Programming)[3]是一個用於解決困難搜索問題(通常為 NP-hard 大 立 問題)的宣告式邏輯程式設計語言。ASP 使用規則式邏輯敘述來描述問題,具有高效能 ‧ 國. 學. 的 解 題 能 力 , 而 通 用 的 ASP 求 解 器 則 可 根 據 輸 入 邏 輯 程 式 進 行 非 單 調 邏 輯. ‧. (Non-monotonic logic)[4]的推理來產生一或多個解答。這樣的方式有別於傳統程式語言 需要告訴電腦每一步如何執行才能獲得解答。. y. Nat. io. sit. ASP 具有許多種求解器,例如:DLV[5],Clingo[6],ASPeRiX[7]等等。本研究所. n. al. er. 使用的 ASP 求解器是 Clingo,因為 Clingo 在其中有著較高的效能,並且在許多 ASP. Ch. i n U. v. 比賽中得過獎[8],是一個功能性強的求解器。接下來將介紹 Clingo 的語法。. engchi. 2.1.1:ASP 基礎 Clingo 邏輯程式的基本建構單元為項(term)。項可分為簡單項(simple term)、函數 (function)、以及項組(tuple)等。簡單項又細分為符號常數(constants)、整數(integers)、 字 串(string)、變數(variables)、"_"(底線)、#sup(最大),以及#inf(最小)等。函數(function) 由符號常數(constants)加上多個項(term)與括號所組成。項組(tuple)與函數相似,差別 在於項組並沒有符號常數。 符號常數為一不變名稱,代表領域中某一特定個體、函數或關係。變數代表的是 4. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(14) 邏輯變數,意謂該位置可以一致性的代換成所有領域項(domain terms),而所得的新的 規則或事實依然成立。Clingo 自訂了一個大小關係,任意兩個項都可以區分大小,而 #sup 與#inf 被用來代表最大值與最小值。圖 2-1 展示的是 Clingo 當中項的語法結構圖。. 立. 政 治 大. ‧. ‧ 國. 學. n. er. io. sit. y. Nat. al. Ch. engchi. i n U. v. 圖 2-1:項的語法結構圖. 謂詞(predicates) 是指用以代表領域中特定維度關係(relation)的名稱,其詞彙組成 規則與符號常數相同,是以小寫字母開頭的識別字(identifier)。謂詞較特殊的地方在於, 除了名稱以外還必頇指明其維度(arity),因為 Clingo 允許不同維度的領域關係使用相 同名稱。Clingo 使用"名稱/維度"的格式來表達完整的謂詞,例如 father/1 與 father/2 可 分別用來表示使用 father 當作名稱的一元關係與二元關係,此時這兩個謂詞的意義並 不相同。謂詞 p/n 通常不獨立使用而是以 p(t1,t2,…,tn)的原子(atom)形式出現,其中 (t1,t2,…,tn)為 n 個代表領域物件的項所形成的項組,用來表示該項組屬於謂詞 p/n 所代 表的 n 元領域關係。例如:我們可以用 father(john)來表示 john 為一名父親,也能用 5. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(15) father(peter,marry)來表示(peter,marry) 屬於'父親'代表的二元關係。簡言之,peter 是 marry 的父親。 ASP 有著兩種否定,"-"代表傳統邏輯否定(classical negation),而"not"代表的是無 法推論的預設否定(default negation)。例如我們使用-criminal(john)代表 john 沒有犯罪, 而使用 not criminal(john)表示無法推論 john 犯罪。此二敘述並不相同,因為無法推論 john 犯罪並不表示 john 沒有犯罪,只是沒找到證明 john 犯罪的證據。以下另舉一個 例子來說明差異。假設門不是關就是開,因此 door_closed(門是關的)與 -door_open(門. 政 治 大. 不是開的)同義。也因此由 door_closed 可以推論出-door_open 以及 not door_open(門既. 立. 然是關的當然無法推論門是開的)。同理由-door_open 可以推得 door_closed,但是由. ‧ 國. 學. not door_closed 卻無法推論出 door-open(因為無法確認門是關的不代表你就能推論說 門是開的)。. ‧ sit. y. Nat. 2.1.2:ASP 規則. n. al. er. io. 一個 ASP 的程式通常由許多規則(rule)所組成。一條規則會寫成 H1 |…| Ht :-. i n U. v. B1,…,Bm.的形式。符號":-"的前方被稱為 Head;符號":-"後方被稱為 Body,規則就是. Ch. engchi. 由 Head 與 Body 所組成。其中 Head 的 Hi(t>=i>=1)是以原子(atom)形式呈現,而 Body 的 Bj(m>=j>=1) 是 以 literal 形 式 呈 現 。 literal 代 表 的 可 能 是 一 個 atom( 稱 為 正 (positive)literal),也可能是一個 not atom (稱為負(negative) literal)。 每一條規則的含意是當 Body 內的 literals 皆為真的時候,則 Head 內至少必頇有一 個 Hi(t>=i>=1)為真。如果一條規則的 Head 內只有一個原子 H1,這條規則將被稱為正 規規則(normal rules);如果一條規則的 Head 內具有多於一個的原子,則這條規則將被 稱為析取規則(disjunctive rule);如果一條規則同時滿足正規規則的形式且 Body 內的 literal 皆為正(positive),則這條規則將被稱為正規則(positive rule);如果一條規則的 6. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(16) Body 沒有任何 literal,則這條規則將被稱為事實(fact);最後如果一條規則的 Head 內 沒有任何原子,則這條規則將被稱為限制(constraint)。以下將提供例子來介紹各個項 目。. 1.. r :- s, t, not p, not q.. 2.. r :- s,t.. 3.. p | q | r.. 4.. :- s, t, not p, not q.. 5.. p | q | r :- s, t, not p, not q.. 立. 政 治 大. 行 1 規則的 Head 只有一個原子,所以被歸類為正規規則。行 2 規則後方沒有負. ‧ 國. 學. literal,且具有正規規則的特性,所以被歸類為正規則。行 3 規則的 Body 沒有任何 literal,. ‧. 所以被歸類為事實。行 4 規則因為 Head 內沒有任何原子,所以被歸類為限制。最後 的行 5 規則與正規規則相似,但是 Head 具有多個原子,所以歸類為析取規則。. sit. y. Nat. er. io. 2.1.3:Clingo 語句擴增. al. n. v i n Ch Clingo 有提供一些寫法可以使得語句更加簡潔。雖然並非一定要使用這些寫法, engchi U. 但是使用的話可以提高程式的可讀性並可大量減少程式碼的重複性。. 有些時候,我們希望 atom_h 內的變數侷限在某範圍內的時候,我們可以使用條件 式集合寫法 { h: l1,l2,…,ln },其中 l1,l2,…,ln 為任意有限個 literal,表示所有符合 l1,l2,…,ln 條件的 h 實例所成的集合。舉個例子:我們首先建立事實 b(1).b(2).b(3).c(2).,接下來 編寫條件式集合{ a(X) : b(X), not c(X) }.,這樣我們的 a(X)只會有 a(1)或是 a(3)兩種結 果,因為 X 的範圍先被限制在 1~3 之間並且規定其不為 2。這樣的寫法不但清楚的看 出其範圍限制,並且實用度也很高,因此在實際編寫時有許多情況會用到這寫法。 雖然使用條件式集合可以限制變數的範圍,但是某些時候我們除此之外還希望對 7. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(17) 條件式集合的成員數量訂出一個限制,此時我們會使用到一個叫 choice 的寫法。在使 用條件式集合的前後填入數字來限制元素個數的範圍。例如前面所提的例子可以使用 條件式集合改寫成 value1 { a(X) : b(X), not c(X).} value2,value1 與 value2 可代寫為任 意的整數,這句將限制一次產生出的 a 的數量在 value1 以及 value2 之間。使用 choice 可以讓我們更加簡潔的限定解答中特定集合成員的個數。 前面舉的例子皆寫出了許多的事實(fact),這將花費許多時間編寫相似的事情,所 以 Clingo 也有寫法可以將相關性高的事實縮寫。Clingo 可以將一連串相鄰的數字以... 政 治 大. 寫成僅留頭跟尾的形式,例如:事實 r(1).r(2).r(3).r(4)可以縮寫成 r(1..4)並且不改變其. 立. 意義,這寫法稱為 interval。對於原子、函數或項組中有多個選擇性的項當作參數時,. ‧ 國. 學. Clingo 可以將其用分號縮寫,例如:e(1,2). e(1,3). e(1,4). 三項事實可以寫成 e(1,(2;3;4))., 這寫法稱為 pooling。使用這些寫法將有效的降低相似事實所佔的程式碼空間,並且不. ‧. 影響其結果。. Nat. sit. y. 大部分的ASP系統包含Clingo允許程式內使用聚合函數(Aggregates)。聚合函數是一. n. al. er. io. 種集合的數值函數,可以映射出輸入集合的數值特性,例如最大(小)值,元素個數以及. i n U. v. 和等。聚合函數的型式如下: #agg { t1,…,tn : l1,l2,…,lm},其中agg 是聚合函數名稱,如. Ch. engchi. min 或 count 等,而{ t1,…,tn : l1,l2,…,lm}雷同前述條件式集合表法為一通用集合表法, 表示所有滿足literal條件l1,l2,…,lm 的所有物項向量(t1,…,tn) 所形成的集合。聚合函數項 (aggregate term) 通常並不獨立出現,而是以如下的聚合原子(aggregate atom) 型式出現: lower << aggTerm << upper。其中aggTerm 為一聚合函數項而upper與lower為兩數值,代 表聚合函數的上下限,至於<<則可以是常見的六種比較運算,包含 (<, <=, >, >=, =, 以 及 != )。除此外ASP系統,像是Clingo也提供聚合原子的各種精簡寫法,例如可以省略 下限或上限部分的描述,而比較運算若為<=則可省略不寫等。以下詴以三例簡要說明:. 1.. a(Y) :- b(Y),. 2 <= #min{X : p(X,Y), q(X)} < 7. 8. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(18) 2.. a(Y) :- b(Y),. 2 <= #min{X : p(X,Y), q(X)} 7.. 3.. a(Y) :- b(Y),. 2 <= #min{X : p(X,Y), q(X)} .. 前述三規則具有相似的結構,差別在最後結尾的形式。#min{term : literals}會在集 合{term : literals}當中找尋最小的 term,這將是一個整數。行 1 規則的 2 <= #min{X : p(X,Y), q(X)} < 7 代表的是#min{X : p(X,Y), q(X)}所得出來的整數 A,必頇滿足條件 7>A>=2。行 2 規則我們將 7 左邊的"<"去掉以後,Clingo 將會視為在此處填了"<=", 我們必頇滿足條件 7>=A>=2。最後行 3 規則連 7 都去掉了,在 Clingo 會視為此處填了. 政 治 大. #sup,#sup 代表的為最大值,也就是說 A>=2 但無上限。除 #min 外,Clingo 還提供. 立. 的其他聚合函數尚包括: #max (最大值),#count (集合個數) 以及#sum (集合內數字. ‧. ‧ 國. 學. 和)。. 2.1.4:Clingo 範例. y. Nat. er. io. sit. 所有 ASP 系統包含 Clingo 均是採用規則式邏輯語言描述問題。當以 ASP 解題時, 首先需確定問題的表達方式,換言之,決定應使用哪些項與謂詞(predicate)等詞彙來表. al. n. v i n 達問題。接下來通常採用所謂的 C hgenerate-define-testU 三步驟產生最後 engchi. ASP 程式。在. generate 階段我們利用前階定義的詞彙,書寫較籠統的邏輯規則以產生所有可能的問 題解答,此階段通常是過度生成,亦即產生的是真正解答集的超集合(super set),因此 我們必頇設法去除不要的非解答,此時的限制條件或過濾規則設計即是所謂的 test。 然而為了達到 test 的目的,我們可能需要先規定ㄧ些過渡的詞彙與定義,以方便最後 的限制條件書寫。因此在 test 之前,通常需要有一個 define 階段,讓設計師定義後階 test 所需之ㄧ些概念。當 ASP 程式正確完成之後,即可透過 ASP 求解器的強大搜尋. 以及利用限制條件規則去除非解答的能力,快速找到必要解答。得到解答之後,實務 上還需由解答中萃取使用者真正需要輸出部分,此階段稱為顯示(display)階段。ASP 9. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(19) 系統通常會提供指令(directive)例如 #show 讓使用者表達需要顯示的輸出部分。 詴以八皇后(8-queens)問題為例,八皇后問題是要求在一個 8*8 的棋盤上,擺上 8 個皇后,並使得任何二個皇后位置均不會同列,同行或斜對角相對。如前段所論,當 欲以 ASP 解決本問題時,首先需要定義基本詞彙,此時我們以原子 queen(X,Y)表示座 標(X,Y)位置擺設一皇后,然而因為(X,Y)必頇限制在 8*8 棋盤上,不可是任意數字, 因此我們設定 row(X)以及 column(Y)分別表示 X 與 Y 是一合格(在 1-8 之中)的列與行。 有了基本詞彙之後,即可以之書寫生成規則,產生可能的八皇后位置組合。此時的最. 政 治 大. 簡單生成方式是由 8*8 棋盤中任意指定 8 位置做為可能解答。接下來因為本問題較為. 立. 簡答,並不需要定義額外概念,因此我們可以進行限制條件規則設計。此時只要把皇. ‧ 國. 學. 后間不可同列,不可同行以及不可對角相對的限制寫成 ASP 規則即可完成八皇后 ASP 程式設計。以下是依據上述敘述,所設計出來的八皇后問題的 Clingo 程式碼。. ‧. Nat. 2.. column(1..8).. 3.. 8 {queen(A,B) : row(A), column(B) } 8.. 4.. :- queen(A,B1) , queen(A,B2) , B1 != B2.. 5.. :- queen(A1,B) , queen(A2,B) , A1 != A2.. 6.. :- queen(A1,B1) , queen(A2,B2) , A1 != A2 , B1 != B2 , A1-B1 == A2-B2.. 7.. :- queen(A1,B1) , queen(A2,B2) , A1 != A2 , B1 != B2 , A1+B1 == A2+B2.. 8.. #show queen/2.. n. al. Ch. engchi. er. sit. y. row(1..8).. io. 1.. i n U. v. 第一行與第二行為建立 row(1)~row(8)和 column(1)~column(8)的事實,表示列與行 的編號為 1 至 8,這邊使用 interval 使程式碼更簡潔。第三行使用了 choice,這句代表 queen(A,B)的(A,B)是使用 row 的 A 以及 column 的 B,並且根據左右的 8,使得產出的 不同 queen(A,B)個數為 8 個。第四行到第七行的語句是條件限制,因為左邊 Head 沒 10. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(20) 有內容,所以表示為偽(false),因此滿足此規則的充要條件是 Body 內至少必頇有一個 literal 為偽。第四行/第五行代表的是,任何的 queen 如果有相同的 row/column,則他 們的 column/ row 也將一樣(即為在同一節點,queen 也將為同一個)。這會使得任何一 個 queen,她的同列以及同行將不會有其他的 queen。第六行以及第七行則是會使得任 何一個 queen,她的左右對角皆不會有其他的 queen。 我們使用上方七行來表達八皇后問題的特徵,接下來在第八行填入#show queen/2, 這將展現出所有 queen(A,B)的 atoms,以下為執行範例。. 立. > clingo eightqueen.lp. 政 治 大. ‧ 國. 學. clingo version 5.2.1 Reading from test1.lp Solving.... queen(4,3). io. n. al. queen(6,6). er. queen(7,8) queen(8,2) SATISFIABLE. queen(5,1). y. queen(3,5). sit. queen(2,7). Nat. queen(1,4). ‧. Answer: 1. Ch. engchi. i n U. v. 上面為利用 Clingo 執行我們所編寫的 ASP 程式碼所產生的結果。因為在此處沒 有要求解答個數,所以預設只產出 1 個結果。我們在八皇后問題程式碼第八行所寫的 #show queen/2 將會使得 Clingo 顯示出解答內所有 queen/2 部分的內容。如果將 queen 的參數填在帶有座標的方格上,得出的結果的確符合八皇后問題。 根據上面的例子可以得知只要將問題描述清楚,Clingo 便可迅速自行產生解答。 這樣的特性十分適合本研究的需求: 我們可以事先分析特定問題演算法的特徵以及希 望呈現的方式,再嘗詴以 ASP 編寫該解題演算法的詴題產生器,最後該產生器的執行 結果(由一群 literals 或 atoms 所組成)即可提供詴題所需之數據。 11. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(21) 但產生出的 atoms 並不適合直接拿來當作題目,所以需要對這些 atoms 進行包裝, 將數據添加文字使其成為題目,或是將數據轉換形式以後,作為輸入參數給予繪圖程 式使用,使其根據數據來產生題目的圖片。接下來將介紹一個本研究所使用的一個繪 圖軟體 Graphviz。. 2.2:Graphviz Graphviz[9]是一個廣受採用的自由軟體,主要功能是用以進行圖形視覺化(Graph. 政 治 大. Visualization)。所謂圖形視覺化是指將結構化資訊表示為抽象圖形(graph)再將之轉換. 立. 為可視的具體圖表。Graphviz 在網絡,生物訊息學,軟體工程,資料庫和網頁設計,. ‧ 國. 學. 機器學習等領域都廣被使用。Graphviz 使用 DOT 語言來描述圖形的關係。DOT 是一 個簡單且容易使用的文字式圖形描述語言,利用它可以讓使用者輕易的描述所要表達. ‧. 的圖形,且其內容可以很容易的被人與電腦理解。. y. Nat. sit. 本研究的系統後端將以 ASP 詴題產生器產生演算法詴題,其 ASP 原生格式需要. n. al. er. io. 進行進一步轉換以成為 DOT 格式的編碼,接下來即可經由 Graphviz 將其轉換成 jpg, svg 或 png 格式的圖片以供儲存或下載。. Ch. engchi. i n U. v. 12. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(22) 立. 政 治 大. ‧. ‧ 國. 學. Nat. sit. y. 圖 2-2:Dijkstra 範例圖. n. al. er. io. 圖 2-2 展示的是一個 DOT 圖檔經由 Graphviz 處理之後所呈現出來的有向圖形. i n U. v. (digraph)以及其中一行的 DOT 程式碼。此圖形提供的是一個帶有邊資訊的有向圖。圖. Ch. engchi. 中的圓圈代表節點(vertex),帶箭頭的有向線段代表有向邊(directed edge),箭頭所指的 是該邊的終結節點(ending vertex),而另端所連接的則是該邊的起始 節點(starting vertex)。圓圈內的數字 0-8 分別標示每一節點名稱,邊上的文字為附屬邊資訊。DOT 便是用這種簡單易懂的形式來描述圖形之間的關係,我們可以決定要呈現出那些訊息 並且使得同一組數據產生出的圖形不會產生差異,簡單的改動其中一部分便可使其分 別成為我們的詴題圖片或是解答圖片。. 13. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(23) 2.3:題目分析與設計 通常製作詴題的時候出題者會要求產出的詴題帶有所欲測詴的特徵,並且內容不 能太過簡單或繁雜。人工或隨機的電腦詴題產生系統通常可以產生相關詴題,然而卻 不容易大量產生同時滿足上述要求的詴題。而利用 ASP 進行詴題產生的優勢是我們可 以相對容易的利用編寫規則來使詴題呈現出出題者所求之特性。 以測詴學生有關 Dijkstra 最短路徑演算法為例,圖 2-2 即是我們利用 ASP 產出的. 政 治 大 一來生成圖的邊分布會較為帄均,而不會產生大多數邊都集中在少數節點的情況。除 立. 一個詴題例子。此圖在設計的時候添加了每個節點的分支數皆不大於 4 的規則,如此. 此之外,還有許多限制條件例如總節點數,總邊數,距離範圍,解答個數,圖形結構. ‧ 國. 學. 限制等均可以依需求設定與調整,這將使得詴題製作具有高度的選擇彈性與自由度。. ‧. 然而編寫這些規則需要對於題目特徵以及需求有著足夠的了解,所以對於所要測. y. Nat. 詴的演算法問題先進行分析是必要的。以下嘗詴對於排序演算法以及圖形問題演算法. er. io. sit. 進行分析來了解其需求以及特徵[10][11]。. n. a. l C 2.3.1:排序問題的生成分析. hengchi. i n U. v. 測詴學生對於特定排序演算法的了解時,通常是給定一排數字並要求學生使用該 特定排序法進行排列。然而如果該排數字是以隨機方式產生的話,有可能會產生出極 端例子,例如已經或幾乎已經排序完成,導致不適合當作詴題。而本研究將分析不同 排序演算法的計算方式,利用 ASP 編寫程式碼使產生的詴題適合該演算法,不但難易 適中,還能檢驗學生是否了解該演算法的運作關建,使詴題具有鑑別性。 以下將對不同排序演算法,做簡單演算法運作與詴題分析,以了解如何以 ASP 編 寫相關詴題生成程式。. 14. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(24) Bubble Sort(氣泡排序) 氣泡排序的演算方式為,從左而右開始兩個兩個比對,如果數字順序錯誤,就兩 者互換位置,直到最右邊便停止就算是一輪。接下來開始新的一輪繼續重複比對,直 到有一輪完全沒有交換為止。氣泡排序在極端數據上的計算次數也會十分極端,我們 利用 ASP 編寫詴題生成程式時,可以設定計算次數的上下限以防止極端數據的產生, 這樣所產生出的詴題才不會不適合。 出題者出氣泡排序詴題時會希望學生是真的了解氣泡排序而非自行任意排序來得. 政 治 大. 出結果。為了達到此需求,我們設計的題型可以是:詢問學生使用氣泡排序 N 輪之後. 立. 的結果,或是到排序完時進行了多少輪的氣泡排序。這樣學生若不是使用氣泡排序便. ‧ 國. 學. 無法得到結果,可以正確的得知學生是否了解氣泡排序。. ‧. 選擇排序(Selection Sort). Nat. sit. y. 選擇排序的演算方式為,將資料分為已排序以及未排序兩部分。在未排序中尋找. n. al. er. io. 最大值,將該筆資料與未排序末筆資料對調,並將新末筆資料改為已排序。上述動作. i n U. v. 重複執行直到無未排序資料為止。選擇排序在理論上因為都要先在未排序中找尋最大. Ch. engchi. 值,所以計算次數不會根據詴題有所不同,所以我們設計數字時,只需避免一眼便能 看出數字是否需要移動的案例。 為了確定學生明白選擇排序,設計詴題時,可以詢問此詴題執行選擇排序後 N 輪 之後的結果,或是在過程中有多少數字在選擇以後沒有移動位置。這樣即使學生使用 其他方式得出最後的排序結果,如果學生不懂選擇排序的演算方式也無法求出解答。. 插入排序(Insertion Sort) 插入排序的演算方式為,將資料分為已排序以及未排序兩部分。將未排序中第一 個值,從已排序的末端往前比對,放置在遇到的第一個比自己小的數後面。與氣泡排 15. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(25) 序的詴題設計方式類似,我們在詴題數據的設計上,可以設定比對次數的上下限來避 免產生極端數據。 為了確定學生明白選擇排序,設計詴題時,可以詢問此詴題執行插入排序後 N 輪 之後的結果,也可以詢問這 N 輪已排序的數列中最大值出現的有哪些,這樣學生需要 明白插入排序的原理才能得出解答。. 合併排序(Merge Sort). 政 治 大. 合併排序是一個使用 Divide and Conquer 的排序演算法。首先會對一開始的. 立. 數列進行對半分割,將其分為左子數列與右子數列。接下來對分割出來的子數列繼續. ‧ 國. 學. 進行分割,直到所有的數列長度皆被分割為 1,到此結束 Divide 階段。接下來依照分 割的路徑來將左子數列與右子數列合併回去,合併的方式為將左子數列與右子數列的. ‧. 最小值依序填入合併後的數列中,如果其中一個數列內的數字先皆已填入新數列,則. Nat. n. al. er. io. 到此結束 Conquer 階段,而同時也完成合併排序了。. sit. y. 另外一個數列內的數字依序填到新數列當中。當重複合併使得數列變為一個的時候,. i n U. v. 合併排序的精神在於分割與合併,設計詴題時,可以詢問合併排序應該如何進行. Ch. engchi. 分割,或是詢問在過程中數列將如何被合併,如此一來學生需要明白 Divide and Conquer 才可解出答案. 堆積排序(Heap Sort) 對一個數列進行堆疊排序,首先我們會先將數列的數字從左而右依序填入一個完 全二元樹中。接下來我們希望所有的父親節點的值皆比其左子點或右子點的值還要大, 使其成為 Max Heap。為了使二元樹變為 Max Heap,我們將進行 MaxHeapify, MaxHeapify 的方式為由上而下的觀察節點,當發現有父親節點的值比其子節點的值還 要小的時候,就將父親節點的值與左子節點和右子節點中值較大的那邊進行交換,重 16. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(26) 複進行以上動作直到整個二元樹的父親節點的值都比子節點的值大的時候,此時此二 元樹便為 Max Heap 了。接下來我們可以得知最上方的 root 點其值一定為最大,所以 將其與此樹的最末點進行交換,這樣最大值就會被排序在最後方。接下來在新的樹無 視排序好的點,並持續進行 MaxHeapify 以及 root 點與樹的最末點進行交換,最後我 們將得到一個數字由上到下由左而右皆排序好的樹,將此樹化為數列便可發現數列也 排序好了,這就是堆積排序。 計算過程所產生的堆積樹將會有數十種,將所有的樹以圖片方式呈現出來會佔十. 政 治 大. 分多的空間。所以對於結果的圖片生成將預計只生成每次進行 MaxHeapify 完後的數. 立. 列圖,這樣可以簡單的表達出結果又較不佔空間。詴題的生成可以詢問執行 N 次. ‧ 國. 學. MaxHeapify 的結果,使得學生要懂堆疊排序的流程才能求出解。. ‧. 2.3.2:其他演算法的詴題生成分析. y. Nat. sit. 除排序外的其他的演算法不像排序演算法具有高相似性,即使同樣是圖論的問題,. n. al. er. io. 也可能因為其演算法計算解答的過程不一樣而使得題目的設計差異度很高。所以需要. i n U. v. 對於每個演算法所需要的題目特徵進行更多的分析,才能編寫出足已表達這些演算法 的邏輯程式以及適合的詴題。. Ch. engchi. 最長公共子序列(longest common subsequence) 最長公共子序列問題簡稱 LCS [12] 問題是一個在兩字串或數字序列中找尋最長 共同子序列的問題。這可用來尋找兩個序列的相似程度,在生物基因或是程式版本的 控制上面廣泛應用。 使用 ASP 來設計 LCS 問題的詴題時,首先可設定的直觀參數是每個序列的長度 的上下限,而較為隱匿的參數則包括最長共同子序列的長度上下限,是否允需多個解 17. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(27) 答以及套用動態規劃(dynamic programming)的求解過程中所需要算出的子解個數等。 了解 LCS 的重要參數及其演算法的運作方式之後,我們即可利用 ASP 設計出詴題生 成程式。而在該程式被執行之前,出題者會被要求在輸入頁面上輸入部分或全部參數 的需求值。而這些參數輸入之後將嵌入預先設計好的 LCS 詴題生成程式,成為其中一 部分,最後經 Clingo 求解之後即可產生結果。 產生出結果以後,我們將利用表格來呈現出兩個序列以及其最長公共子序列長度。 我們可以問學生表格的內容,也可以詢問最長公共子序列長度為何,來明白學生對於. 政 治 大. LCS 的了解程度。動態規劃是演算法課程中最常見的演算法設計技巧,而 LCS 只是其. 立. 中的一個代表例子。未來我們將針對其他應用動態規劃產生的演算法問題規劃出更統. ‧ 國. 學. 一與通用的 ASP 詴題生成程式。. ‧. 霍夫曼樹最佳編碼(Hoffman tree). sit. y. Nat. 霍夫曼編碼(Huffman code)[13],是一種用於無損資料壓縮的熵編碼(權編碼)演算. io. er. 法。其做法是以 bottom-up 的方式建立一顆權值樹。一開始是一堆樹葉節點構成的森. al. 林,每一樹葉代表一個待編碼的資料,而相對出現頻率則是其權值。接下來的做法是. n. v i n Ch 簡單的貪婪法(greedy method):不斷的合併森林中的權值樹直到只剩一棵樹為止。合 engchi U 併方法是從森林中找出權值最小的兩顆樹,將之合成為一顆新樹,新樹的左右子樹即 為原來兩樹,而樹根則為一新節點,其權值為原來兩樹樹根的權值和。這樣形成的樹, 我們稱之為霍夫曼樹。有了霍夫曼樹之後,假設每一節點的左分支標示為 0,右分支 標示為 1,則位在樹葉端的每一資料的編碼即為由樹根至該節點的路徑上所有 0,1 標 示所沿路構成的位元字串。霍夫曼編碼是一種最佳資料編碼法,在資料壓縮上是十分 重要的。 在 ASP 程式的設計上。首先我們設法生成一個完全霍夫曼樹,生成完全樹後再將 部分符合特徵的節點刪除,便可使這棵樹變成其他的非完全霍夫曼樹。接下來再為其 18. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(28) 填入權重使其成為帶有值的霍夫曼樹。出題者將可以自行填入樹葉的個數、樹的高度 範圍。 產生出詴題的數據以及霍夫曼樹的圖以後,可以選擇直接將數據給予學生要求其 繪圖出來,或是將產生出的結果圖的部分結果消除掉要求學生填入應該空格內要有的 值,不管是哪種方式都是可以測詴學生是否了解霍夫曼樹最佳編碼。. Dijkstra 最短路徑演算法. 政 治 大 最短路徑有很多應用的地方,例如物流系統或是導航系統等等。而 Dijkstra 演算法就 立 Dijkstra 演算法是一個用於在有向圖中找兩節點最短路徑以及距離的演算法。搜索. ‧ 國. 學. 是其中一個經典的演算法。Dijkstra 演算法是一個使用貪婪方式來找尋指定節點至其他 節點的最短距離的演算法,首先找一個節點當作起點,在與起點或選擇節點相連且未. ‧. 被選擇的節點內加入離起點最近的節點,並透過新增的節點更新起點到其他節點的最. sit. y. Nat. 短距離,重複以上動作直到所有節點皆被選擇,最後得出最短路徑。. io. er. 設計 Dijkstra 詴題首先的難題是設計其圖形。根據前面所提的 Dijkstra 演算法計算. al. 方式,我們可以發現將這些選擇的最短距離的邊組合起來將可以視為一個樹,其特性. n. v i n Ch 為所有節點都相連(connected)且內部沒有環(cycle) 所以我們製作詴題可以先建立好最 e n g c h i 。U. 短路徑的只有解答邊的解答樹,然後為其插入不會影響這解答的其他邊,使其成為一 個具有複雜性的圖。 Dijkstra 演算法的計算過程大多是畫一個表,一個一個計算並將暫時的結果填上去。 而當計算到新的結果比舊的結果小的時候便將舊的結果更新為新的,我們將此計為更 新一次。而更新次數的多寡便是詴題難易度的一個指標。. 19. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(29) 學. ‧ 國. 立. 政 治 大 圖 2-3:Dijkstra 範例. Nat. n. al. er. io. sit. y. ‧. 表 2-1:Dijkstra 計算過程示範. Ch. engchi. i n U. v. 以上圖 2-3 以及表 2-1 當範例,圖 2-3 黑色邊為題目中沒被選擇的邊,而圖 2-3 的 紅色邊表示我們所選擇的邊,以及表 2-1 的紅色字表示我們當步驟選擇了哪個節點以 及其所花的距離。首先我們選定 a 節點當作起點,並將與 a 節點相鄰的邊的長度填入 表中,接下來選擇一個非選擇過且目前到達所需最小權重的點,此圖此時選擇的是 c 節點。接下來則是觀察 a 節點經由 c 節點可到達的節點的長度總和,有新增的便加入 (d 節點在此時加入),新距離較短的將更新表(a 節點經由 c 節點到 b 節點只需 8,8<12, 所以將表的 a 節點至 b 節點路徑長更改為 8),接下來再繼續用一樣的方式選擇節點(此 處選擇 b 節點)。最後發現 a 節點經過 c 節點再經過 b 節點至 d 節點所花費的距離為 20. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(30) 5+3+8=16,大於 a 節點經過 c 節點至 d 節點的 5+5=10,所以表內 a 節點至 d 節點的路 徑長 10 便原封不動,最後再選擇剩下的 d 節點。當所有節點選擇完畢以後,Dijkstra 演算法便計算完畢了。 出題者可控制的參數為總節點數、總邊數、以及更新次數,這些參數將配合我們 的 ASP 程式產生出符合題目的詴題圖以及其解答圖。解答圖完整的將 Dijkstra 演算法 所解出的邊呈現出來,出題者便可輕易的對學生計算的結果進行批改。. Kruskal 最小生成樹演算法. 立. 政 治 大. Kruskal 演算法是一個使用貪心方式(greedy method)來搜尋圖形中最小生成樹的演. ‧ 國. 學. 算法,最小生成樹可以用於像是城鎮電線布置,找尋最低成本使得所有指定節點都被 電線所連結的方式。Kruskal 演算法的計算方式是先將所有的邊都先依大小排序,依序. ‧. 加入最短的邊,如果形成迴圈就將加入的那個邊捨棄,直到增加 n-1 個邊(假設 n 個節. sit. y. Nat. 點)。. n. al. er. io. 為了製作 Kruskal 演算法詴題,首先要設法做出其圖形。根據其計算方式,我們. i n U. v. 先將每個節點都視為一個只包含自己的樹,當選擇一條符合計算規則的邊以後,這條. Ch. engchi. 邊的兩個連接節點的樹將結合成一個更大的樹。如果選擇的邊其兩個相鄰節點在同一 條樹內則代表這條邊是違反規則的,不該選擇這條邊。最後每個節點都選擇後可以發 現所有節點都在一棵樹內,而這棵樹就是我們的最小生成樹。 Kruskal 的計算過程中,會一直選擇最小的邊,所形成的連通集(component)數在 過程中會產生變化。交替(alternation)現象指的是對前一步驟選擇的邊與下一步驟選擇 的邊進行不同的處置(由捨棄邊變成將邊納入生成樹,或者由將邊納入生成樹變成捨棄 邊)。生成樹產生過程所經歷的交替次數,可以反應 Kruskal 演算法的特性,因此適合 當成詴題參數。我們將讓出題者可以自訂總節點數、總邊數、距離範圍、過程中捨棄 邊數、集合數以及交替數。這些參數將配合我們的 ASP 程式產生出符合題目的詴題圖 21. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(31) 以及其解答圖。解答圖完整的將 Kruskal 演算法所解出的最小生成樹呈現出來,出題 者便可輕易的對學生計算的結果進行批改。. 二元搜尋法(Binary Search) 二元搜尋法[14]是一個使用 Divide and Conquer 方式的搜索演算法,用來在已排序 好的數列中找到目標值。其方式為:首先給定一個已排序的數列,並對其進行對半切 割來分成左右兩個子數列。如果原數列正中間的值比目標值還要大,則接下來對右子. 政 治 大. 數列繼續進行切割;反之如果正中間的值比目標值小,則繼續對左子數列進行切割。. 立. 到最小依然沒找到目標值則代表目標值不在此序列內。. 學. ‧ 國. 如果最後在某個子數列正中間找到了目標值則完成二元搜尋法,如果最後將數列切割. 在出詴題方面,我們可以對目標值進行設定,讓目標值需要進行數次切割後才能. ‧. 得到,這樣可使詴題不要太快就被解答出來。二元搜尋法的精神就在於對半切割,所. Nat. sit. y. 以直接在詴題詢問學生目標值需要進行多少次切割才能得到,是最能測詴學生是否了. n. al. er. io. 解此演算法精神的方式。. Ch. engchi. i n U. v. 22. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(32) 第三章. 使用 ASP 生成演算法詴題. 本章節將以 Dijkstra 最短路徑演算法或氣泡排序法等等的演算法為例子,闡釋如 何用 ASP 描寫我們所希望產生的問題特徵,並講解部分如何將經由 ASP 程式執行後 所得到的原始詴題格式包裝成我們所要呈現出的詴題類型。. 3.1:Dijkstra 最短路徑演算法的 ASP 規則範例. 立. 政 治 大. ‧. ‧ 國. 學. n. Ch. er. io. sit. y. Nat. al. 圖 3-1:網頁輸入範例. i n U. v. 首先,我們將會有如圖 3-1 的網頁讓使用者輸入他所希望的詴題特徵,這會在我. engchi. 們的檔案內添加以下的內容,而這些內容將會用來當作詴題要用的特徵。. #const nNodes = 8. #const minnewEdge = 4. #const maxnewEdge = 7. #const minnUpdate = 2. #const maxnUpdate = 4. #const maxBranch = 3.. 我們製作 Dijkstra 演算法的方式是先建立出一個只具有解答邊的解答樹,建立完 以後再插入一些不會影響解答樹的邊,最後成為我們所需要的圖形,例如圖 3-2 所示。 23. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(33) 立. 政 治 大. sit. n. al. er. io. 我們所編寫的規則如下:. 1.. weight(1..10).. 2.. node(0..nNodes-1).. y. ‧. ‧ 國. 學. Nat. 圖 3-2:Dijkstra 圖形建構示意圖. Ch. engchi. i n U. v. 規則 1 規定圖形內每一邊之權重必頇為 1 至 10 間的ㄧ整數。規則 2 表示圖形內共 有 nNodes 個節點,編號分為為 0 至 nNodes – 1,參數 nNodes 代表節點數量,其數值 由使用者經由網頁介面輸入。. 3.. { parent(X,Y) } :- node(X), node(Y), X < Y.. 4.. :- #count { (X,Y) : parent(X,Y) } != nNodes-1.. 規則 3 的 parent(X,Y)表示(X,Y)構成詴題圖中的一個邊,該邊不僅位於解答樹上, 同時 Y 的最短路徑即是由 X 的最短路徑再沿(X,Y)邊所形成。為了減少無意義編號排 24. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(34) 列,我們將節點編號標準化,限制父節點的編號小於子節點編號,而起始節點的编號 則統一設定為 0。規則 4 限制解答樹的邊的個數必頇等於節點數量-1,這是要在一個 圖形上形成一個生成樹(spanning tree)的必要條件。 5.. reachable(0).. 6.. reachable(Y) :- reachable(X), parent(X,Y).. 7.. :- node(X), not reachable(X).. 利用 parent 限制子圖的邊數尚不足以保證子圖足以構成一棵生成樹,我們還必頇. 政 治 大. 要求該子圖構成一個連通圖(connected graph)。我們的做法是保證節點 0 可以經由 parent 構成的子圖到達每一節點。我們利用 reachable(X) 表示節點 0 可以到達節點 X,. 立. 規則 5 與 6 定義 reachable 的語意,規則 7 表示所有節點必頇均可到達。. ‧ 國. 學. 8.. nonParent(X,Y) :- not parent(X,Y), not parent(Y,X), node(X), node(Y).. 9.. minnewEdge { newEdge(X,Y) : nonParent(X,Y) } maxnewEdge.. ‧ y. Nat. 我們前面所設計 parent 為詴題的解答邊,然而我們的詴題除了解答邊以外還應該. sit. 有其他的邊才能構成我們的詴題,我們將非解答邊的邊命名為問題邊。所有的問題邊. er. io. 只可能出現在兩個非 parent 關係的節點之間,所以我們在規則 8 使用 nonParent 找尋. al. n. v i n C Y,newEdge 將由在所有 間有條問題邊,且方向為 X 朝向h nonParent 關係中抓取使用 engchi U. 所有非 parent 關係的節點關係。然後在規則 9 使用 newEdge(X,Y)來代表節點(X,Y)之 者規定數量的兩點來構成. 10. edge(X,Y) :- parent(X,Y). 11. edge(X,Y) :- newEdge(X,Y). 12. 1 { edge(X,Y,L) : weight(L) }1 :- edge(X,Y). 13. parent(X,Y,W) :- parent(X,Y), edge(X,Y,W). 14. newEdge(X,Y,W) :- newEdge(X,Y), edge(X,Y,W). 15. :- newEdge(X,Y,E), distance(X,D1), distance(Y,D2), not D1+E > D2.. 不論是問題邊還是解答邊,皆為我們詴題圖形上的邊,我們命名為圖形邊,我們 使用 edge(X,Y)來表示 X,Y 兩個節點是有邊相連的。規則 10 與規則 11 表示問題邊與 25. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(35) 解答邊可以生成圖形邊。規則 12 代表我們為圖形邊賦予權重,規則 13 與 14 代表問題 邊與解答邊的權重會沿用問題邊的權重。規則 15 代表如果節點 0 到節點 X 的距離為 D1,節點 0 到節點 Y 的距離為 D2,然後節點(X,Y)之間有一條問題邊的權重為 E,我 們規定 D1+E2 的距離要>E,否則這樣會影響到我們的最短路徑 16. nChildren(N,C) :- node(N), C = #count{ C' : parent(N,C') }. 17. hasBranch(K) :- nChildren(_,K). 18. :- maxBranch(K1), hasBranch(K2),not K1 >= K2.. 政 治 大. 規則 16 的 nChildren(N,C)表示節點 N 有 C 個子節點,規則 17 的 hasBranch(K)表 示至少有一節點的子節點數為 K。我們在前面參數設定已經設定好了 maxBranch(K1),. 立. 規則 18 規定不能有其他節點的子節點數大於 K1. ‧ 國. 學. 19. distance(0,0).. 20. distance(Y,D1+D2) :- distance(X,D1), parent(X,Y,D2). ‧. 21. distance(Y,D1+D2) :- distance(X,D1), parent(X,Y,D2).. D1 <= D2.. sit. y. Nat. 22. :- distance(X,D1), distance(Y,D2), X < Y, not. er. io. 我們用 distance(X,Y)來表示從節點 0 到節點 X 的距離為 Y。規則 19 表示起點到. al. v i n C hY 的距離為 D1+D2。規則 邊相連且邊權重為 D2,則起點到 22 表示點的號碼越大的, engchi U n. 起點距離為 0,規則 20 和 21 表示,如果起點到 X 的距離為 D1,然後 X 和 Y 有解答. 起點到他的距離會越遠。. 23. distance(X,Src,D) :- distance(Src, D1), edge(Src, X, D2), D = D1+D2.. 表的更新次數是一個難易度的標準,規則 23 的 Src 代表選定的節點,此行規則表 示起點經由 X 到 Src 的距離為 D,且 D 為起點到 X 的距離加上邊(X,Src)的距離。這樣 做是為了仿照每輪計算後是否要更新計算的表格。. 24. nonUpdate(X,Src1,Src2) :- distance(X,Src1,D1), distance(X,Src2,D2), Src1 < Src2, D1 <= D2. 25. update(X,Src1,Src2) :- distance(X,Src1,D1), distance(X,Src2,D2), D1 > D2, Src1 26. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(36) < Src2, not nonUpdate(X,_,Src1). 26. nUpdate(N) :- N = #count { (X,Src2) : update(X,Src1,Src2)}. 27. :- nUpdate(N), not N >= minnUpdate. 28. :- nUpdate(N), not N <= maxnUpdate.. 首先我們在規則 24 設定 nonUpdate(X,Src1,Src2),代表節點 0 經由 Src1 到 X 的距 離比經由 Src2 到 X 的距離還短,如此一來就不會發生更新現象,並且將 Src2 排除在 後面規則 25 所設定的 update 規則。規則 25 代表,起點經由 Src1 和 Src2 到 X 的距離 分別為 D1 和 D2,如果 Src2 比 Src1 大且所花的距離 D2 比 D1 小,則我們會將表的 Src1 更 改 為 Src2 。 規 則 26 的 nUpdate(N) 為 計 算 總 更 新 次 數 , 我 們 只 抓 取. 政 治 大. update(X,Src1,Src2)中不一樣的 X 和 Src2 的數量,避免有重複更新的問題(例如 1 變成. 立. 3 再變成 5,然後又多算了一次 3 變成 5)。規則 27 和 28 則是規定我們的更新次數不. ‧ 國. 學. 應超出使用者規定的範圍外。. 29. line(X,Y,W) :- parent(X,Y,W).. ‧. 30. sup(X,Y,W):- newEdge(X,Y,W).. y. Nat. n. al. er. io. 改為 sup。. sit. 統一 Graphviz 製圖用的名稱,規則 29 將解答邊更改為 line,規則 30 將問題邊更. 31. #show line/3. 32. #show sup/3.. Ch. engchi. i n U. v. 以上兩行代表我們希望 Clingo 呈現出哪些結果,line 代表解答邊,sup 代表非解 答邊,兩個合在一起便為圖形所有的邊。這樣的編寫方式讓我們可以簡單的分開的對 他們進行包裝來呈現詴題(例如將解答邊改成藍色當作解答,以便跟黑色的非解答邊做 區分)。. 3.2:Kruskal 最小生成樹的 ASP 規則範例 接下來將介紹 Kruskal 最小生成樹的 ASP 規則。我們將編寫好產生一個連通圖形 27. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(37) 的規則,接下來再添加符合使用者需求的限制條件,最後再編寫 Kruskal 的計算過程 之規則,如此一來產生的圖形便可成為我們所需要的一個圖形,並且可以得到其中一 個最小生成樹的子圖形。我們所編寫的規則如下:. 1.. #const nNodes = 6.. 2.. #const nEdges = 13.. 3.. #const minWeight = 1.#const maxWeight = 20.. 4.. #const lastTreeEdge = 9.. 5.. #const minComponent = 2.#const maxComponent = 2.. 6.. #const minAlt = 2.#const maxAlt = 4.. 政 治 大 規則 1~規則 6 為供使用者自訂的參數。規則 1 代表圖形之節點數,規則 2 代表圖 立. 形之邊數。規則 3 代表節點權重的上下限,規則 4 代表在 Kruskal 計算過程中,要在. ‧ 國. 學. 算到第幾個邊的時候停止(代表計算結束)。規則 5 代表在計算過程中,所產生的最多 連通集數要在多少之間,規則 6 代表在計算過程中,交替(連續捨棄/選擇以後轉變為. ‧. 選擇/捨棄便算交替 1 次)的次數在多少次之間。. y. Nat. 8.. weight(minWeight..maxWeight).. 9.. 1 { e(E,W) : weight(W) } 1 :- E = 1 .. nEdges.. Ch. i n U. 10. :- e(E1,W1),e(E2,W2), E1 < E2, not W1 < W2.. engchi. er. n. al. sit. node(1..nNodes).. io. 7.. v. 因為 Kruskal 的計算方式為捨棄或選擇邊,我們在製作圖形的時候選擇以邊的規 則為重心,如此一來在計算上會較為方便。規則 7 將建立符合使用者需求數量的節點, 規則 8 將建立符合使用者規定上下限的權重。規則 9 的 e(E,W)代表邊 E 具有權重 W, 此條規則為將規則 8 的權重鑲入規則 7 的節點當中,規則 10 則是限制號碼比較大的邊 也將有比較大的權重,同時也限制不能有不同的邊卻擁有相同的權重。. 11. 1 { end(E,(N1,N2)) : node(N1), node(N2), N1 < N2 } 1 :- e(E,_). 12. :- end(E1,N1S), end(E2,N2S), E1 < E2 , N1S = N2S.. 規則 11 的 end(E,(N1,N2)代表邊 E 連接的節點為 N1 以及 N2,並且 N1 的號碼小 28. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(38) 於 N2,規則 12 代表兩個不同的邊,不得有相同的兩個連接節點(否則即為同一條邊)。 13. reachable(1). 14. reachable(N) :- reachable(N'), end(E,(N',N)). 15. reachable(N) :- reachable(N'), end(E,(N,N')). 16. :- node(N), not reachable(N).. 為了建立連通圖,我們編寫了規則 13~16。我們使用 reachable(X)代表節點 1 可到 達節點 X(代表同一點或是可經由邊相連)。規則 13 代表節點 1 自己是可到達的。規則 14 與規則 15 代表如果有一個點 N 是可到達的,同時又有另外一個 N1 是與 N 有邊相. 政 治 大. 連的,則 N1 也會被判定可到達的。最後規則 16 規定不可有點是不可到達的,如此一. 立. 來所有的點都會與節點 1 相連,自然成為一個連通圖。. ‧ 國. 學. 17. choose(1,1).. 18. 1 { choose(N+1,E1) : e(E1,_), E1 > E } 1 :- choose(N,E), N < nNodes-1.. ‧. 19. betteredge(N,E1) :- choose(N,E), E1<E ,end(E1,(V1,V2)), g(N-1,V1,R1), g(N-1,V2,R2), R1 != R2.. y. Nat. sit. 20. :- betteredge(N,E).. io. n. al. er. 21. :- not choose(nNodes-1,lastTreeEdge).. i n U. v. 接下來編輯跟選擇有關的規則,我們使用 choose(N,E)表示在第 N 次的選擇中選擇. Ch. engchi. 了節點 E。規則 17 的 choose(1,1)代表第一次選擇一定是第一條邊,規則 18 限制每次 選擇的邊一定要有著比前一次選擇的邊有著更高的權重。規則 19 的 betteredge(N,E1) 代表在第 N 次選擇了邊 E,但是有著號碼比 E 更小的邊 E1 可被選擇,則為 betteredge(N,E1),規則 20 限制不得產生 betteredge。規則 21 表示在最後一次所選擇的 邊要為規則 4 所設定的最終選擇邊。 22. g(0,V,V) :- node(V). 23. :- choose(N,E), end(E,(V1,V2)), g(N-1,V1,R), g(N-1,V2,R).. 接下來編寫每一條邊在計算過程中要被選擇還是捨棄。首先我們的方式為將每一 個點放入只有自己的集合當中。接下來如果是選擇邊的話,我們將會將邊所相連的兩 29. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(39) 個節點所在的兩個集合合成為一個,並且將集合的名稱命名為集合當中節點號碼最小 的一個。如果這兩個節點包含在同一個集合,則代表會產生迴圈,代表此處為捨棄邊。 我們使用 g(N,V1,V2)代表在第 N 次選擇當中,節點 V1 位於集合 V2 當中。規則 22 的 g(0,V,V) :- node(V).代表一開始所有點都在自己的集合當中,規則 22 代表會產生迴圈 的不會為選擇邊. 24. g(N,V,R1) :- choose(N,E), end(E,(V1,V2)), g(N-1, V1, R1), g(N-1,V2,R2), R1< R2, g(N-1,V,R1). 25. g(N,V,R1) :- choose(N,E), end(E,(V1,V2)), g(N-1, V1, R1), g(N-1,V2,R2), R1< R2, g(N-1,V,R2).. 政 治 大. 26. g(N,V,R2) :- choose(N,E), end(E,(V1,V2)), g(N-1, V1, R1), g(N-1,V2,R2), R1> R2,. 立. g(N-1,V,R1).. 27. g(N,V,R2) :- choose(N,E), end(E,(V1,V2)), g(N-1, V1, R1), g(N-1,V2,R2), R1> R2,. ‧ 國. 學. g(N-1,V,R2).. 28. g(N,V,R3) :- choose(N,E), end(E,(V1,V2)), g(N-1,V1,R1), g(N-1,V2,R2),. ‧. g(N-1,V,R3), R3 != R1, R3 != R2.. Nat. sit. y. 接下來我們將設定選擇邊以後,所有的點要歸類在什麼集合。規則 24~28 代表,. io. er. 在第 N 次選擇了邊 E,邊所連接的節點為 V1 與 V2 且 V1 在 R1 集合內以及 V2 在 R2 集合內。規則 24 與 25 為 R1 比 R2 小的狀況,我們會將 R1 與 R2 的點都歸類在 R1 集. n. al. i n U. v. 合內。規則 26 與 27 代表 R2 比 R1 小的狀況,我們會將 R1 與 R2 的點都歸類在 R2 集. Ch. engchi. 合內。規則 28 則是在 R1 與 R2 集合內的點都維持在原集合內。 29. alt(K) :- K1 = #count { N1: choose(N1,E1), N1 < nNodes-1, not choose(N1+1,E1+1) }, K2 = #count { N : N >1, choose(N,E), not choose(N-1, E-1) }, K = K1+K2 . 30. :- alt(K), not K >= minAlt. 31. :- alt(K), not K <= maxAlt.. 接下來編寫交替的設定,我們使用 alt(K)來表示交替幾次。規則 29 表示交替的次 數為 K1 與 K2 的相加,K1 為連續選擇以後轉為捨棄,K2 為連續捨棄以後轉為選擇。 規則 30 與 31 則是規定交替次數要在我們設定的上下限當中。 32. component(N,K) :- N = 1..nNodes-1, K = #count { V : g(N,V1,V), V1 != V }. 30. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(40) 33. component(K) :- K = #max { K' : component(N,K') } . 34. :- component(K), not K >= minComponent. 35. :- component(K), not K <= maxComponent.. 接下來編寫最大集合數的設定,此處的集合數只計算節點數量>1 的集合。規則 32 代表在第 N 次的選擇中擁有集合數 K,規則 33 33. component(K)則是在每次選擇 所得到的集合數當中,最大的集合數為 K。規則 34 與 35 規定集合數要位於我們所規 定的上下限當中。. 政 治 大. 36. include(E,yes) :- choose(N,E). 37. include(E,no) :- e(E,_),. 立. #false : choose(N,E).. 被捨棄代表 no。. ‧. ‧ 國. 學. 規則 36 與 37 的 include(E,yes/no)代表邊 E 是否被我們所選擇,被選擇代表 yes,. 38. edge(X,Y,W) :- e(E,W), end(E,(X,Y)).. y. Nat. 39. line(X,Y,W) :- choose(N,E), e(E,W), end(E,(X,Y)).. er. io. al. sit. 40. sup(X,Y,W) :- edge(X,Y,W), not line(X,Y,W).. n. 前面已經完成了我們的 Kruskal 圖形製作,但是我們要在網頁上生成圖形需要有. Ch. i n U. v. 更詳細的參數,這樣使用 Graphviz 生成圖形較為方便。規則 38~40 的(X,Y,W)代表 X. engchi. 與 Y 相連且邊權重圍 W,但規則 38 表示的 X 與 Y 相連的為邊(可能解答也可能非解 答),規則 39 表示的是 X 與 Y 相連的為解答邊,規則 40 表示的是 X 與 Y 相連的為非 解答邊,這樣一來我們便可用 Graphviz 較輕易的生成我們的圖形了。. 3.3:氣泡排序法的 ASP 規則範例 接下來將介紹氣泡排序法的 ASP 規則。我們首先會先進行數列的生成,決定數字 範圍或是是否要有重複數字,接下來才會進行排序。我們所編寫的規則如下。. 1.. #const maxpos = 8. 31. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(41) 2.. #const maxvalue = 15.. 3.. minmove(10).maxmove(20).. 我們使用 maxpos 來表示數列格子數、使用 maxvalue 來表示數字上限、使用 mtn 來表示同一數字的最多出現次數。規則 1 代表我們希望數列的格子數為 8,規則 2 代 表我們希望數列的數字上限為 15。規則 3 代表同一個數字最多可以重複出現 2 次。規 則 1~3 將由使用者自行設置. 4.. value(1..maxvalue).. 5.. maxpos { num(N) : value(N) } maxpos.. 6.. 1 { p(P,N) : num(N) } 1 :- P = 1 .. maxpos.. 立. 政 治 大. ‧ 國. 學. 規則 4 的 value 用來表示數字範圍,在此處我們設置成範圍由 1~maxvalue。規則 5 我們將取 maxpos 數量的 num(N)出來,num(N)代表 N 為將被放到數列內的數字。規 則 6 的 p(P,N)代表在數列的位置 P 放置數字 N。. :- typenumber(N), not N > maxpos/3*2.. er. io. sit. 8.. y. ‧. typenumber(N) :- N = #count { N1 : p(P,N1) }.. Nat. 7.. al. v i n C hN 共有幾種,規則U8 限制 N 的數量不能比數字上限 限制,規則 7 用來計算全部的數字 engchi 的 66%還要少,這將會有比較多的不同數字。 n. 我們不希望一個數列出現太多組重複的數字,所以我們希望對重複數字進行一些. 9.. timenumber(N,T) :- T = #count { P : p(P,N) }, num(N).. 10. maxtimenumber(TIME) :- TIME = #max { T : timenumber(N,T) }. 11. :- maxtimenumber(N), not N < 2.. 規則 7~8 解決了不同數字種類可能過少的問題,但是還是可能產生過多相同數字 的 問 題 , 所 以 這 要 在 規 則 9~11 解 決 。 規 則 9 用 來 計 算 每 個 數 字 出 現 幾 次 , timenumber(N,T)代表數字 N 共出現了 T 次。規則 10 用來計算在所有的數字出現次數當中 最多的出現數字次數為多少次,規則 11 為設置我們最多的數字出現次數只能為一次,這樣此 數列就不會有重複的數字了。到此為止便完成我們的數列設置,接下來將氣泡進行排序。 32. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(42) 12. time(1..maxpos). 13. t(P,N,0) :- p(P,N).. 首先我們要定義一個時間軸來放置每輪氣泡排序結束以後的數列,t(P,N,T)代表時 間 T 的時候位置 P 會放置數字 N。規則 12 代表將產生時間 time(1)~time(maxpos)。規 則 13 的代表時間 0 的時候,數列與原始數列一樣。 14. beforebig(P1,N1,T) :- t(P1,N1,T), t(P2,N2,T), P1 > P2, N1 < N2.. 政 治 大. 15. big(P1,P2,T) :- t(P1,N1,T), t(P2,N2,T), P2 > P1, N1 <= N2. 16. best(P1,P3,T) :- P3 = #min{ P2 : big(P1,P2,T) }, t(P1,N1,T).. 立. ‧ 國. 學. 為了進行氣泡排序,首先我們要先定義好交換的規則,首先會在規則 14~16 來決 定進行交換的目標。氣泡排序是由左到右,如果遇到比自己還要小的就交換。規則 14 的 beforebig(P1,N1,T)用來表示在時間 T 的時候,數字 N1 在 P1 這位置,且在前面有. ‧. 比他還大的數字。規則 15 的 big(P1,P2,T)用來表示在時間 T 的時候,位置 P1 在位置. y. Nat. P2 的左邊,且位置 P1 的值不大於位置 P2 的值。規則 16 的(P1,P3,T)代表,在位置 P1. er. io. sit. 右邊的所有位置當中,位置 P3 是最遠離位置 P1 且其值不小於位置 P1 的值。. al. n. v i n Ch 18. t(P1-1,N1,T) :- beforebig(P1,N1,T-1), time(T). U i e h n c g 19. t(P1,N1,T) :- t(P1,N1,T-1), not beforebig(P1,N1,T-1), t(P1+1,N2,T-1), N1 <= N2, 17. t(maxpos,N1,T) :- N1 = #max{ N : p(P,N)}, time(T) .. time(T). 20. t(P2-1,N1,T) :- t(P1,N1,T-1), not beforebig(P1,N1,T-1), t(P2,N2,T-1), best(P1,P2,T-1), P1 < P2, N1 <= N2, time(T).. 接下來的規則 17~20 將進行交換。規則 17 代表進行交換過以後的時間中,最大 值都會放在最後面的位置。規則 18 代表如果在時間 T 的時候數字 N1 左邊有比自己還 大的數字,則 N1 會往前移一格(因為一定會被交換一次)。規則 19 代表如果在時間 T 的時候數字 N1 的左邊沒有任何數字比自己小,且右邊一格的值不小於自己,則數字 N1 將會維持在原地(因為沒進行交換)。規則 20 代表,如果在時間 T 的時候數字 N1 的左邊沒有任何數字比自己小,但右邊一格的值小於自己,則將會持續進行左右交換, 33. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

(43) 直到遇到不小於自己的值。如此一來持續重複便會完成氣泡排序. 21. move(K,T) :- K = #count {N1 : beforebig(P1,N1,T) }, time(T). 22. allmove(K1) :- K1 = #sum { K,T : move(K,T) }. 23. :- allmove(K), minmove(X), not K >= X. 24. :- allmove(K), maxmove(X), not K <= X. 25. #show t/3.. 規則 21 代表計算我們在每個時間 T 的時候數字移動的次數。規則 22 則是將所有 移動次數加起來,成為我們整個氣泡排序的次數。規則 23 與 24 代表我們希望移動次. 政 治 大 每個位置放置什麼數字。如此一來整個氣泡排序便完成了 立. 數要在設置的範圍內,否則計算太過簡單。最後的規則 24,將會秀出在每個時間點時. ‧ 國. 學. 3.4:霍夫曼樹的 ASP 規則範例. ‧. 接下來我們將介紹生成一個霍夫曼樹的範例。我們所做的方式為先編寫建立一個. y. Nat. 完全樹的規則,然後只在其中拿取符合我們需求的點,最後對其填入值使其變為我們. sit. 所需要的霍夫曼樹。如圖 3-2 所表示,假設我們想製作一個樹高為 4,樹葉數量為 5. er. io. 的一個霍夫曼樹,首先我們會建立出一個樹高一樣為 4,但樹葉數量為 8 的完全樹,. al. v i n Ch 求的點便移除掉,最後所成的便為我們所需要的霍夫曼樹。 engchi U n. 接下來再抓取其中 5 個樹葉及其祖先組成一個完滿二元樹(Full Binary),其他不符合需. 34. DOI:10.6814/THE.NCCU.CS.008.2018.B02.

參考文獻

相關文件

進行 18 以內的加法和減法口算 學生須透過口算解主要以圖像闡述的應用 題,並以橫式作記錄。.. 加法和減法的直式在學習單位 1N4

聽、說、讀、寫,以 及分析、評價等能力 例:設計課業,讓學生 應用所學,並運用各

 以課程為目標時,課程包含的是所欲達成的 一組目標,強調課程目標的重要性,所以也 著重於課程目標的選擇、組織、敘寫,並以

應用閉合電路原理解決生活問題 (常識) 應用設計循環進行設計及改良作品 (常識) 以小數加法及乘法計算成本 (數學).

五、每堂課結束後,由授課講師出題進行隨堂測驗或於限期內繳 交課堂作業報告,學員隨堂成績須達 70 分才算及格。不及 格者給予

答:應用學習調適課程並非職業訓練,學生完 成課程後不一定從事該行業或繼續相關的

並以較淺易的方式進行評估,為學生建立學習成就感。整體而言,大多數政治演變的課題,會以概覽式課題的方法處理,即教師

(香港會計準則第2條 ‐ 存貨) 邊際成本計算法