青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

2013年4月1日

1.建立一個目錄.
 mkidr test
2.建立一個測試文件
vi main.cpp
  1 #include <iostream>
  2 
  3 int main(int argc, char* agrv[])
  4 {
  5     std::cout << "hello!" << std::endl;
  6     return 0;
  7 }
3.創建configure.ac文件
autoscan
提示configure.ac不存在,但是會生成一個configure.scan
mv configure.scan configure.ac
vi configure.ac修改為如下
  1 #                                               -*- Autoconf -*-
  2 # Process this file with autoconf to produce a configure script.
  3 
  4 AC_PREREQ(2.59)
  5 AC_INIT([loki], [1.0], [])
  6 AM_INIT_AUTOMAKE
  7 AC_CONFIG_SRCDIR([main.cpp])
  8 AC_CONFIG_HEADER([config.h])
  9 AC_CONFIG_FILES([Makefile])
 10 
 11 # Checks for programs.
 12 AC_PROG_CXX
 13 
 14 # Checks for libraries.
 15 
 16 # Checks for header files.
 17 
 18 # Checks for typedefs, structures, and compiler characteristics.
 19 
 20 # Checks for library functions.
 21 AC_OUTPUT

4.創建相關文件
touch AUTHORS ChangeLog NEWS README

5.編寫Makefile.am
vi Makefile.am
1 noinst_PROGRAMS = loki
2 loki_SOURCES = main.cpp

6.
autoreconf -i

7.
./configure

8. 配置完工,使用make即可看到編譯出的執行文件loki
make
./loki

要了解具體為什么要這樣做,請看這篇教程http://www.freesoftwaremagazine.com/books/autotools_a_guide_to_autoconf_automake_libtool

posted @ 2013-04-01 15:53 菜鳥想學飛 閱讀(629) | 評論 (0)編輯 收藏


2012年5月20日

這個《精粹7》里面一個AI設計的例子,方式是用行為克隆創建代理?!?/span>精粹7》上的描述實在是太粗略,很多東西都沒提及?;艘恍瞧诘拈e碎時間去看這個例子,感覺挺有收獲的,整理了一下學習心得,希望能給跟我一樣的菜鳥們帶來一點幫助。這個例子代碼不多,但是水挺深的。涉及了lua, 仿函數,決策樹,信息論大堆循環遞歸等情況。 

這個DEMO實現了一個飛機對戰射擊小游戲,電腦控制那個飛機會學習你的行為進行模仿。

項目運行

首先,先把項目跑起來再說。我的IDEVS2008

1. 配置好openGL lua環境。這里不細說了,請參考網上資料

2. 配置AI。打開項目工程,設置AIShoote為啟動項,在AIShooter工程---屬性---配置屬性---調試---命令參數中填上 agent.lua。(這個是默認的決策樹的腳本),當然了這個文件要放置在你的項目工程里。

3. 編譯,運行。控制你的飛機跟對手打一架吧,經過數分鐘的搏斗,你終于戰勝了機器人。關掉窗口,后臺會生成一個數據統計表叫training_data_xxx.dat文件。這個東東是用來后面生成決策樹腳本用的。

4. 現在開始進行生成決策樹,這課所謂的樹就存放一個lua文件中。設置Learn為啟動項Learn工程---屬性---配置屬性---調試---命令參數中填上:
-s 1 training_data_xxx.dat 2.lua, 說明: -s 是跳過次數, dat文件是上一步驟產出的數據,2.lua是lua文件名。設置好了運行,就等吧,等待的時間要幾分鐘。然后提示你lua文件生成完畢。

5. 回到步驟2,把參數改成2.lua,再編譯,運行,這時候,仔細觀察,是不是發現電腦控制的飛機行為跟你操控很像呀。嘻嘻,有點意思吧。

功能分析

各個模塊的功能

AIShooter:用openGL渲染戰斗場景,玩家鍵盤輸入檢測使用決策樹腳本控制機器人行為記錄玩家行為數據。

DecisionTree 核心算法,根據玩家行為數據生成決策樹。

Learn: 使用DecisionTree提供的接口函數生成決策樹,并把決策樹生成腳本代碼。

 

決策樹的使用和實現

lua  c++交互:

C++創建lua的表對象,并傳遞類指針和函數指針給它,這樣lua就可以調用到c++的函數

Agent類在init()

 

   lua_newtable (mLua);//創建表對象

   lua_pushlightuserdata (mLua, this);// 將一個代表C指針的值放到棧

   lua_pushcclosure (mLua, Agent::setup_addInterval, 1);// 把一個新的 C closure 壓入堆棧。

   lua_setfield (mLua, -2, "addInterval");addInterval為鍵值注冊到表中

lua_setglobal (mLua, "AIShooter");//設置表名

 

