關于人工智能錯誤算法的認識 改正及思考

經過我今年對深度學習 機器學習的研究發現 其算法是錯誤的

計算機是一臺以指令為單位的機器 它是不會學習的 所以沒有學習算法一說 那是沒有認清計算機的本質 學習是人才有的行為 機器怎么會學習嗎 它只有指令啊 經過研究發現我們常說的人工智能 主要是如下四個函數構成的 下面我以常見的游戲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()函數能很好的解決這一問題

歡迎轉載

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

1
1