關(guān)于人工智能錯誤算法的認識 改正及思考
經(jīng)過我今年對深度學(xué)習(xí) 機器學(xué)習(xí)的研究發(fā)現(xiàn) 其算法是錯誤的
計算機是一臺以指令為單位的機器 它是不會學(xué)習(xí)的 所以沒有學(xué)習(xí)算法一說 那是沒有認清計算機的本質(zhì) 學(xué)習(xí)是人才有的行為 機器怎么會學(xué)習(xí)嗎 它只有指令啊 經(jīng)過研究發(fā)現(xiàn)我們常說的人工智能 主要是如下四個函數(shù)構(gòu)成的 下面我以常見的游戲AI為例講解其實現(xiàn) 由于已有多年未碰編程 這里只給出大致算法
在游戲中 當(dāng)角色或者NPC看/聽到什么的時候 就開始學(xué)習(xí)過程 如何學(xué)習(xí)呢 其實所有的學(xué)習(xí)都是從理解開始的 下面給出Understand()函數(shù)
int Understand(string type, string action, string p1, string p2)
{
? ? string memory;
? ? switch(type)
? ? {
? ? ? ? case 'walk'
? ? ? ? memory=Walk(action,p1,p2);? // Walk()函數(shù)根據(jù)詞典定義及參數(shù)p1, p2解釋action并將相應(yīng)的字符串寫入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()函數(shù)會把它解釋成使視線接觸人或事物 并把記憶記在數(shù)據(jù)庫里
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 實際上人在想看東西的時候 檢索記憶也是找到上面的解釋并做出相應(yīng)的行為的
? ? ? ? break;
? ? ? ? ......
? ? ? ? 各種人的行為的函數(shù)? // 這里要注意的是行為的歸類一定要仔細不要冗余 比如躺和側(cè)躺是一類不能歸為2類 我個人估算25個行為左右已經(jīng)有很好
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 的人工智能70個基本上完美 這個時候Understand才兩三百行 對游戲來說是個微不足道的小函數(shù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 要特別指出的是像跳繩 踢毽子等應(yīng)該歸屬于一類Playing()玩游戲
? ? ? ? break;
? ? }
? ? Remember(action, memory);? // 記憶理解所得的結(jié)果即把原始記憶和理解得出的記憶寫入數(shù)據(jù)庫 如表hero/NPC
}
第二個函數(shù)是Study() 人要認識世界就要各種學(xué)習(xí) 理解了就學(xué)習(xí)了 所以
bool Study(string action)
{
? ? action=Look()/action=Listen();? // 通過看或者聽學(xué)習(xí)
? ? string type=IsAction(action);? // 判斷是某種行為 比如走 跑 說話 看等
? ? string p1,p2;
? ? p1=IsParam1(action); p2=IsParam2(action);? // 對行為的一些描述p1 p2
? ? Understand(type, action, p1, p2);? // 對行為進行理解并記憶
}
然后 NPC在空閑的時候還會想事情(就是普通的漫無目的想 假定其函數(shù)名為Thinking) 想了之后就做某種事情 第三個函數(shù)如下
int Thinking()
{
? ? int n=0;? // n是隨機數(shù) NPC在空閑的時候想什么事情是個隨機事件 它隨機性的發(fā)生
? ? int type=rand()/2;? // 2可用其它值 處于某種想之中
? ? switch(type)
? ? {
? ? ? ? case 1:
? ? ? ? n=OnIdle();? // 在空想 函數(shù)給n賦予隨機值
? ? ? ? break;
? ? ? ? case 2:
? ? ? ? n=Memory();? // 在回憶 函數(shù)給n賦予隨機值
? ? ? ? break;
? ? ? ? ......
? ? ?}
? ? switch(n)
? ? {
? ? ? ? case 1:
? ? ? ? Walk();? // 某種形式某種目的的行走 與Understand()中那個不同這個是實際的行為 那個是把行走理解成某種行動的字符串?dāng)?shù)據(jù)
? ? ? ? break;
? ? ? ? case 2:
? ? ? ? Talk();? ?// 某種目的某種內(nèi)容的談話
? ? ? ? break;
? ? ? ? ......
? ? ? ? default
? ? ? ? break;
? ? ?}
}
最后一個函數(shù) 也是最難的一個函數(shù) 就是思考(Thought) 對某個問題經(jīng)過思考得出結(jié)果
int Thought(string question)
{
? ? if(LookupMemory(question))? // 在記憶中查找看是否找到 實際上是一個查找數(shù)據(jù)庫的表并在表中的數(shù)據(jù)項查找的函數(shù)?
? ? {
? ? ? ? string law;
? ? ? ? law=Haslaw(question);? // 函數(shù)中可用IsNum() IsMathChar() IsLaw()等函數(shù)判斷question里面是否有數(shù)字 數(shù)學(xué)符號 數(shù)學(xué)/物理法則等
? ? ? ? if(law.IsNotNull())? // 看是否包含有法則
? ? ? ? {
? ? ? ? ? ? RunLogic(law);? // 運行相應(yīng)的邏輯法則
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 做其它的事 比如和某個NPC對話
? ? ? ? }
? ? ? ? return 1;
? ? }
? ? else
? ? {
? ? ? ? if(Research(question))? // 研究問題
? ? ? ? {
? ? ? ? ? ? ......? ? // 成功相應(yīng)的行為
? ? ? ? ? ? return 1;
? ? ? ? }
? ? ? ? else
? ? ? ?{
? ? ? ? ? ?......? ? // 失敗相應(yīng)的行為
? ? ? ? ? ?return 0;
? ? ? ?}
? ? }
}
通過以上四個函數(shù)就可以把理解 學(xué)習(xí) 想事情 思考問題完整的實現(xiàn)出來 完成人工智能的全部功能 這里根本不需要什么深度學(xué)習(xí) 機器學(xué)習(xí) 這就是全部的人工智能函數(shù)
下面再寫兩個跟游戲有關(guān)及常用的人工智能函數(shù) 第一個自動尋路/自動駕駛
自動尋路要注意的一點就是不能把HitTest()當(dāng)成"輕重緩急"算法寫在判斷避讓那里 因為自動尋路避讓障礙的時候是個輕重緩急行為 不是進行碰撞檢測
bool AutoDriving(int Character)
{
? ? bool obstacle=Look();? // 看道路上有無障礙
? ? if(obstacle)
? ? {
? ? ? ? ?int distance=OrderofPriority(Character);? // 判斷輕重緩急
? ? ? ? ?int direction=GetInput(keyboard);
? ? ? ? ?ChangeDirection(direction, distance);? // 在距離distance處轉(zhuǎn)向
? ? }
}
一個可能的輕重緩急算法是
int OrderofPriority(int Character)
{
? ? int type=rand()/2;? // 輕和重 緩和急是個隨機產(chǎn)生的情況 這是客觀世界的真實反應(yīng) 游戲世界也是一樣的
? ? switch(type)
? ? {
? ? ? ? int min=GetMinimum();? // 測出物體中心到前端的距離的最大值即碰撞距離 不碰撞只要大于它就行了 比如可以略大于它 也可以+1 +2 +5厘米或者加個隨機數(shù)
? ? ? ? int senmin,senmax;
? ? ? ? GetDistanceSensitivity(Character,senmin,senmax);? // 得到角色的最小最大距離敏感度 一個查詢數(shù)據(jù)庫的函數(shù)
? ? ? ? case 1:? // 輕/緩
? ? ? ? return min+(rand()/0.1~1)+senmax;? //? 大于碰撞距離小于等于角色最大距離敏感度并略有出入的隨機數(shù) 或者其它可自定
? ? ? ? break;
? ? ? ? case 2:? // 重/急
? ? ? ? return min+(rand()/0.1~1)+senmin;? //? 大于碰撞距離小于等于角色最小距離敏感度并略有出入的隨機數(shù) 或者其它可自定
? ? ? ? break;
? ? }
}
第二個真實打斗 主要用在怪物和敵人與角色打斗/戰(zhàn)斗 這個函數(shù)主要是隨機數(shù)加上一些三十六計計謀即可 如
int RealFighting()
{
? ? ?int type=rand()/50;? // 計謀中的一種 包括連環(huán)計 計中計
? ? ?switch(type)
? ? ?{
? ? ? ? ? case 1:
? ? ? ? ? 聲東擊西();
? ? ? ? ? break;
? ? ? ? ? case 2:
? ? ? ? ? 圍魏救趙();
? ? ? ? ? break;
? ? ? ? ? case 3:
? ? ? ? ? 四面楚歌();
? ? ? ? ? 火上澆油();
? ? ? ? ? break;
? ? ? ? ? ......
? ? ?}
}
甚至還可以寫出復(fù)合體及變體
提到游戲中人工智能 很多時候都是個隨機數(shù)問題 因為自然界中的事都是隨機發(fā)生的 當(dāng)然到了虛擬世界里面 各種事情也是個隨機性的 恰好有rand()函數(shù)能很好的解決這一問題
歡迎轉(zhuǎn)載