人工智慧,其實它就是一件大衣(系列之二)

2021-06-18 07:04:00 字數 1603 閱讀 4517

俗話說:先搭台,後唱戲。遊戲也是,必須先有遊戲的整體邏輯以及懂規則的裁判,這樣人類玩家或是ai玩家才能開始搏弈。所以我們先處理最重要的規則,判斷一副牌是不是胡牌。這件事兒在大家看來其實非常簡單,基本上會打麻將的在幾秒鐘之內就能判斷一副牌是不是胡了。但是交給電腦來做就沒那麼容易了。

其實在數學上描述胡牌的特徵非常容易,那就是當你的牌型到達如下模式的時候,你就可以胡了(七條對不算,那個情況非常特殊,單獨考慮就可以了):

(aaa|abc)*aa

三張一樣的或是三連張是一副牌,兩張一樣的叫將,要想胡牌你需要乙個將,然後剩下的必須都是整副牌。有人可能想問槓如何處理,這裡我們只考慮手裡還沒有亮出來的牌,所有已經亮出來的牌都不用考慮,比如槓的,比如碰的,因為那些都不會影響你胡不胡。

再端詳一下兒那個模式,眼熟不?那不就是乙個文法麼?所以這個問題就變成了披著人智外衣的編譯……

至少以我的經驗來看,我就是這樣判斷一副牌能不能胡的,我把它分成三張或三連張,然後找將,看看能不能分成上面的樣子。然後這就是人類牛x的地方,人們從這種輸入中尋找模式的本領非常強大,我可以在幾秒內就找到最優的分劃並判斷這牌胡沒胡。

但計算機沒有這種「直覺」,計算機只能計算。所以編譯的知識就派上用場了,問題變成了給定一副牌做輸入,和乙個對應三張,三連張,將等模式的文法,如何推導生成這副牌的文法,並判斷其是否符合胡牌的文法。這個文法的麻煩之處在於它具有二義性,一副牌存在不止乙個劃分方法。

代表一副牌的類如下:

enum patterns ;

class paiinfo ;

判斷胡牌的**如下:

static int hupai_pattern(paiinfo &pai, int jiang)

if (pai.haspattern(pt_yifupai, card))

if (jiang == 0 && pai.haspattern(pt_jiang, card))

return 0;}}

int userinfo::hupai(card card)

if (!res)

}if (res && qingyise()) res += hu_qingyise;

active_cards.removepattern(pt_danzhang, card);

return res;

}

如上即是判斷給定手裡的牌之後,判定加入指定牌之後,整副牌可不可以胡的**。其中應用到了編譯中的移入-歸約思想,以及回溯的方法。此函式可以輸出胡牌的型別,比如平胡,大對子,七條對,以及是不是清一色。有了這個函式,那判斷聽牌的函式是不是也類似地寫呢?是不是也像上面那樣做移入-歸約和回溯呢?其實沒必要,因為聽牌的模式稍微複雜一些,與其分析它的模式,不如利用現有的函式,**如下:

bool userinfo::tingpai()

其思想就是,所謂聽牌,就是差一張就胡的牌,只要檢查一下兒所有的27張牌能不能胡,就知道這副牌是不是聽牌了。

所以人工智慧不是憑空產生的,需要程式設計師把這一丁點兒的智慧型分析透徹,然後再將其轉化成**,其中會用到不那麼智慧型的方法,比如列舉,回溯等。所以人工智慧就是一件大衣,裡麵包著很多基本的東西,羅馬不是一天建成的,人工智慧也不會像悟空一樣從石頭裡蹦出來。

人工智慧系列 Python系列(六)檔案操作

目錄 人工智慧系列 python系列 六 檔案操作 一 文字模式開啟檔案 1.讀檔案 1 判斷是否可讀 2 讀取一行,如果使用了read讀取了,就是整個檔案都讀取了,就不能再讀取 3 讀取檔案所有內容,然後放到列表中 2.寫檔案 1 判斷是否可寫 3.追加檔案 4.讀寫檔案 5.修改檔案 6.wit...

315披露智慧型家居安全問題,其實是一件好事

每年的315是 國際消費者權益日 目的在於擴大消費者權益保護的宣傳,讓消費者的合法權益得到重視。今年的315晚會在昨天剛剛落下帷幕,企業唯恐避之不及,消費者卻拍手稱快。其實,央視所報道的智慧型硬體安全問題只是冰山一角,特別是當前的智慧型家居領域,存在的智慧型家居安全問題非常多。例如,很多做智慧型硬體...

人工智慧演算法通俗講解系列 一 K臨近法

2019獨角獸企業重金招聘python工程師標準 今天,介紹一種特別簡單的機器學習演算法,叫k 臨近法,英文k nearest neighbors,簡稱knn。在介紹演算法之前,我們先舉乙個案例。等案例講完後,看看我們怎麼用k 臨近法去解決這個案例中的問題。有乙個遊戲公司,他們開發了一款遊戲。這款遊...