1.創建luaAIShootert 設置項addInterval<->setup_addInterval.

2.創建lua表對象Agent, 設置項accel<->agent_accel turn<->agent_turn fire<->agent_fire

3.創建lua表對象GameState 設置項在act()中動態設置

處理過程:

1.      一開始調用lua函數setupFeatureMap 讀取數據,然后通過 AIShooter.addInterval回調

1.

C++函數setup_addInterval進行數據傳入

 

2. 游戲中的act(),通過對表GameState實時傳入數據,然后調用luaaccelTree根據

 

GameState的數據進行邏輯處理,處理結果通過調用Agent.accel以參數形式傳到C++函數

 

agent_accel中, 另外兩個也類似

 

決策樹的使用:

  初始化的時候,通過這樣劃定了每個行為的特征范圍以及對應特征值

  AIShooter.addInterval ("opp_distance", 0, 0.0, 0.05);

  這些數據存放在mFeatureMap

  updata中實時傳回當前狀態數據,mFeatureMap根據范圍來取他們對應的特征值,這些特征設置到GameState,然后再根據腳本中的決策樹進行邏輯判斷。結果再返回c++相關的接口中

 

// Game state   

std::queue<DataSet::raw_row_t> mStateQueue;

typedef std::map<std::string, float> raw_row_t

 

// Training state

   

FeatureMap mFeatureMap; //數據管理類

類中類設計

Feature 基類

NominalFeature

ContinuousFeature 派生類

 

std::map <std::string, Feature*> mFeatures;

FeatureMap提供對外的接口再具體調具體的派生類

 

ContinuousFeature

有一個數據類型

typedef std::map<int, std::pair<float, float> > interval_t

所以的操作都是對其進行

1.添加數據

2.返回查找的值

3.保存文件和讀取文件

 

DataSet mTrainingData; 仿函數的實戰教程

for_each  transform

 

仿函數的關鍵

template< typename _t >

class cfun

{

  operator () ( _t value )

  {

       do some thing 給遍歷用的

  }

 

  operator int() const 這個是返回整形,其他類型根據需要定

  {

       給返回值用

  }

}

 

數學:  log2(N) 在代碼中這樣獲取 log10(N)/log10(2)

 

決策樹的生成

ID3算法:從一系列統計數據中得到關鍵屬性,并進行分類。重要概念是熵和信息增益

 

信息論知識中我們直到,期望信息越小,信息增益越大,從而純度越高。所以ID3算法的核心思想就是以信息增益度量屬性選擇,選擇分裂后信息增益最大的屬性進行分裂。下面先定義幾個要用到的概念。

     D為用類別對訓練元組進行的劃分,則Dentropy)表示為:

     

     其中pi表示第i個類別在整個訓練元組中出現的概率,可以用屬于此類別元素的數量除以訓練元組元素總數量作為估計。熵的實際意義表示是D中元組的類標號所需要的平均信息量。

     現在我們假設將訓練元組D按屬性A進行劃分,則AD劃分的期望信息為:

     

     而信息增益即為兩者的差值:

     

     ID3算法就是在每次需要分裂時,計算每個屬性的增益率,然后選擇增益率最大的屬性進行分裂。下面我們繼續用SNS社區中不真實賬號檢測的例子說明如何使用ID3算法構造決策樹。為了簡單起見,我們假設訓練集合包含10個元素:

 

 

其中s、ml分別表示小、中和大。

     LF、HR表示日志密度、好友密度、是否使用真實頭像和賬號是否真實,下面計算各屬性的信息增益。

這里是計算結果的熵,共有10個結果, 3個是no, 7yes, 如果結果不只是(yesno兩個結果,那么就按多個來算,那個倒M符合的意義就在這里)

 

     

      

所以根據公式詳細點應該為

 

         - 7 / 10 log2( 7 / 10 ) – ( 3 / 10 ) log2( 3 / 10 )

計算日志的熵:

詳解:

第一項是按日志L劃分,即。 (3 / 10) * ( - ( 0 / 3 ) log2( 0 / 3 ) – ( 3 / 3 )log2( 3 / 3 ) ),  這個 3 / 10 是指l值有3 

     因此日志密度的信息增益是0.276。

     用同樣方法得到HF的信息增益分別為0.0330.553。

     因為F具有最大的信息增益,所以第一次分裂選擇F為分裂屬性,分裂后的結果如下圖表示:

     在上圖的基礎上,再遞歸使用這個方法計算子節點的分裂屬性,最終就可以得到整個決策樹。

     上面為了簡便,將特征屬性離散化了,其實日志密度和好友密度都是連續的屬性。對于特征屬性為連續值,可以如此使用ID3算法:

     先將D中元素按照特征屬性排序,則每兩個相鄰元素的中間點可以看做潛在分裂點,從第一個潛在分裂點開始,分裂D并計算兩個集合的期望信息,具有最小期望信息的點稱為這個屬性的最佳分裂點,其信息期望作為此屬性的信息期望。

 

 

 

 

 

