5

关于人工智能错误算法的认识 改正及思考

 9 months ago
source link: https://gwb.tencent.com/community/detail/133962
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

关于人工智能错误算法的认识 改正及思考

发表于2天前
评论0 32浏览

经过我今年对深度学习 机器学习的研究发现 其算法是错误的 
计算机是一台以指令为单位的机器 它是不会学习的 所以没有学习算法一说 那是没有认清计算机的本质 学习是人才有的行为 机器怎么会学习吗 它只有指令啊 经过研究发现我们常说的人工智能 主要是如下四个函数构成的 下面我以常见的游戏AI为例讲解其实现 由于已有多年未碰编程 这里只给出大致算法 
在游戏中 当角色或者NPC看/听到什么的时候 就开始学习过程 如何学习呢 其实所有的学习都是从理解开始的 下面给出Understand()函数 
int Understand(string type, string action, string p1, string p2) 
{  
   string memory; 
   switch(type) 
   {  
       case 'walk' 
       memory=Walk(action,p1,p2);  // Walk()函数根据词典定义及参数p1, p2解释action并将相应的字符串写入memory 
       break; 
       case 'run' 
       memory=Run(action,p1,p2); 
       break; 
       case 'fight' 
       memory=Fight(action,p1,p2); 
       break; 
       case 'look' 
       memory=Look(action,p1,p2);  // 比如看这个行为 Understand()函数会把它解释成使视线接触人或事物 并把记忆记在数据库里 
                                                       // 实际上人在想看东西的时候 检索记忆也是找到上面的解释并做出相应的行为的 
       break; 
       ...... 
       各种人的行为的函数  // 这里要注意的是行为的归类一定要仔细不要冗余 比如躺和侧躺是一类不能归为2类 我个人估算25个行为左右已经有很好 
                                       // 的人工智能70个基本上完美 这个时候Understand才两三百行 对游戏来说是个微不足道的小函数 
                                       // 要特别指出的是像跳绳 踢毽子等应该归属于一类Playing()玩游戏 
       break; 
    } 
   Remember(action, memory);  // 记忆理解所得的结果即把原始记忆和理解得出的记忆写入数据库 如表hero/NPC

第二个函数是Study() 人要认识世界就要各种学习 理解了就学习了 所以 
bool Study(string action) 
{  
   action=Look()/action=Listen();  // 通过看或者听学习 
   string type=IsAction(action);  // 判断是某种行为 比如走 跑 说话 看等 
   string p1,p2; 
   p1=IsParam1(action); p2=IsParam2(action);  // 对行为的一些描述p1 p2 
   Understand(type, action, p1, p2);  // 对行为进行理解并记忆 

然后 NPC在空闲的时候还会想事情(就是普通的漫无目的想 假定其函数名为Thinking) 想了之后就做某种事情 第三个函数如下 
int Thinking() 
{  
   int n=0;  // n是随机数 NPC在空闲的时候想什么事情是个随机事件 它随机性的发生 
   int type=rand()/2;  // 2可用其它值 处于某种想之中 
   switch(type) 
   {  
       case 1: 
       n=OnIdle();  // 在空想 函数给n赋予随机值 
       break; 
       case 2: 
       n=Memory();  // 在回忆 函数给n赋予随机值 
       break; 
       ...... 
    } 
   switch(n) 
   {  
       case 1: 
       Walk();  // 某种形式某种目的的行走 与Understand()中那个不同这个是实际的行为 那个是把行走理解成某种行动的字符串数据 
       break; 
       case 2: 
       Talk();   // 某种目的某种内容的谈话 
       break; 
       ...... 
       default 
       break; 
    } 

最后一个函数 也是最难的一个函数 就是思考(Thought) 对某个问题经过思考得出结果 
int Thought(string question) 
{  
   if(LookupMemory(question))  // 在记忆中查找看是否找到 实际上是一个查找数据库的表并在表中的数据项查找的函数  
   {  
       string law; 
       law=Haslaw(question);  // 函数中可用IsNum() IsMathChar() IsLaw()等函数判断question里面是否有数字 数学符号 数学/物理法则等 
       if(law.IsNotNull())  // 看是否包含有法则 
       {  
           RunLogic(law);  // 运行相应的逻辑法则 
        } 
       else 
       {  
                                    // 做其它的事 比如和某个NPC对话 
        } 
       return 1; 
    } 
   else 
   {  
       if(Research(question))  // 研究问题 
       {  
           ......    // 成功相应的行为 
           return 1; 
        } 
       else 
      {  
          ......    // 失败相应的行为 
          return 0; 
      } 
    } 

通过以上四个函数就可以把理解 学习 想事情 思考问题完整的实现出来 完成人工智能的全部功能 这里根本不需要什么深度学习 机器学习 这就是全部的人工智能函数 
下面再写两个跟游戏有关及常用的人工智能函数 第一个自动寻路/自动驾驶 
自动寻路要注意的一点就是不能把HitTest()当成"轻重缓急"算法写在判断避让那里 因为自动寻路避让障碍的时候是个轻重缓急行为 不是进行碰撞检测 
bool AutoDriving(int Character) 
{  
   bool obstacle=Look();  // 看道路上有无障碍 
   if(obstacle) 
   {  
        int distance=OrderofPriority(Character);  // 判断轻重缓急 
        int direction=GetInput(keyboard); 
        ChangeDirection(direction, distance);  // 在距离distance处转向 
    } 

一个可能的轻重缓急算法是 
int OrderofPriority(int Character) 
{  
   int type=rand()/2;  // 轻和重 缓和急是个随机产生情况 这是客观世界的真实反应 游戏世界也是一样的 
   switch(type) 
   {  
       int min=GetMinimum();  // 测出物体中心到前端的距离的最大值即碰撞距离 不碰撞只要大于它就行了 比如可以略大于它 也可以+1 +2 +5厘米或者加个随机数 
       int senmin,senmax; 
       GetDistanceSensitivity(Character,senmin,senmax);  // 得到角色的最小最大距离敏感度 一个查询数据库的函数 
       case 1:  // 轻/缓 
       return min+(rand()/0.1~1)+senmax;  //  大于碰撞距离小于等于角色最大距离敏感度并略有出入的随机数 或者其它可自定 
       break; 
       case 2:  // 重/急 
       return min+(rand()/0.1~1)+senmin;  //  大于碰撞距离小于等于角色最小距离敏感度并略有出入的随机数 或者其它可自定 
       break; 
    } 

第二个真实打斗 这个函数主要是随机数加上一些三十六计计谋即可 如 
int RealFighting() 
{  
    int type=rand()/50;  // 计谋中的一种 包括连环计 计中计 
    switch(type) 
    {  
         case 1: 
         声东击西(); 
         break; 
         case 2: 
         围魏救赵(); 
         break; 
         case 3: 
         四面楚歌(); 
         火上浇油(); 
         break; 
         ...... 
    } 

甚至还可以写出复合体及变体 
提到游戏中人工智能 很多时候都是个随机数问题 因为自然界中的事都是随机发生的 当然到了虚拟世界里面 各种事情也是个随机性的 恰好有rand()函数能很好的解决这一问题 
欢迎转载


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK