1. 程式人生 > >NetLogo程式設計的幾個小技巧

NetLogo程式設計的幾個小技巧

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

                NetLogo是一個用來對自然和社會現象進行模擬的可程式設計建模環境。NetLogo特別適合對隨時間演化的複雜系統進行建模。建模人員能夠向成百上千的獨立執行的“主體”(agent)發出指令。這就使得探究微觀層面上的個體行為與巨集觀模式之間的聯絡成為可能,這些巨集觀模式是由許多個體之間的互動湧現出來的。NetLogo足夠簡單,可以非常容易的進行模擬,或者建立自己的模型。並且它也足夠先進,在許多領域都可以做為一個強大的研究工具。
  更多瞭解請見
http://ccl.northwestern.edu/netlogo/
,注意頁面左邊使用者手冊中,有中文手冊的連結。
  只要有一點點程式設計基礎的人,就可以嘗試學一學這這個有用的工具,其程式語言較比C、JAVA等簡單得多。

  近幾年利用NetLogo做過幾個模擬實驗,有一些隨手寫下來的小技巧,釋出在本文中。特別提醒,此文僅是些雕蟲小技,但閱讀需要有Netlogo的程式設計經歷。條件不具備者,省些時間,先打基礎去。


  一、集合運算的實現
  模擬中常涉及到集合的操作。集合用list實現,List中能包含多個數據。
  在下面的例子中,集合A對應list-a,集合B對應list-b,二元運算的結果放在list-a
  1、並運算
  (1)用List的運算實現

;合併列表;例a:[[1] [4] [7]]   b: [[2] [5]],Merge-list a b: a:[[2] [5] [1] [4] [7]];例a:[1 4 7]   b: [2 5],Merge-list a b: a:[2 5 1 4 7]to-report Merge-list [list-a list-b]   ;  let cur-result list-a foreach list-b [  let an-element ?  set cur-result (lput an-element cur-result) ] set cur-result (remove-duplicates cur-result) report cur-resultend

  (2)用netlogo自身的原語
  最簡單的是,用netlogo中的sentence原語可以直接完成合並。

Set list-a (sentence list-a list-b)

  2、交運算

  類似並運算,可以自編例程,也可以用netlogo自身的原語實現。
  
  3、差運算
  (1)用List的運算實現

;列表相減;例a:[1 2 7]   b: [2 5],minus-list a b: a:[1 7]to-report Minus-list [list-a list-b] ;filter [not member? value list-b ] list-a    let cur-result list-a   foreach list-b  [     let an-element ?  set cur-result (remove an-element cur-result)  ]  report cur-resultend
  (2)用netlogo自身的原語

Set list-a (filter [not member? ? list-b ] list-a)

  
  二、除錯技術
  在netlogo中沒有提供傳統IDE中的單步跟蹤。實際上,因為是多個主體同時執行,也無法一一跟蹤。在並行程式設計中,除錯手段本身就是一個比較難的問題。
  可以採用的技巧是:
  1、設定一個go on step按鈕,功能與具有forever性質的go按鈕相同,但不勾選forever選項,以此來實現按tick執行。將需要觀察的值設定為海龜的變數(該變數可能僅只為觀察而設,除錯完後可以刪除),選擇其中的一個海龜進行inspect去發現問題。文字框太小不容易閱讀,可以將其值複製到word中觀察。如果被觀察的海龜die了,立即在who處輸入另一個新號,重新開始觀察。
  2、在適當的地方加入show顯示區域性變數的值,最好將tick也加入。這種方法有缺點,尤其是Agent數量特別多時:(1)由於show嚴重地影響了執行速度;(2)每一個海龜都輸出,資訊太多不易找出問題。解決辦法:只顯示其中的有限幾個用於觀察,如顯示編號為100的倍數的海龜的有關資訊:

to show-test-message [msg]  if (who mod 100) = 0  [    show msg  ]End

  這樣,觀察有限的幾個海龜的資訊,能夠給排錯提供啟發。

  3、快速停止模型的執行
  當模型中Agent數目特別多,尤其是其功能邏輯也相當複雜的時候,執行每一輪需要花費很長的時間。假設執行模型用“forever”型的”go”按鈕,需要停止模型執行時,點選”go”按鈕需要很長時間,等到所有海龜都停止才能結束。
  技巧是,開啟“procedures”頁,在任意一行程式碼後輸入空格,然後“check”,系統檢查程式碼,模型也馬上結束運行了。


  三、用Edit-plus編輯程式碼

  在NetLogo中,編輯器的功能相對簡單,有語法著色,卻不能修改字型、字號等,對中文支援不好。更加不能容忍的是,在NetLogo4.1.2版本中,中文無法輸入和顯示,非常不便使用。
  我用的辦法是在Edit-plus編輯。利用Netlogo中對多個原始檔(Multiple source files)的支援(見手冊),主程式只寫一段很短的程式碼,完成全域性變數的設定,提供對其他例程的呼叫。而其他例程另建在.nls檔案中儲存,用關鍵詞__includes引入到主例程中,從而能在Netlogo中編譯和執行。程式碼多時甚至可以在一個模型裡使用多個原始檔。
  為了在Edit-plus中也能進行語法著色,需要引入語法檔案。我自制了一份,下載連結為: http://download.csdn.net/detail/sxhelijian/3925173。請先將此檔案copy到editplus目錄中去。在editplus中,在tools->preferences->Setting & syntax下,首先新建一個檔案型別,命名為netlogo,副檔名(file extensions)欄裡填入nls。在syntax file欄裡找到剛才下載的netlogo.stx檔案即可。

  為了在Edit-plus中也能快速定位例程,在函式模板的正則表示式處設定為"to "和"to-report "。


           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述