人工智能陪你玩游戲——的士司機(jī)接客和倒立擺

的士司機(jī)接客游戲簡(jiǎn)介:

在這個(gè)游戲中,黃色方塊代表出租車(chē)脉执,(“|”)表示一堵墻踢代,藍(lán)色字母代表接乘客的位置盲憎,紫色字母是乘客下車(chē)的位置,出租車(chē)上有乘客時(shí)就會(huì)變綠胳挎。你作為的士司機(jī)要找到最快速接客和下客的路徑饼疙。


接到客人了

放下客人,完成慕爬!

思路:

客人和下客的位置是隨機(jī)出現(xiàn)的窑眯,不可能用機(jī)械的方法找出變動(dòng)的路徑屏积,可以用人工智能強(qiáng)化學(xué)習(xí)方法學(xué)習(xí)出最優(yōu)路徑。

代碼:

import gym
import numpy as np

env = gym.make('Taxi-v2')
Q = np.zeros((env.observation_space.n,env.action_space.n))

def trainQ():
    for _ in range(10000):
        observation = env.reset()
        while True:
            action = env.action_space.sample()
            observation_,reward, done,info = env.step(action)
            Q[observation,action] = reward + 0.75 * Q[observation_].max()
            observation = observation_
            if done:break
    return Q

def findway():
    observation = env.reset()
    rewards = 0
    while True:
        action = Q[observation].argmax()
        observation_,reward, done,info = env.step(action)
        print(observation_,reward, done,info)
        rewards += reward
        observation = observation_
        env.render()
        if done:
            print(rewards)
            break

Q = trainQ()
findway()

測(cè)試:

客人在這

接到客人了
開(kāi)車(chē)

開(kāi)車(chē)

開(kāi)車(chē)
下客磅甩,完工肾请!

倒立擺游戲簡(jiǎn)介:

思路:

倒立擺游戲比的士司機(jī)游戲復(fù)雜,原因在于倒立擺的連續(xù)狀態(tài)是無(wú)窮多個(gè)更胖,人工智能 Q-learning 方法需要有限個(gè)狀態(tài)形成知識(shí)。
解決方案:只需要將連續(xù)狀態(tài)打散為離散狀態(tài)即可隔显。

代碼:

import gym
import numpy as np
env = gym.make('CartPole-v0')
eplision = 0.01
q_table = np.zeros((256,2))

def bins(clip_min, clip_max, num):
    return np.linspace(clip_min, clip_max, num + 1)[1:-1]

def digitize_state(observation):
    cart_pos, cart_v, pole_angle, pole_v = observation
    digitized = [np.digitize(cart_pos, bins=bins(-2.4, 2.4, 4)),
                 np.digitize(cart_v, bins=bins(-3.0, 3.0, 4)),
                 np.digitize(pole_angle, bins=bins(-0.5, 0.5, 4)),
                 np.digitize(pole_v, bins=bins(-2.0, 2.0, 4))]
    return sum([x * (4 ** i) for i, x in enumerate(digitized)])

#------------觀察期--------------#
for _ in range(1000):
    observation = env.reset()
    s = digitize_state(observation)
    while True:
        action = env.action_space.sample()
        observation_, reward, done, info = env.step(action)
        if done:reward = -200
        s_ = digitize_state(observation_)
        action_ = env.action_space.sample()
        q_table[s,action] = reward + 0.85*q_table[s_,action_]
        s,action = s_,action_
        if done:break
print('觀察期結(jié)束')

#------------貪心策略期--------------#
for epicode in range(1000):
    observation = env.reset()
    s = digitize_state(observation)
    while True:
        eplision = epicode / 1000
        action = q_table[s].argmax() if np.random.random() < eplision else env.action_space.sample()
        observation_, reward, done, info = env.step(action)
        if done:reward = -200
        s_ = digitize_state(observation_)
        action_ = q_table[s_].argmax() if np.random.random() < eplision else env.action_space.sample()
        q_table[s,action] = reward + 0.85*q_table[s_,action_]
        s,action = s_ ,action_
        if done:break
print('貪心策略期結(jié)束')

#------------驗(yàn)證期--------------#
scores = []
for _ in range(100):
    score = 0
    observation = env.reset()
    s = digitize_state(observation)
    while True:
        action = q_table[s].argmax()
        observation_, reward, done, info = env.step(action)
        score += reward
        s = digitize_state(observation_)
        #env.render()
        if done:
            scores.append(score)
            break
print('驗(yàn)證期結(jié)束\n驗(yàn)證成績(jī):%s'%np.max(scores))

測(cè)試:

觀察期結(jié)束
貪心策略期結(jié)束
驗(yàn)證期結(jié)束
驗(yàn)證成績(jī):200.0

倒立擺

紀(jì)要:

離散化函數(shù)原先為

def digitize_state(observation,bin=5):
    high_low = np.vstack([env.observation_space.high,env.observation_space.low]).T[:,::-1]
    bins = np.vstack([np.linspace(*i,bin) for i in high_low])
    state = [np.digitize(state,bin).tolist()  for state,bin in zip(observation,bins)]
    state = sum([value*2**index for index,value in enumerate(state)])
    return state

效果并不好却妨,在網(wǎng)上找了個(gè)好的替換:

def bins(clip_min, clip_max, num):
    return np.linspace(clip_min, clip_max, num + 1)[1:-1]

def digitize_state(observation):
    cart_pos, cart_v, pole_angle, pole_v = observation
    digitized = [np.digitize(cart_pos, bins=bins(-2.4, 2.4, 4)),
                 np.digitize(cart_v, bins=bins(-3.0, 3.0, 4)),
                 np.digitize(pole_angle, bins=bins(-0.5, 0.5, 4)),
                 np.digitize(pole_v, bins=bins(-2.0, 2.0, 4))]
    return sum([x * (4 ** i) for i, x in enumerate(digitized)])

可見(jiàn)要做好人工智能還是需要了解狀態(tài)參數(shù)大致意義,不管含義什么都喂進(jìn)智能體的話括眠,智能體表現(xiàn)不會(huì)太好彪标。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市掷豺,隨后出現(xiàn)的幾起案子捞烟,更是在濱河造成了極大的恐慌,老刑警劉巖当船,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件题画,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡德频,警方通過(guò)查閱死者的電腦和手機(jī)苍息,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)壹置,“玉大人竞思,你說(shuō)我怎么就攤上這事〕ぃ” “怎么了盖喷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)难咕。 經(jīng)常有香客問(wèn)我课梳,道長(zhǎng),這世上最難降的妖魔是什么余佃? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任惦界,我火速辦了婚禮,結(jié)果婚禮上咙冗,老公的妹妹穿的比我還像新娘沾歪。我一直安慰自己,他們只是感情好雾消,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布灾搏。 她就那樣靜靜地躺著挫望,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狂窑。 梳的紋絲不亂的頭發(fā)上媳板,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音泉哈,去河邊找鬼蛉幸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丛晦,可吹牛的內(nèi)容都是我干的奕纫。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼烫沙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼匹层!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起锌蓄,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤升筏,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后瘸爽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體您访,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年剪决,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洋只。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昼捍,死狀恐怖识虚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妒茬,我是刑警寧澤担锤,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站乍钻,受9級(jí)特大地震影響肛循,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜银择,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一多糠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸说搅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)只怎。三九已至,卻和暖如春怜俐,著一層夾襖步出監(jiān)牢的瞬間身堡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工拍鲤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贴谎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓季稳,卻偏偏與公主長(zhǎng)得像擅这,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绞幌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容