關于人工智能錯誤算法的認識 改正及思考
經過我今年對深度學習 機器學習的研究發現 其算法是錯誤的
計算機是一臺以指令為單位的機器 它是不會學習的 所以沒有學習算法一說 那是沒有認清計算機的本質 學習是人才有的行為 機器怎么會學習嗎 它只有指令啊 經過研究發現我們常說的人工智能 主要是如下四個函數構成的 下面我以常見的游戲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()函數能很好的解決這一問題
歡迎轉載
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP




