底數公式

loga(MN)=loga(M)+loga(N)
loga(M/N)=loga(M)-loga(N)
 
代碼中info()實現那段函數實質上是經過一推導沒有直接用


 

假設現在套用標準的公式,有 C 1 + C2 = T

 

Info = - ( C1 / T )* log2 ( C 1 / T )  -  ( C2 / T )* log2 ( C 2 / T )

根據底數公式2可以得出

Info = -( C1 / T ) * (log2C1 –log2T) - ( C2 / T ) * (log2C2 –log2T)

把被除數T移出來

Info = ( - C1  * (log2C1 –log2T)  -  C2 * (log2C2 –log2T) ) /T

Info = ( - C1 log2C1  + C1log2T  -  C2 log2C2  + C2log2T  ) /T

Info = ( - C1 log2C1  -  C2 log2C2  +  C1log2T  +  C2log2T  ) /T

Info = ( - C1 log2C1  -  C2 log2C2  +  ( C1  +  C2 ) log2T ) /T

C1 + C2 = T

Info = ( - C1 log2C1  -  C2 log2C2  +  T log2T ) /T

所以代碼里最終是用這個公式來計算的,明顯減少了除法運算量

 

 

代碼中決策樹生成的代碼分析:

   static TreeNode* learnNode (const std::string& targetName,

       const std::string& columnName, const col_t& column,

       const col_set_t& workingSet, unsigned int threshold);

 

targetName: 決策樹的目標屬性

columnName: 傳入的屬性名

column: 屬性數據

workingSet: 分析數據集

 

這個函數完成了決策樹的生成。根據熵的分裂理論。要對這個集進行分支劃分。以其中最大值作上限,0作下限。在范圍(0,最大值)之間每一個值都列為一個分支。這些分支作為本節點的子節點。子節點也要進行這樣的處理。一直到“純”的節點為止。

 

在程序實現上使用遞歸來實現處理.

處理步驟

1.      設置遞歸返回點。根據這組屬性的“純度”來決定是否為遞歸終點,在這里返回的是葉子節點的值,就是決策結果。

2.      對所有分支進行處理,提取分支所屬的數據獲取其中最大增益信息組,并開始遞歸

3.      填充范圍值內缺乏分支的節點,取近似的值的分支作為填充。

 

把決策樹寫成lua配置

每個屬性的范圍劃分,這部分數據是從features.dat從拷出來,添加到lua中的。

 

這里也應用了遞歸處理。

遍歷每個子節點的分支到葉子返回結果。

posted @ 2012-05-20 13:29 菜鳥想學飛 閱讀(1244) | 評論 (4)編輯 收藏


僅列出標題  

posts - 2, comments - 4, trackbacks - 0, articles - 0

