`
gstarwd
  • 浏览: 1525015 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

AI 决策树ID3 代码(c++)

阅读更多

http://blog.csdn.net/cctt_1/archive/2009/02/03/3860725.aspx

 

源代码工程文件(vs2005)http://d.download.csdn.net/down/1018461/cctt_1

过去在网上找了段代码,发现写的代码要改些地方,而且也想顺便练习下自己的c++编码。

首先我要建立一个真正的树形结构。于是使用了自己过去的GeneralTree.h (当然这里还是改动些GeneralTree的代码例如增添了些函数,另外把有些私有函数变成了公有函数)。

训练文本格式如下:并命名为decision2.txt 并发在自己的工程目录下。当然你也可以改改相关源代码

概念  颜色 形状 轻重 
苹果   红   球   一般
苹果   绿   球   一般
香蕉   黄   弯月  一般
草莓   红   球    轻
草莓   绿   球    轻
西瓜   绿   椭球  重
西瓜   绿   球    重
桔子   桔黄 椭球  轻

测试格式文本格式如下:命名为test.txt并放在工程目录下(试试改改源代码)

颜色 形状 轻重 
红   球   一般
绿   球   一般
黄   弯月  一般

这里应该考虑各个类分开的。不过为了看起来方便,就合在一起了。

下面是具体代码:

  1. /* created by chico chen  
  2. *  date 2009/02/02  
  3. *  如需转载注明出处  
  4. */   
  5. #include "stdafx.h"   
  6. #include <iostream>   
  7. #include <fstream>   
  8. #include <string>   
  9. #include <sstream>   
  10. #include <vector>   
  11. #include <map>   
  12. #include <cmath>   
  13. #include "D:\\Tools\\not Finished\\TreeTest\\TreeTest\\GeneralTree.h"   
  14. using   namespace  std;  
  15. // this class is for computing attribute entropy    
  16. class  AttribDiff  
  17. {  
  18. public :  
  19.     string attribName; // 属性名   
  20.     map<string,int >  attribNum;     //具体属性和个数对   
  21.     map<string,map<string,int >> typeNumber;   
  22.     // 第一个string为具体属性名,第二个为类型,   
  23.     // int是类型在具体属性中的个数.   
  24.     // 例如:是否可见  类型    形状   
  25.     //          1       西瓜    圆   
  26.     //          1       冬瓜    扁   
  27.     //          0       橘子    圆   
  28.     // 其中具体属性为圆,类型为西瓜等个数为形状为圆的类型为西瓜的个数   
  29.     AttribDiff(string& attribName)  
  30.     {  
  31.         this ->attribName = attribName;  
  32.     }  
  33.     // in order to computer entropy of an attribute   
  34.     double  AttribDifferComputer(vector<vector<string>> infos, int  i_attrib, int  i_types, vector< int >& visible)  
  35.     {  
  36.         double   probability = 0;  
  37.         double  entropy = 0;  
  38.         double  attribG = 0;  
  39.         map<string,int > temp;  
  40.         int  tempNum = 0;  
  41.         for ( int  i =0 ; i < infos.size(); i++)  
  42.         {  
  43.             if (visible[i] != 0 )  
  44.             {  
  45.                 tempNum = attribNum[infos[i][i_attrib]];  
  46.                 attribNum[infos[i][i_attrib]] = ++tempNum;  
  47.                 temp = typeNumber[infos[i][i_attrib]];  
  48.                 tempNum = temp[infos[i][i_types]];  
  49.                 temp[infos[i][i_types]] = ++tempNum;  
  50.                 typeNumber[infos[i][i_attrib]] = temp;  
  51.             }  
  52.         }  
  53.         map<string,int >::iterator i_number;  
  54.         map<string,int >::iterator i_type;  
  55.       
  56.         for (i_number = attribNum.begin(); i_number != attribNum.end(); i_number++)  
  57.         {  
  58.               
  59.             probability = (*i_number).second/(double )infos.size();  
  60.             cout <<(*i_number).first <<"概率为:" << probability<<endl;  
  61.             entropy = 0;  
  62.               
  63.             for (i_type = typeNumber[(*i_number).first].begin(); i_type != typeNumber[(*i_number).first].end(); i_type++)  
  64.             {  
  65.                 entropy += ComputerEntropyHelp((*i_type).second/(double )(*i_number).second);  
  66.             }  
  67.               
  68.             attribG += (-1)*probability * entropy;  
  69.               
  70.         }  
  71.           
  72.         return  attribG;  
  73.     }  
  74.     // compute the entropy   
  75.     double  ComputerEntropyHelp( double  pi)  
  76.     {  
  77.         return  pi*log(pi)/log(( double )2);  
  78.     }  
  79. };  
  80. // this class is create a data struct for general tree node   
  81. class  NodeInfo  
  82. {  
  83. public :  
  84.     // 颜色   
  85.     // 红   
  86.     // 蓝   
  87.     string attribName; //  the attribute name, such as 颜色   
  88.     vector<string> detailAttrib; // all of detail attributes under one of attribute name, for example, 红   
  89.     NodeInfo()  
  90.     {  
  91.         attribName = "" ;  
  92.     }  
  93.     NodeInfo(string & attribName)  
  94.     {  
  95.         this ->attribName = attribName;  
  96.     }  
  97.     NodeInfo(NodeInfo & ni)  
  98.     {  
  99.         this ->attribName = ni.attribName;  
  100.         this ->detailAttrib = ni.detailAttrib;  
  101.     }  
  102.     // add detail attributes in NodeInfo   
  103.     void  NodeDetailInfoAdd(string & detailA)  
  104.     {  
  105.         if (!CheckIsHas(detailA))  
  106.         {  
  107.             this ->detailAttrib.push_back(detailA);  
  108.         }  
  109.     }  
  110.     // If detail attribute is in the detailAttrib list, return true;   
  111.     // else return false;   
  112.     bool  CheckIsHas(string & name)  
  113.     {  
  114.         for ( int  i = 0; i < detailAttrib.size(); i++)  
  115.         {  
  116.             if (strcmp(name.c_str(),detailAttrib[i].c_str()) ==0)  
  117.             {  
  118.                 // the same attribute   
  119.                 return   true ;  
  120.             }  
  121.         }  
  122.         return   false ;  
  123.     }  
  124.     // this is print control for printing NodeInfo   
  125.     static   void  Print(NodeInfo& info)  
  126.     {  
  127.         cout << info.attribName<< "(" ;  
  128.           
  129.           
  130.         for ( int  i = 0; i < info.detailAttrib.size() ; i++)  
  131.         {  
  132.             cout <<  info.detailAttrib[i]<<" " ;  
  133.         }  
  134.         cout << ")\n" ;  
  135.           
  136.     }  
  137.       
  138. };  
  139. // this class is decision tree   
  140. class  DT  
  141. {  
  142. protected :  
  143.     const  string filename;  //  the data file name   
  144.     vector<vector<string>> infos; //  the array for storing information   
  145.     vector<string> attribs;  //  the array for storing the attributes   
  146.     GeneralTree<NodeInfo>gt; // the general tree for storing the decision tree   
  147.     const   int  START;  //  which  column is the start attribute, except the type column   
  148.     const   int  I_TYPE; // the column index of type   
  149.     const   int  MAX_ENTROPY;  // set an max entropy to find the minimal entropy   
  150. private :  
  151.     // to help print   
  152.     void  PrintHelp( int  helpPrint)  
  153.     {  
  154.         for ( int  i = 0; i < helpPrint; i++)  
  155.         {  
  156.             cout << ".." ;  
  157.         }  
  158.     }  
  159.     // to find the index of the attribName in attribs array   
  160.     int  Find(string& attribName,vector<string>& attribs)  
  161.     {  
  162.         for ( int  i = 0; i < attribs.size(); i++)  
  163.         {  
  164.             if (strcmp(attribName.c_str(),attribs[i].c_str()) == 0)  
  165.             {  
  166.                 // the same    
  167.                 return  i;  
  168.             }  
  169.         }  
  170.         return  -1;  
  171.     }  
  172.     // this function is used for detecting if the arithmetic is over   
  173.     bool  CheckOver(vector< int >& visible,string& type)  
  174.     {  
  175.         map<string,int > types;  
  176.         int  temp = 0;  
  177.         for ( int  i = 0; i < infos.size(); i++)  
  178.         {  
  179.             if (visible[i] != 0)  
  180.             {  
  181.                 type = infos[i][I_TYPE];  
  182.                 temp = types[infos[i][I_TYPE]];  
  183.                 if (temp == 0)  
  184.                 {  
  185.                     types[infos[i][I_TYPE]] = 1;  
  186.                 }  
  187.                 if (types.size() > 1)  
  188.                 {  
  189.                     return   false // there are more than one types   
  190.                 }  
  191.             }  
  192.         }  
  193.         return   true //  there is only one type   
  194.     }  
  195.     // to create a Decision Tree   
  196.     void  DTCreate(GeneralTreeNode<NodeInfo> *parent, vector< int > visible,vector< int > visibleA,  int  i_attrib,string& detailA,  int  helpPrint)  
  197.     {  
  198.         if (i_attrib >= START)  
  199.         {  
  200.             for ( int  i = 0; i < infos.size(); i++)  
  201.             {  
  202.                 if (strcmp(infos[i][i_attrib].c_str(),detailA.c_str()) !=0)  
  203.                 {  
  204.                     // not same detail attribute   
  205.                     visible[i] = 0;  
  206.                 }  
  207.             }  
  208.         }  
  209.         string type = "" ;  
  210.         if (CheckOver(visible,type))  
  211.         {  
  212.             // the arithmetic is over and add the type node into the general tree   
  213.             NodeInfo n(type);  
  214.             GeneralTreeNode<NodeInfo> * node = new  GeneralTreeNode<NodeInfo>(n);  
  215.             gt.Insert(node,parent);  
  216.             PrintHelp(helpPrint);  
  217.             cout << "decision type:" <<n.attribName<<endl;  
  218.             return ;  
  219.         }  
  220.       
  221.         map<string,double > attribGs;  //  this is for deciding which attrib should be used   
  222.           
  223.         for ( int  i = START; i < attribs.size(); i++)  
  224.         {  
  225.             // iterate attribs   
  226.             if (visibleA[i] != 0)  
  227.             {  
  228.                 AttribDiff ad(attribs[i]);  
  229.                 attribGs[attribs[i]] = ad.AttribDifferComputer(infos,i,I_TYPE,visible);  
  230.                 cout <<attribs[i] <<"的G为:" << attribGs[attribs[i]]<<endl;  
  231.             }  
  232.         }  
  233.         //  to find the decision attribute   
  234.         double  min = MAX_ENTROPY;   
  235.         string attributeName;  
  236.         for (map<string, double >::iterator i = attribGs.begin(); i != attribGs.end(); i++)  
  237.         {  
  238.               
  239.             if (min >= (*i).second)  
  240.             {  
  241.                 attributeName = (*i).first;  
  242.                 min = (*i).second;  
  243.             }  
  244.         }  
  245.         NodeInfo n(attributeName);  
  246.         int  i_max = Find(attributeName,attribs);  
  247.         for ( int  i = 0; i<infos.size() ; i++)  
  248.         {  
  249.             n.NodeDetailInfoAdd(infos[i][i_max]);  
  250.         }  
  251.         GeneralTreeNode<NodeInfo> * node = new  GeneralTreeNode<NodeInfo>(n);  
  252.         gt.Insert(node,parent);  
  253.         visibleA[i_max] = 0;  
  254.         PrintHelp(helpPrint);  
  255.         cout << "choose attribute:" << attributeName<<endl;  
  256.         for ( int  i = 0; i < node->data.detailAttrib.size(); i++)  
  257.         {  
  258.             PrintHelp(helpPrint);  
  259.             cout << "go into the branch:" <<node->data.detailAttrib[i]<<endl;  
  260.             // go to every branch to decision   
  261.             DTCreate(node,visible,visibleA,i_max,node->data.detailAttrib[i],helpPrint+1);  
  262.         }  
  263.           
  264.     }  
  265. public :       
  266.     // 要注意的一点是这里的decision2.txt要放在工程目录下。当然如果你愿意可以写绝对路径   
  267.     // 注意文件的格式:   
  268.     // 首先一列为类别,然后是各个属性   
  269.     // 例如:  类型    形状   
  270.     //         西瓜    圆   
  271.     //         冬瓜    扁   
  272.     //         橘子    圆   
  273.     DT():filename("decision2.txt" ),START(1),I_TYPE(0),MAX_ENTROPY(10000)  
  274.     {  
  275.         GetInfo(attribs,infos,filename);  
  276.         DTCreate();  
  277.           
  278.     }  
  279.        
  280.     // this function is used for read data from the file   
  281.     // and create the attribute array and all information array   
  282.     // post: attribs has at least one element   
  283.     //       infos has at least one element   
  284.     // pre: filename is not empty and the file is exist   
  285.     void  GetInfo(vector<string>& attribs,vector<vector<string>>& infos, const  string& filename)  
  286.     {  
  287.         ifstream read(filename.c_str());  
  288.           
  289.         int  start = 0;  
  290.         int  end = 0;  
  291.         string info = "" ;  
  292.         getline(read,info);  
  293.         istringstream iss(info);  
  294.         string attrib;  
  295.           
  296.         while (iss >> attrib)  
  297.         {  
  298.             attribs.push_back(attrib);  
  299.         }  
  300.         while ( true )  
  301.         {  
  302.             info = "" ;  
  303.             getline(read,info);  
  304.             if (info ==  ""  || info.length() <= 1)  
  305.             {  
  306.                 break ;  
  307.             }  
  308.             vector<string> infoline;  
  309.             istringstream stream(info);  
  310.               
  311.             while (stream >> attrib)  
  312.             {  
  313.                 infoline.push_back(attrib);  
  314.             }  
  315.             infos.push_back(infoline);  
  316.         }  
  317.         read.close();  
  318.     }  
  319.     // create the DT   
  320.     void  DTCreate()  
  321.     {  
  322.         vector<int > visible(infos.size(),1);  
  323.         vector<int > visibleA(attribs.size(),1);  //  to judge which attribute is useless   
  324.         string temp = "" ;  
  325.         DTCreate(NULL,visible,visibleA,START-1,temp,0);  
  326.     }  
  327.     // print the DT   
  328.     void  Print()  
  329.     {  
  330.           
  331.         gt.LevelPrint(NodeInfo::Print);  
  332.     }  
  333.     void  Judge( const  string& testFilename,vector<string>& types, const  string& testResultFileName)  
  334.     {  
  335.         vector<string> attribs_test;  
  336.         vector<vector<string>> infos_test;  
  337.         GetInfo(attribs_test,infos_test,testFilename);  
  338.           
  339.         if (!CheckFileFormat(attribs_test))  
  340.         {  
  341.             throw   "file format error" ;  
  342.         }  
  343.         GeneralTreeNode<NodeInfo> * root = gt.GetRoot();  
  344.         for ( int  i = 0; i < infos_test.size(); i++)  
  345.         {  
  346.               
  347.             types.push_back(JudgeType(root,infos_test[i],attribs_test));  
  348.         }  
  349.         WriteTestTypesInfo(testResultFileName,types);  
  350.     }  
  351.     void  WriteTestTypesInfo( const  string& filename, vector<string>& types)  
  352.     {  
  353.         ofstream out(filename.c_str());  
  354.         out << "类别" <<endl;  
  355.         for ( int  i = 0 ; i < types.size(); i++)  
  356.         {  
  357.             out << types[i]<<endl;  
  358.         }  
  359.         out.close();  
  360.     }  
  361.     string JudgeType(GeneralTreeNode<NodeInfo> * node, vector<string>& info,vector<string>& attribs_test)  
  362.     {  
  363.         if (gt.GetChildNodeNum(node) == 0)  
  364.         {  
  365.             return  node->getData().attribName;  
  366.         }  
  367.         int  index = Find(node->getData().attribName,attribs_test);  
  368.         int  branch_index = Find(info[index],node->getData().detailAttrib);  
  369.         if (branch_index == -1)  
  370.         {  
  371.             // is not find this detail attribute in this node detailAttrib   
  372.             // there are two way to deal with this situation   
  373.             // 1. every branch has possibility to choose   
  374.             // 2. no such type and can not judge   
  375.             // the first solution make the correct ratio low   
  376.             // the second solution has no fault-tolerance.   
  377.             // and here I choose the second solution.   
  378.             // if I have more free time later, I will write the first solution   
  379.             throw   "no such type" ;  
  380.         }  
  381.         GeneralTreeNode<NodeInfo> * childNode = gt.GetAChild(node,branch_index);  
  382.         return  JudgeType(childNode, info,attribs_test);  
  383.     }  
  384.     bool  CheckFileFormat(vector<string>& attribs_test)  
  385.     {  
  386.         bool  isCorrect =  true ;  
  387.         for ( int  j = 0; j < attribs_test.size(); j++)  
  388.         {  
  389.             if (Find(attribs_test[j],attribs) == -1)  
  390.             {  
  391.                 isCorrect = false ;  
  392.             }  
  393.         }  
  394.         if (attribs_test.size() == attribs.size() - 1)  
  395.         {  
  396.             isCorrect = isCorrect && true ;  
  397.         }  
  398.         else   
  399.         {  
  400.             isCorrect = false ;  
  401.         }  
  402.         return  isCorrect;  
  403.     }  
  404. };  

这里的main函数这样写(自己使用的VS2005):

  1. int  _tmain( int  argc, _TCHAR* argv[])  
  2. {  
  3.     DT dt;  
  4.     //dt.Print();   
  5.     string  testFile =  "test.txt" ;  
  6.     string  testResult =  "testResult.txt" ;  
  7.     vector<string >types;  
  8.     dt.Judge(testFile,types,testResult);  
  9.     return  0;  
  10. }  

自己感觉DT 的注释比较详细,所以在我的blog中就不再做太多的解释。另外这段代码会将测试结果放在工程目录下的testResult.txt中。

另外在控制台上会有生成决策树ID3的相关相关的信息显示,例如:

红概率为:0.25
黄概率为:0.125
桔黄概率为:0.125
绿概率为:0.5
颜色的G为:1
球概率为:0.625
椭球概率为:0.25
弯月概率为:0.125
形状的G为:1.20121
轻概率为:0.375
一般概率为:0.375
重概率为:0.25
轻重的G为:0.688722
choose attribute:轻重
go into the branch:一般
红概率为:0.125
黄概率为:0.125
绿概率为:0.125
颜色的G为:0
球概率为:0.25
弯月概率为:0.125
形状的G为:0
..choose attribute:颜色
..go into the branch:红
....decision type:苹果
..go into the branch:绿
....decision type:苹果
..go into the branch:黄
....decision type:香蕉
..go into the branch:桔黄
....decision type:
go into the branch:轻
红概率为:0.125
桔黄概率为:0.125
绿概率为:0.125
颜色的G为:0
球概率为:0.25
椭球概率为:0.125
形状的G为:0
..choose attribute:颜色
..go into the branch:红
....decision type:草莓
..go into the branch:绿
....decision type:草莓
..go into the branch:黄
....decision type:
..go into the branch:桔黄
....decision type:桔子
go into the branch:重
..decision type:西瓜

这一段信息是什么意思呢?

红概率为:0.25
黄概率为:0.125
桔黄概率为:0.125
绿概率为:0.5
颜色的G为:1

红,黄,桔黄,绿的概率是颜色的具体属性。这里没有把entropy打印出来。如果此段代码被中科院的师弟师妹有幸看到,

你 们可以在AttribDifferComputer()函数中添加几行代码就可以把每一个entropy打印出来。反正老师也会让你们看代码,这里就当作 作业题吧。(另外老师第十章机器学习ppt上的决策树的这个例子计算结果有错误。如果你认真计算过的话)颜色G的含义是颜色G的决策值,决策值越小,选择 此属性的概率就越大。


那决策树是什么样子的呢?

choose attribute:轻重
go into the branch:一般

..choose attribute:颜色
..go into the branch:红

......................

看看上面的这些.这里代表根节点是“轻重”,然后进入“一般”分支,然后进入“一般”分支的节点为颜色..然后进入”红“分支.这里一定要注意”..“,相等的"..”代表树的相同的层次。


做出这个Decision Tree 的ID3代码主要是为了学弟学妹们在考试中测试用的。因为我只是测试了老师ppt中的例子,不保证对于所有的例子都正确。而且老师出的考试题比较变态(属性十个左右)..如果手工计算应该需要一个小时左右的时间。

当初后悔没有先编一个程序。祝各位考试顺利..(我想我这段代码可能会在考试之前被搜到)。


同时提醒大家一点, ID3也不是什么很好的算法。当两个属性的G值一致时,如果它并不能给出一个更好的判断标准。而且如果采用顺序选择很有可能生成一个非最小决策树。这点还值得研究一下。

分享到:
评论

相关推荐

    广工人工智能作业--决策树

    本文档旨在讲解决策树ID3算法的实现,通过C++语言编写的源代码来实现决策树和决策树对应的规则集。 一、决策树概述 决策树是一种常用的机器学习算法,用于分类和预测问题。决策树由节点和边组成,每个节点代表一个...

    决策树ID3算法代码

    决策树是一种常用的人工智能和机器学习方法,用于分类和回归任务。ID3(Iterative Dichotomiser 3)是决策树算法的一种早期版本,由Ross Quinlan在1986年提出。它主要基于信息熵和信息增益来选择最优特征进行节点...

    c++决策树算法源码

    决策树是一种常用的人工智能和机器学习算法,用于分类和回归任务。在C++中实现决策树算法,我们可以采用ID3(Iterative Dichotomiser 3)算法作为基础,这是一种早期的基于信息熵和信息增益的决策树构建方法。下面...

    人工智能、机器学习ID3算法

    很好的ID3算法实例,以经典的天气-网球问题为例,很容易改编成适用于其他例子的决策树算法

    数据挖掘 决策树代码

    总结来说,"数据挖掘 决策树代码"涉及了决策树理论、ID3算法以及在不同编程语言中的实现,而"fp_tree合集"则可能涵盖了频繁模式挖掘的内容。理解并掌握这些知识对于进行数据驱动的决策分析和预测具有重要意义。在...

    人工智能应用实例:决策树

    标题 "人工智能应用实例:决策树" 提到的核心概念是决策树,这是一种在人工智能和机器学习领域广泛应用的算法。决策树是一种监督学习方法,用于分类和回归任务,通过学习数据的特征来做出一系列决策,最终形成一个...

    ID3算法决策树程序

    总的来说,这个压缩包文件很可能包含了一套完整的ID3决策树算法实现,包括源代码、可能的数据集、以及一个美观的用户界面,用户可以通过这个程序进行数据导入、决策树构建,并查看模型的预测结果和性能评估。...

    ID3.rar_id3_id3-SQL_决策树_决策树源码_环境智能

    综上所述,"ID3.rar_id3_id3-SQL_决策树_决策树源码_环境智能"这个压缩包文件可能包含了一整套用C++编写的ID3决策树学习算法实现,适用于在各种环境智能应用中进行数据分类和决策。通过学习和理解这个源码,开发者...

    数据挖掘用ID3算法生成决策树

    ID3(Iterative Dichotomiser 3,迭代二分器3)算法是一种经典的数据挖掘方法,主要用于构建决策树模型。决策树是一种图形结构,它通过一系列问题来预测目标变量的结果,每个内部节点代表一个特征,每个分支代表该...

    机器学习决策树 ID3算法的VC源代码.doc

    ### 机器学习决策树 ID3算法的VC源代码解析 #### 一、ID3算法简介 ID3(Iterative Dichotomiser 3)是一种早期的决策树算法,由Ross Quinlan在1986年提出。它主要用于分类问题,并且只能够处理离散特征。ID3算法的...

    机器学习ID3分类算法实现(c++语言和c语言版本)

    通过阅读"ID3.pdf"文档和"A.I"(可能是人工智能相关的其他文件),你可以深入理解ID3算法的原理、实现细节以及在实际项目中的应用。这些资料会帮助你构建自己的ID3分类器,无论是用C++还是C语言。

    DecisionTree1.zip_数值算法/人工智能_Visual_C++_

    决策树(Decision Tree)是一种常用的数据挖掘技术,广泛应用于机器学习和人工智能领域。在这个名为"DecisionTree1.zip"的压缩包文件中,我们可以推测它包含了使用Visual C++编程语言实现的决策树算法的相关资料。...

    DT.zip_人工智能/神经网络/深度学习_C++_

    决策树是一种广泛应用于人工智能、机器学习以及数据挖掘中的预测模型,它通过学习数据特征来做出一系列决定,最终形成一个树状结构。在这个“DT.zip”压缩包中,我们聚焦于决策树算法,特别是C4.5、ID3和CART这三种...

    decision.rar_数值算法/人工智能_C/C++_

    决策树是一种广泛应用于数据分析和机器学习的算法,尤其在分类问题和回归问题中表现出色。...通过深入研究和实践,你不仅可以掌握决策树算法,还能提升C/C++编程技能,为后续的人工智能和数值计算项目打下坚实基础。

    石器时代2.5源代码

    这部分代码展示了如何实现游戏规则,以及简单的AI算法,如有限状态机或行为树。 5. **资源管理**:源代码中会涉及到音效、图像、模型等资源的加载、存储和管理,这对游戏资源优化和内存管理有重要参考价值。 6. **...

    decision_tree.zip_数值算法/人工智能_C/C++_

    1. 算法介绍:简述决策树的基本原理,包括ID3、C4.5或CART等常见决策树算法。 2. 实现细节:描述`main.cpp`中的具体实现,包括数据结构设计、特征选择和分裂策略的具体实现方式。 3. 数据集描述:介绍`Data.txt`的...

    ucm.zip_数值算法/人工智能

    而人工智能则涵盖更广泛,包括机器学习、神经网络、搜索算法、决策树、模糊逻辑等,用于让计算机模拟人类智能或学习解决问题的能力。 【压缩包子文件的文件名称列表】包含了一些开发工具的文件,如Visual Studio的...

    ma-di-tuan.rar_数值算法/人工智能_Visual_C++_

    4. 决策树与随机森林:ID3、C4.5、CART、AdaBoost、GBDT等。 5. 聚类算法:K-means、层次聚类、DBSCAN等。 6. 强化学习算法:Q-learning、SARSA、Deep Q-Network (DQN)等。 7. 自然语言处理(NLP):词嵌入、词袋...

    自己用vc写的金庸群侠传

    6. **AI系统**:游戏中的NPC(非玩家角色)可能有简单的AI决策逻辑,通过状态机或者行为树实现。 7. **网络通信**:如果游戏包含多人在线功能,C++可能还涉及到网络编程,实现客户端与服务器的通信。 通过分析...

    quakeIII源码.zip_quake_quakeIII_quakei

    Quake III Arena的源代码是用C++编写的,它揭示了id Tech 3游戏引擎的内部工作原理。这个引擎不仅在Quake III上使用,还被许多其他游戏如Jedi Knight II: Jedi Outcast和Doom 3所采用。通过研究源码,开发者可以学习...

Global site tag (gtag.js) - Google Analytics