Copyright © 菜鳥想學飛

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品视频在线观看免费| 在线视频日韩精品| 国产欧美综合在线| 一区二区高清在线观看| 亚洲承认在线| 午夜欧美大尺度福利影院在线看| 欧美大香线蕉线伊人久久国产精品| 国产精品亚洲激情| 午夜精品福利在线| 一本高清dvd不卡在线观看| 欧美jjzz| 亚洲人成久久| 亚洲高清中文字幕| 欧美大片免费看| 亚洲激情在线激情| 欧美黄色aaaa| 欧美freesex交免费视频| 亚洲国产日韩在线| 欧美a级在线| 欧美成人精品影院| 亚洲免费播放| 99国产精品国产精品久久| 欧美人与禽猛交乱配| 在线一区欧美| 亚洲一区三区视频在线观看| 国产日产高清欧美一区二区三区| 久久精品五月| 久久视频在线视频| 亚洲精品久久久蜜桃| 免费久久99精品国产| 蜜桃av一区二区| 中文久久精品| 亚洲欧美一级二级三级| 激情成人av在线| 欧美国产欧美亚州国产日韩mv天天看完整| 六月丁香综合| 亚洲一级片在线观看| 亚洲欧美国产高清| 亚洲国产成人av在线| 亚洲精品久久久一区二区三区| 欧美日本一道本| 欧美一区二区三区四区在线观看地址 | 女人天堂亚洲aⅴ在线观看| 国产亚洲欧美一区| 亚洲午夜在线| 久久高清国产| 中文国产成人精品久久一| 性做久久久久久久免费看| 亚洲精品1区| 久热精品在线视频| 国产精自产拍久久久久久蜜| 亚洲国产日韩欧美在线99| 中文网丁香综合网| 伊人久久大香线| 亚洲午夜精品久久| 91久久久亚洲精品| 亚洲欧美一区二区激情| 亚洲精品视频免费观看| 国内精品久久久久影院 日本资源| 欧美在线视频观看免费网站| 男女av一区三区二区色多| 性色一区二区三区| 欧美精品首页| 久久久精品国产免大香伊| 欧美日韩亚洲成人| 欧美成人精品在线| 国产三级欧美三级日产三级99| 亚洲国内欧美| 激情小说亚洲一区| 亚洲一区二区在线看| 亚洲九九爱视频| 久久欧美肥婆一二区| 性色av一区二区怡红| 欧美视频一区在线| 一本色道久久综合亚洲精品婷婷 | 亚洲电影毛片| 午夜精品www| 欧美一二区视频| 欧美日韩亚洲在线| 亚洲欧洲在线一区| 亚洲国产精品ⅴa在线观看 | 在线观看亚洲视频| 亚洲欧美成人| 亚洲综合二区| 国产精品av久久久久久麻豆网| 最新高清无码专区| 亚洲黄色性网站| 久久久综合视频| 免费视频久久| 91久久极品少妇xxxxⅹ软件| 久久久久久9| 蜜桃精品一区二区三区| 精品91免费| 久久久久一区二区三区| 久久综合婷婷| 在线成人免费视频| 欧美高清视频一区二区三区在线观看| 韩国精品久久久999| 久久精品日产第一区二区| 久久午夜精品| 黄色工厂这里只有精品| 亚洲国产免费| 欧美日韩三级在线| aa亚洲婷婷| 校园激情久久| 国产一区二区三区免费在线观看 | 一本色道久久综合亚洲精品不卡| 日韩性生活视频| 欧美日韩午夜在线| 久久精品国产清自在天天线 | 日韩一区二区电影网| av成人毛片| 欧美三级午夜理伦三级中文幕 | 亚洲手机视频| 久久av一区二区三区| 国产亚洲福利| 欧美成人亚洲成人| 亚洲乱码国产乱码精品精98午夜| 国产精品久久久久久久午夜| 亚洲婷婷国产精品电影人久久| 欧美亚洲视频在线看网址| 黄色亚洲在线| 欧美精品一级| 欧美一区二区国产| 亚洲国产精彩中文乱码av在线播放| 亚洲美女尤物影院| 国产日韩欧美三区| 老司机67194精品线观看| 亚洲黄一区二区三区| 亚洲欧美日韩国产一区二区| 狠狠久久婷婷| 亚洲一区二区三区乱码aⅴ蜜桃女| 美女免费视频一区| 亚洲视频播放| 欧美国产精品久久| 欧美一区二区日韩一区二区| 亚洲国产精彩中文乱码av在线播放| 欧美吻胸吃奶大尺度电影| 久久天天躁狠狠躁夜夜av| 中国女人久久久| 欧美激情一区二区三区在线视频观看 | 经典三级久久| 一本色道久久综合| 快播亚洲色图| 亚洲亚洲精品三区日韩精品在线视频| 国产一区二区精品久久| 欧美日韩国产精品一区二区亚洲 | 国产日韩在线播放| 欧美日本免费一区二区三区| 欧美一区激情视频在线观看| 亚洲欧洲日韩综合二区| 久久久91精品国产一区二区三区 | 久久精品网址| aa日韩免费精品视频一| 欧美99久久| 久久久久久久久久码影片| 亚洲桃花岛网站| 99热这里只有精品8| 在线欧美亚洲| 黄色亚洲在线| 国内免费精品永久在线视频| 国产精品欧美久久| 欧美日韩一区二区免费视频| 久久夜色精品一区| 欧美在线观看视频| 亚洲免费影视| 亚洲一区不卡| 日韩亚洲在线观看| 91久久精品日日躁夜夜躁欧美| 久久男人资源视频| 欧美一区二区三区在线| 国产精品一区二区三区久久| 欧美无乱码久久久免费午夜一区| 欧美黄色aa电影| 女主播福利一区| 蜜桃av一区二区三区| 免费欧美网站| 欧美成人久久| 欧美激情国产精品| 欧美日韩免费高清| 欧美三级电影网| 国产精品男gay被猛男狂揉视频| 欧美午夜精品电影| 国产精品青草久久久久福利99| 国产精品区一区二区三| 美女成人午夜| 中文有码久久| 亚洲午夜久久久久久久久电影院| 夜夜精品视频一区二区| 一区二区精品在线观看| 亚洲天堂黄色| 亚洲欧美变态国产另类| 欧美在线免费观看亚洲| 久久久久网址| 美女脱光内衣内裤视频久久网站| 免费永久网站黄欧美| 亚洲国产一区二区视频| 亚洲精品综合精品自拍| 一区二区三区日韩精品| 午夜欧美大尺度福利影院在线看|