第六章 更多監(jiān)督訓(xùn)練

轉(zhuǎn)載于:http://www.javagame.top/column/1/DXBLOG202202160939286734769/detail.html

介紹Lunar Lander示例

監(jiān)督訓(xùn)練沒(méi)有訓(xùn)練集

使用遺傳算法

使用模擬退火算法

遺傳算法和模擬退火算法的訓(xùn)練集


到目前為止蔗牡,本書(shū)僅僅探索了訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)使用的是監(jiān)督傳播訓(xùn)練方法,這章將看看一些非傳播訓(xùn)練技術(shù)嗅剖,本章的神經(jīng)網(wǎng)絡(luò)將在沒(méi)有訓(xùn)練集的情況下進(jìn)行訓(xùn)練辩越,但依然在經(jīng)常被用來(lái)幫助訓(xùn)練神經(jīng)網(wǎng)絡(luò)的輸出反饋的監(jiān)督下。我們將不提前準(zhǔn)備數(shù)據(jù)信粮。

這種訓(xùn)練有兩種常見(jiàn)的技術(shù)黔攒,模擬退火和遺傳算法,Encog提供了內(nèi)置支持强缘,本章的示例可以使用這兩種算法進(jìn)行訓(xùn)練督惰,這兩種算法都將在本章后面討論。

本章的例子展示了經(jīng)典的“月球著陸器”游戲旅掂,這款游戲已經(jīng)多次實(shí)現(xiàn)赏胚,幾乎和電腦一樣老。你可以在維基百科上閱讀更多關(guān)于Lunar Lander的游戲辞友。月球著陸器游戲的大多數(shù)變種背后的想法非常相似栅哀,示例程序的工作原理如下:月球著陸器宇宙飛船將開(kāi)始?jí)嬄湔鸢埂.?dāng)它下降時(shí),它加速留拾。著陸器可以達(dá)到最大速度戳晌,稱為“末速”。推進(jìn)器可以應(yīng)用于著陸器以減慢其降落速度痴柔。然而沦偎,燃料的數(shù)量是有限的。一旦燃料耗盡咳蔚,著陸器就會(huì)掉下來(lái)豪嚎,什么也做不了。

本章將教一個(gè)神經(jīng)網(wǎng)絡(luò)來(lái)引導(dǎo)著陸器谈火。這是一個(gè)非常簡(jiǎn)單的純文本模擬侈询。神經(jīng)網(wǎng)絡(luò)只有一個(gè)選項(xiàng)可供選擇。它可以決定啟動(dòng)推進(jìn)器糯耍,也可以關(guān)閉推進(jìn)器扔字。沒(méi)有預(yù)先建立訓(xùn)練數(shù)據(jù),也不會(huì)對(duì)神經(jīng)網(wǎng)絡(luò)如何引導(dǎo)飛行器進(jìn)行假設(shè)温技。如果使用訓(xùn)練集革为,輸入將提前提供關(guān)于神經(jīng)網(wǎng)絡(luò)在某些情況下應(yīng)該做什么的信息。對(duì)于這個(gè)例子舵鳞,神經(jīng)網(wǎng)絡(luò)將自己學(xué)習(xí)所有的東西震檩。

盡管神經(jīng)網(wǎng)絡(luò)將自己學(xué)習(xí)所有的東西,但這仍然是有監(jiān)督的訓(xùn)練蜓堕。神經(jīng)網(wǎng)絡(luò)并沒(méi)有被完全不管抛虏。它將獲得一種給神經(jīng)網(wǎng)絡(luò)評(píng)分的方法。對(duì)于評(píng)分神經(jīng)網(wǎng)絡(luò)俩滥,我們必須給它一些目標(biāo)嘉蕾,然后計(jì)算一個(gè)數(shù)值,它決定了神經(jīng)網(wǎng)絡(luò)達(dá)到目標(biāo)的程度霜旧。

這些目標(biāo)是任意的错忱,只是反映了什么被挑選出來(lái)評(píng)分網(wǎng)絡(luò)。這里總結(jié)了目標(biāo):

[if !supportLists]??[endif]盡量輕地著陸

[if !supportLists]??[endif]降落所用時(shí)間盡可能長(zhǎng)

[if !supportLists]??[endif]節(jié)約燃料

第一個(gè)目標(biāo)是不要墜毀挂据,要盡可能輕柔地撞擊月球表面以清。因此,撞擊時(shí)的任何速度都是一個(gè)很大的負(fù)分崎逃。神經(jīng)網(wǎng)絡(luò)的第二個(gè)目標(biāo)是降落所用時(shí)間盡可能長(zhǎng)掷倔。要做到這一點(diǎn),它需要盡可能長(zhǎng)時(shí)間地停留在空中个绍,并為在空中停留更長(zhǎng)時(shí)間加分勒葱。最后浪汪,還有一點(diǎn)獎(jiǎng)勵(lì):一旦飛船著陸,仍然有燃料凛虽。分?jǐn)?shù)計(jì)算可以在等式6.1中看到死遭。

score = (fuel · 10) + (velocity · 1000) + fuel ?????(6.1)?

在下一節(jié),我們將運(yùn)行月球著陸器的例子和觀察它學(xué)習(xí)著陸航天器凯旋。

6.1運(yùn)行Lunar Lander示例

運(yùn)行的月球著陸器的游戲你應(yīng)該執(zhí)行l(wèi)unarlander類呀潭。該類位于以下位置。


這個(gè)類不需要參數(shù)至非。一旦程序開(kāi)始钠署,神經(jīng)網(wǎng)絡(luò)立即開(kāi)始訓(xùn)練。在它完成之前荒椭,它會(huì)周期性地經(jīng)過(guò)50個(gè)紀(jì)元谐鼎,或者訓(xùn)練迭代。當(dāng)它開(kāi)始時(shí)戳杀,得分是負(fù)數(shù)该面。這些未經(jīng)訓(xùn)練的神經(jīng)網(wǎng)絡(luò)的早期嘗試是以高速度撞擊月球并且沒(méi)有覆蓋太多距離夭苗。

Epoch #1 Score :-299.0

Epoch #2 Score :-299.0

Epoch #3 Score :-299.0

Epoch #4 Score :-299.0

Epoch #5 Score :-299.0

Epoch #6 Score :-299.0

Epoch #7 Score :-299.0

第七次迭代后信卡,分?jǐn)?shù)開(kāi)始增加。

Epoch #8 Score :-96.0

Epoch #9 Score : 5 7 6 0.0

Epoch #10 Score : 5 7 6 0.0

Epoch #11 Score : 5 7 6 0.0

Epoch #12 Score : 5 7 6 0.0

Epoch #13 Score : 5 7 6 0.0

Epoch #14 Score : 5 7 6 0.0

Epoch #15 Score : 5 7 6 0.0

Epoch #16 Score : 5 7 6 0.0

Epoch #17 Score : 6 1 9 6.0

Epoch #18 Score : 6 1 9 6.0

Epoch #19 Score : 6 1 9 6.0

分?jǐn)?shù)會(huì)在6196停留一段時(shí)間题造,但是之后會(huì)改變傍菇。

Epoch #45 Score : 6 2 7 5.0

Epoch #46 Score : 6 2 7 5.0

Epoch #47 Score : 7 3 4 7.0

Epoch #48 Score : 7 3 4 7.0

Epoch #49 Score : 7 4 6 0.0

Epoch #50 Score : 7 4 6 0.0

到了第五十迭代,已經(jīng)達(dá)到了7460分界赔。本章所使用的訓(xùn)練技術(shù)對(duì)隨機(jī)數(shù)進(jìn)行了廣泛的應(yīng)用丢习。因此,多次運(yùn)行這個(gè)示例可能會(huì)導(dǎo)致完全不同的分?jǐn)?shù)淮悼。

更多的迭代可能產(chǎn)生了更好的訓(xùn)練神經(jīng)網(wǎng)絡(luò)咐低;然而,程序?qū)⑺拗圃?0袜腥。這個(gè)數(shù)字通常會(huì)產(chǎn)生相當(dāng)熟練的神經(jīng)飛行員见擦。一旦網(wǎng)絡(luò)得到訓(xùn)練,就與獲勝的飛行員進(jìn)行仿真羹令。遙測(cè)每秒顯示鲤屡。

神經(jīng)駕駛員把飛船保持在高空911秒。因此福侈,我們不會(huì)顯示每一個(gè)遙測(cè)報(bào)告酒来。然而,這種神經(jīng)飛行員所學(xué)的一些有趣的動(dòng)作被高亮顯示肪凛。神經(jīng)網(wǎng)絡(luò)學(xué)會(huì)最好是讓飛船自由下落一段時(shí)間堰汉。獲勝網(wǎng)絡(luò)是如何著陸的:

Elapsed : 1 s , Fuel : 200 l , Velocity :-1.6200 m/s , 9998 m

Elapsed : 2 s , Fuel : 200 l , Velocity :-3.2400 m/s , 9995 m

Elapsed : 3 s , Fuel : 200 l , Velocity :-4.8600 m/s , 9990 m

Elapsed : 4 s , Fuel : 200 l , Velocity :-6.4800 m/s , 9983 m

Elapsed : 5 s , Fuel : 200 l , Velocity :-8.1000 m/s , 9975 m

Elapsed : 6 s , Fuel : 200 l , Velocity :-9.7200 m/s , 9965 m

Elapsed : 7 s , Fuel : 200 l , Velocity :-11.3400 m/s , 9954 m

Elapsed : 8 s , Fuel : 200 l , Velocity :-12.9600 m/s , 9941 m

Elapsed : 9 s , Fuel : 200 l , Velocity :-14.5800 m/s , 9927 m

Elapsed : 10 s , Fuel : 200 l , Velocity :-16.2000 m/s , 9910 m

Elapsed : 11 s , Fuel : 200 l , Velocity :-17.8200 m/s , 9893 m

Elapsed : 12 s , Fuel : 200 l , Velocity :-19.4400 m/s , 9873 m

Elapsed : 13 s , Fuel : 200 l , Velocity :-21.0600 m/s , 9852 m

Elapsed : 14 s , Fuel : 200 l , Velocity :-22.6800 m/s , 9829 m

Elapsed : 15 s , Fuel : 200 l , Velocity :-24.3000 m/s , 9805 m

Elapsed : 16 s , Fuel : 200 l , Velocity :-25.9200 m/s , 9779 m

Elapsed : 17 s , Fuel : 200 l , Velocity :-27.5400 m/s , 9752 m

Elapsed : 18 s , Fuel : 200 l , Velocity :-29.1600 m/s , 9722 m

Elapsed : 19 s , Fuel : 200 l , Velocity :-30.7800 m/s , 9692 m

Elapsed : 20 s , Fuel : 200 l , Velocity :-32.4000 m/s , 9659 m

Elapsed : 21 s , Fuel : 200 l , Velocity :-34.0200 m/s , 9625 m

Elapsed : 22 s , Fuel : 200 l , Velocity :-35.6400 m/s , 9590 m

Elapsed : 23 s , Fuel : 200 l , Velocity :-37.2600 m/s , 9552 m

Elapsed : 24 s , Fuel : 200 l , Velocity :-38.8800 m/s , 9514 m

Elapsed : 25 s , Fuel : 200 l , Velocity :-40.0000 m/s , 9473 m

Elapsed : 26 s , Fuel : 200 l , Velocity :-40.0000 m/s , 9431 m

Elapsed : 27 s , Fuel : 200 l , Velocity :-40.0000 m/s , 9390 m f

你可以看到辽社,在27秒和離地面9390米處,已經(jīng)到達(dá)了40米/秒的終端速度翘鸭。沒(méi)有什么科學(xué)依據(jù)- 40米/秒是終端速度爹袁,它只是作為一個(gè)任意數(shù)選擇。終端速度是很有趣的矮固,因?yàn)樯窠?jīng)網(wǎng)絡(luò)知道一旦達(dá)到這個(gè)目標(biāo)失息,飛行器就不會(huì)加速。他們使用終端速度來(lái)節(jié)省燃料档址,當(dāng)接近地面時(shí)“中斷它們的下落”盹兢。自由落體的終端速度持續(xù)一段時(shí)間。

最后守伸,在地面6102米處绎秒,推進(jìn)器第一次點(diǎn)火。

Elapsed : 105 s , Fuel : 200 l , Velocity :-40.0000 m/s , 6143 m

Elapsed : 106 s , Fuel : 200 l , Velocity :-40.0000 m/s , 6102 m

THRUST

Elapsed : 107 s , Fuel : 199 l , Velocity :-31.6200 m/s , 6060 m

Elapsed : 108 s , Fuel : 199 l , Velocity :-33.2400 m/s , 6027 m

Elapsed : 109 s , Fuel : 199 l , Velocity :-34.8600 m/s , 5992 m

Elapsed : 110 s , Fuel : 199 l , Velocity :-36.4800 m/s , 5956 m

Elapsed : 111 s , Fuel : 199 l , Velocity :-38.1000 m/s , 5917 m

Elapsed : 112 s , Fuel : 199 l , Velocity :-39.7200 m/s , 5878 m

THRUST

Elapsed : 113 s , Fuel : 198 l , Velocity :-31.3400 m/s , 5836 m

Elapsed : 114 s , Fuel : 198 l , Velocity :-32.9600 m/s , 5803 m

Elapsed : 115 s , Fuel : 198 l , Velocity :-34.5800 m/s , 5769 m

Elapsed : 116 s , Fuel : 198 l , Velocity :-36.2000 m/s , 5733 m

Elapsed : 117 s , Fuel : 198 l , Velocity :-37.8200 m/s , 5695 m

速度被逐漸減慢尼摹,神經(jīng)網(wǎng)絡(luò)決定每6秒點(diǎn)一次火见芹。保持速度在-35 m/s左右。

THRUST

Elapsed : 118 s , Fuel : 197 l , Velocity :-29.4400 m/s , 5655 m

Elapsed : 119 s , Fuel : 197 l , Velocity :-31.0600 m/s , 5624 m

Elapsed : 120 s , Fuel : 197 l , Velocity :-32.6800 m/s , 5592 m

Elapsed : 121 s , Fuel : 197 l , Velocity :-34.3000 m/s , 5557 m

Elapsed : 122 s , Fuel : 197 l , Velocity :-35.9200 m/s , 5521 m

THRUST

Elapsed : 123 s , Fuel : 196 l , Velocity :-27.5400 m/s , 5484 m

Elapsed : 124 s , Fuel : 196 l , Velocity :-29.1600 m/s , 5455 m

Elapsed : 125 s , Fuel : 196 l , Velocity :-30.7800 m/s , 5424 m

Elapsed : 126 s , Fuel : 196 l , Velocity :-32.4000 m/s , 5392 m

Elapsed : 127 s , Fuel : 196 l , Velocity :-34.0200 m/s , 5358 m

Elapsed : 128 s , Fuel : 196 l , Velocity :-35.6400 m/s , 5322 m

THRUST

當(dāng)飛行器接近月球表面時(shí)蠢涝,最大速度開(kāi)始下降玄呛。當(dāng)飛行器接近月球表面時(shí),飛行員正減慢速度和二。大約離地面4,274米時(shí)徘铝,神經(jīng)網(wǎng)絡(luò)決定應(yīng)該每5秒反推一次。速度減緩到-28 m/s惯吕。

THRUST

Elapsed : 163 s , Fuel : 189 l , Velocity :-22.3400 m/s , 4274 m

Elapsed : 164 s , Fuel : 189 l , Velocity :-23.9600 m/s , 4250 m

Elapsed : 165 s , Fuel : 189 l , Velocity :-25.5800 m/s , 4224 m

Elapsed : 166 s , Fuel : 189 l , Velocity :-27.2000 m/s , 4197 m

Elapsed : 167 s , Fuel : 189 l , Velocity :-28.8200 m/s , 4168 m

THRUST

Elapsed : 168 s , Fuel : 188 l , Velocity :-20.4400 m/s , 4138 m

Elapsed : 169 s , Fuel : 188 l , Velocity :-22.0600 m/s , 4116 m

Elapsed : 170 s , Fuel : 188 l , Velocity :-23.6800 m/s , 4092 m

Elapsed : 171 s , Fuel : 188 l , Velocity :-25.3000 m/s , 4067 m

Elapsed : 172 s , Fuel : 188 l , Velocity :-26.9200 m/s , 4040 m

Elapsed : 173 s , Fuel : 188 l , Velocity :-28.5400 m/s , 4011 m

THRUST

通過(guò)偶爾使用更短的周期惕它,神經(jīng)飛行員減慢它達(dá)到離地面906米的地方使用了更多時(shí)間。飛船已經(jīng)減慢到每秒14米废登。

THRUST

Elapsed : 320 s , Fuel : 162 l , Velocity :-6.6800 m/s , 964 m

Elapsed : 321 s , Fuel : 162 l , Velocity :-8.3000 m/s , 955 m

Elapsed : 322 s , Fuel : 162 l , Velocity :-9.9200 m/s , 945 m

Elapsed : 323 s , Fuel : 162 l , Velocity :-11.5400 m/s , 934 m

Elapsed : 324 s , Fuel : 162 l , Velocity :-13.1600 m/s , 921 m

Elapsed : 325 s , Fuel : 162 l , Velocity :-14.7800 m/s , 906 m

THRUST

Elapsed : 326 s , Fuel : 161 l , Velocity :-6.4000 m/s , 890 m

Elapsed : 327 s , Fuel : 161 l , Velocity :-8.0200 m/s , 882 m

Elapsed : 328 s , Fuel : 161 l , Velocity :-9.6400 m/s , 872 m

Elapsed : 329 s , Fuel : 161 l , Velocity :-11.2600 m/s , 861 m

Elapsed : 330 s , Fuel : 161 l , Velocity :-12.8800 m/s , 848 m

Elapsed : 331 s , Fuel : 161 l , Velocity :-14.5000 m/s , 833 m

THRUST

這種短程循環(huán)一直持續(xù)到飛船減慢速度為止淹魄。它甚至達(dá)到了在飛行的最后幾秒增加了高度。

Elapsed : 899 s , Fuel : 67 l , Velocity : 5.3400 m/s , 2 m

Elapsed : 900 s , Fuel : 67 l , Velocity : 3.7200 m/s , 5 m

Elapsed : 901 s , Fuel : 67 l , Velocity : 2.1000 m/s , 8 m

Elapsed : 902 s , Fuel : 67 l , Velocity : 0.4800 m/s , 8 m

Elapsed : 903 s , Fuel : 67 l , Velocity :-1.1400 m/s , 7 m

Elapsed : 904 s , Fuel : 67 l , Velocity :-2.7600 m/s , 4 m

THRUST

Elapsed : 905 s , Fuel : 66 l , Velocity : 5.6200 m/s , 0 m

Elapsed : 906 s , Fuel : 66 l , Velocity : 4.0000 m/s , 4 m

Elapsed : 907 s , Fuel : 66 l , Velocity : 2.3800 m/s , 6 m

Elapsed : 908 s , Fuel : 66 l , Velocity : 0.7600 m/s , 7 m

Elapsed : 909 s , Fuel : 66 l , Velocity :-0.8600 m/s , 6 m

Elapsed : 910 s , Fuel : 66 l , Velocity :-2.4800 m/s , 4 m

THRUST

Elapsed : 911 s , Fuel : 65 l , Velocity : 5.9000 m/s , 0 m

Finally, the craft lands, with a very soft velocity of positive 5.9. You wonder why the lander lands with a velocity of 5.9. This is due to a slight glitch in the program. This “glitch” is left in because it illustrates an important point: when neural networks are allowed to learn, they are totally on their own and will take advantage of everything they can find.

最后堡距,飛船降落甲锡,以非常軟的速度為正5.9。

你想知道為什么著陸器以5.9的速度著陸吏颖。這是由于程序中有一點(diǎn)小毛病搔体。這個(gè)“小故障”之所以存在,是因?yàn)樗f(shuō)明了一個(gè)重要的問(wèn)題:當(dāng)神經(jīng)網(wǎng)絡(luò)被允許學(xué)習(xí)時(shí)半醉,它們完全是自己的疚俱,并且將利用他們所能找到的一切。

最后的正速度是因?yàn)槌绦驔Q定它是否要作為模擬周期的最后一部分進(jìn)行推力缩多。這個(gè)程序已經(jīng)決定了飛船的高度在零以下呆奕,并且著陸了养晋。而神經(jīng)網(wǎng)絡(luò)最后一個(gè)“亂入的”推力,雖然飛行器已登陸這個(gè)推力沒(méi)用梁钾。然而绳泉,最后的推力確實(shí)增加了神經(jīng)網(wǎng)絡(luò)的得分。

回看方程式6.1姆泻。在著陸時(shí)每秒鐘的負(fù)速度每秒零酪,程序得分減少1000。這個(gè)程序發(fā)現(xiàn)相反的情況也是這樣拇勃。對(duì)于每米每秒的正速度四苇,它也得到1000點(diǎn)。通過(guò)學(xué)習(xí)程序中的這個(gè)小魔鬼方咆,神經(jīng)飛行員可以獲得更高的分?jǐn)?shù)月腋。

神經(jīng)飛行員學(xué)習(xí)了一些非常有趣的東西,盡管沒(méi)有預(yù)先設(shè)計(jì)策略瓣赂。網(wǎng)絡(luò)學(xué)習(xí)到了它想做什么榆骚。具體來(lái)說(shuō),這個(gè)飛行員決定如下:

[if !supportLists]??[endif]自由落體一段時(shí)間煌集,利用終端速度優(yōu)勢(shì)

[if !supportLists]??[endif]在某一點(diǎn)上妓肢,打破自由落體,減緩飛行器下降速度

[if !supportLists]??[endif]接近地面時(shí)慢慢減小速度

[if !supportLists]??[endif]著陸后給最后一個(gè)推力牙勘,最大限度地得分


本例中的神經(jīng)飛行員使用遺傳算法進(jìn)行訓(xùn)練职恳。遺傳算法和模擬退火將在本章后面討論。首先方面,我們將了解著陸器是如何模擬的,以及它的得分是如何計(jì)算出來(lái)的色徘。

6.2檢查月球著陸模擬器

我們現(xiàn)在將研究如何通過(guò)物理模擬創(chuàng)建月球著陸器的例子恭金,以及神經(jīng)網(wǎng)絡(luò)實(shí)際上如何引導(dǎo)航天器。最后褂策,我們將看到神經(jīng)網(wǎng)絡(luò)如何學(xué)習(xí)成為一個(gè)更好的飛行員横腿。

6.2.1模擬著陸器

首先,我們需要一個(gè)模擬物理著陸月球的類斤寂」⒑福“物理學(xué)”這個(gè)詞使用得很隨意。這個(gè)例子的目的更多地是關(guān)于一個(gè)神經(jīng)網(wǎng)絡(luò)如何適應(yīng)一個(gè)人工環(huán)境而不是任何一種真實(shí)的物理模擬遍搞。

所有的物理仿真代碼都包含在landersimulator類罗侯。可以在以下位置找到此類溪猿。

這個(gè)類首先定義一些對(duì)模擬非常重要的常量钩杰。

重力常數(shù)定義了月球重力加速度纫塌。設(shè)置為1.62,以米每秒計(jì)算讲弄。推力常數(shù)規(guī)定了每秒抵消重力加速度的量措左。終端速度是航天器可以向上或向下移動(dòng)的最快速度。

除了這些常量之外避除,模擬器程序還需要幾個(gè)實(shí)例變量來(lái)維護(hù)狀態(tài)怎披。這些變量如下所示

燃料變量保存燃料剩余量。秒變量保存停留空中的秒數(shù)瓶摆。海拔高度保存當(dāng)前高度钳枕。速度變量保存當(dāng)前速度。正數(shù)表明飛船在向上移動(dòng)赏壹。負(fù)數(shù)表明飛船在向下移動(dòng)鱼炒。

模擬器在下面的構(gòu)造函數(shù)中將值設(shè)置為合理的起始值:

飛船以200升燃料開(kāi)始,高度設(shè)置在10000米以上蝌借。

Turn方法處理每個(gè)“轉(zhuǎn)換”昔瞧。在模擬器中一次轉(zhuǎn)換是一秒。推力參數(shù)表明飛船在這次轉(zhuǎn)換過(guò)程中是否希望啟動(dòng)推力菩佑。

首先自晰,秒數(shù)加1,表示逝去1秒稍坯。用重力常數(shù)GRAVITY來(lái)降低速度以模擬下降酬荞。

當(dāng)前速度增大了海拔高度。當(dāng)然瞧哟,如果速度是負(fù)的混巧,高度就會(huì)降低。

如果在這個(gè)轉(zhuǎn)換處施加了推力勤揩,則將燃油fuel減少一咧党,并通過(guò)推力常數(shù)THRUST增加速度。

飛行器的下降或上升速度不能大于終端速度陨亡。下面的代碼確保著陸器的上升速度不超過(guò)終端速度傍衡。

下面代碼確保我們下降速度不大于終端速度。

下面代碼確保高度不會(huì)降到零以下负蠕。這是很重要的蛙埂,以防止飛行器模擬著陸太硬以至于闖到地下去。

除了模擬代碼遮糖,landersimulator還提供了兩個(gè)實(shí)用功能绣的。第一個(gè)計(jì)算的分?jǐn)?shù),應(yīng)該只在航天器著陸后調(diào)用。此處顯示此方法被辑。

記分方法實(shí)現(xiàn)等式6.1燎悍。正如你所看到的,它使用fuel燃料盼理、seconds秒和velocity速度來(lái)計(jì)算分?jǐn)?shù)谈山。

此外,還提供了一種確定飛船是否仍在飛行的方法宏怔。如果高度大于零奏路,它仍在飛行。

在下一節(jié)中臊诊,我們將看到神經(jīng)網(wǎng)絡(luò)是如何實(shí)際飛行并獲得一個(gè)分?jǐn)?shù)的鸽粉。


6.2.2計(jì)算分?jǐn)?shù)

PilotScor類實(shí)現(xiàn)飛行航天器的神經(jīng)網(wǎng)絡(luò)所需的代碼。這個(gè)類還計(jì)算在登陸后的最終得分抓艳。這個(gè)類如清單6.1所示触机。

正如你可以看到下面代碼,這PilotScore類實(shí)現(xiàn)CalculateScore接口玷或。

Encog的模擬退火和遺傳算法都使用了CalculateScore接口儡首,來(lái)確定神經(jīng)網(wǎng)絡(luò)在解決被給的問(wèn)題時(shí)效率如何。根據(jù)不同的問(wèn)題偏友,低分可以是壞的也可以是好的蔬胯。

CalculateScore接口要求兩個(gè)方法。方法一被稱為calculateNetworkScore位他。此方法接受一個(gè)神經(jīng)網(wǎng)絡(luò)氛濒,返回一個(gè)表示網(wǎng)絡(luò)分?jǐn)?shù)的double。

第二個(gè)方法返回一個(gè)值來(lái)指示分?jǐn)?shù)是否應(yīng)該最小化鹅髓。

對(duì)于這個(gè)例子舞竿,我們想最大化得分。作為結(jié)果迈勋,shouldMinimize方法返回false

?

6.2.3駕駛宇宙飛船

本節(jié)展示了神經(jīng)網(wǎng)絡(luò)是如何實(shí)際飛行的炬灭。神經(jīng)網(wǎng)絡(luò)將提供環(huán)境信息,如燃料剩余靡菇、高度和當(dāng)前速度。然后神經(jīng)網(wǎng)絡(luò)輸出一個(gè)值米愿,表示神經(jīng)網(wǎng)絡(luò)是否希望啟動(dòng)推力厦凤。NeuralPilot類執(zhí)行此飛行∮叮可以在以下位置看到NeuralPilot類:

NeuralPilot構(gòu)造函數(shù)設(shè)置飛行的航天器较鼓。該構(gòu)造函數(shù)通過(guò)一個(gè)網(wǎng)絡(luò)來(lái)飛行飛船,以及一個(gè)布爾值,指示是否應(yīng)該跟蹤到屏幕上的遙測(cè)博烂。

月球著陸器必須將燃料水平香椎、高度和當(dāng)前速度反饋給神經(jīng)網(wǎng)絡(luò)。這些值必須規(guī)范化禽篱,如第2章所述畜伐。為了實(shí)現(xiàn)這種規(guī)范化,構(gòu)造函數(shù)首先設(shè)置幾個(gè)規(guī)范化字段躺率。

除了規(guī)范化字段之外玛界,我們還將保存操作參數(shù)。跟蹤變量保存到實(shí)例級(jí)別悼吱,以便程序稍后知道它是否應(yīng)該顯示遙測(cè)慎框。

神經(jīng)飛行員將有三個(gè)輸入神經(jīng)元和一個(gè)輸出神經(jīng)元。這三個(gè)輸入神經(jīng)元將向神經(jīng)網(wǎng)絡(luò)傳達(dá)以下三個(gè)字段后添。?Current fuel level?Current altitude?Current velocity

這三個(gè)輸入字段將產(chǎn)生一個(gè)輸出字段笨枯,指示神經(jīng)飛行員是否愿意啟動(dòng)推進(jìn)器。

規(guī)范這三個(gè)字段遇西,它們定義為三個(gè)NormalizedField對(duì)象馅精。首先,設(shè)置燃料努溃。

我們知道燃料在0到200之間硫嘶。我們將把這個(gè)標(biāo)準(zhǔn)化到0.9到10.9的范圍。這與范圍- 1至1是非常相似的梧税,除非它不采取價(jià)值的方式到極端沦疾。這有時(shí)會(huì)幫助神經(jīng)網(wǎng)絡(luò)更好地學(xué)習(xí)。尤其是當(dāng)全范圍已知時(shí)第队。

接下來(lái)設(shè)置速度和高度哮塞。

速度和高度都知道范圍,像燃料一樣凳谦。其結(jié)果是忆畅,速度建立起來(lái)類似于燃料和高度。

因?yàn)槲覀儧](méi)有訓(xùn)練數(shù)據(jù)尸执,所以知道范圍是非常重要的家凯。這與第2章中提供的確定最小值和最大值的示例數(shù)據(jù)不同。

在這個(gè)例子中如失,飛行宇宙飛船的主要目的是獲得一個(gè)分?jǐn)?shù)绊诲。scorePilot方法計(jì)算這個(gè)分?jǐn)?shù)。它將模擬一個(gè)飛船從軌道一點(diǎn)降落到著陸點(diǎn)的飛行褪贵。scorePilot方法計(jì)算這個(gè)分?jǐn)?shù):

該方法首先創(chuàng)建一個(gè)LanderSimulator對(duì)象來(lái)模擬被該程序采用的非常簡(jiǎn)單的物理掂之。

我們現(xiàn)在進(jìn)入的scorePilot方法主循環(huán)抗俄。只要飛船還在飛行,它就會(huì)繼續(xù)循環(huán)世舰。只要它的高度大于零动雹,宇宙飛船仍在飛行。

首先創(chuàng)建一個(gè)數(shù)組來(lái)保存從模擬器直接獲得的原始數(shù)據(jù)跟压。

規(guī)范化方法的NormalizedField對(duì)象用于實(shí)際規(guī)范燃料文件胰蝠,高度和速度。

這個(gè)單輸出神經(jīng)元將決定推進(jìn)器是否應(yīng)該被啟動(dòng)裆馒。

如果值大于零姊氓,則推進(jìn)器將被啟動(dòng)。如果飛船正在跟蹤喷好,那么也會(huì)顯示推進(jìn)器被啟動(dòng)了翔横。

在模擬器中處理下一個(gè)“轉(zhuǎn)換”,必要時(shí)進(jìn)行推力梗搅。如果飛船跟蹤禾唁,也顯示遙測(cè)。

宇宙飛船現(xiàn)在著陸了无切。根據(jù)前面討論的標(biāo)準(zhǔn)返回分?jǐn)?shù)荡短。

現(xiàn)在我們來(lái)看看如何訓(xùn)練神經(jīng)飛行員。

6.3訓(xùn)練神經(jīng)飛行員

這個(gè)例子可以使用遺傳算法或模擬退火訓(xùn)練神經(jīng)飛行員哆键。encog將遺傳算法和模擬退火算法非常類似地對(duì)待掘托。一方面,您可以簡(jiǎn)單地提供一個(gè)訓(xùn)練集和使用模擬退火籍嘹,或者您可以使用一個(gè)遺傳算法闪盔,就像在一個(gè)傳播網(wǎng)絡(luò)中一樣。我們將在本章后面看到一個(gè)例子辱士,我們將這兩種技術(shù)應(yīng)用于XOR問(wèn)題泪掀。這將表明它們與傳播訓(xùn)練有多么相似。

另一方面颂碘,遺傳算法和模擬退火可以做一些傳播訓(xùn)練不能做的事情异赫。他們可以讓你在沒(méi)有訓(xùn)練集的情況下進(jìn)行訓(xùn)練。由于本章前面開(kāi)發(fā)了一個(gè)評(píng)分類头岔,它仍然是有監(jiān)督的培訓(xùn)塔拳。但是,它不需要訓(xùn)練數(shù)據(jù)輸入峡竣。相反蝙斜,神經(jīng)網(wǎng)絡(luò)需要輸入它所做的工作有多好的標(biāo)準(zhǔn)。如果能提供這種評(píng)分函數(shù)澎胡,模擬退火算法或遺傳算法可以訓(xùn)練神經(jīng)網(wǎng)絡(luò)。這兩種方法將在接下來(lái)的章節(jié)中討論,遺傳算法開(kāi)始攻谁。


6.3.1什么是遺傳算法

遺傳算法試圖模擬達(dá)爾文的進(jìn)化來(lái)創(chuàng)造一個(gè)更好的神經(jīng)網(wǎng)絡(luò)稚伍。神經(jīng)網(wǎng)絡(luò)被簡(jiǎn)化為一個(gè)double變量數(shù)組。這個(gè)數(shù)組變成了基因序列戚宦。遺傳算法首先是建立一個(gè)隨機(jī)神經(jīng)網(wǎng)絡(luò)種群个曙。這個(gè)群體中的所有神經(jīng)網(wǎng)絡(luò)都具有相同的結(jié)構(gòu)线定,這意味著它們具有相同數(shù)量的神經(jīng)元和層贰镣。然而,它們都有不同的隨機(jī)權(quán)重识樱。

這些神經(jīng)網(wǎng)絡(luò)按“分?jǐn)?shù)”排序艳汽,其得分由評(píng)分方法提供猴贰,如上一節(jié)所討論的。在神經(jīng)飛行員的例子中河狐,這個(gè)分?jǐn)?shù)表明飛船降落的多軟米绕。

頂部的神經(jīng)網(wǎng)絡(luò)被選中來(lái)“繁殖”。底層神經(jīng)網(wǎng)絡(luò)“死亡”馋艺。當(dāng)兩個(gè)網(wǎng)絡(luò)繁殖時(shí)栅干,通過(guò)拼接DNA來(lái)模擬大自然。在這種情況下捐祠,接頭是來(lái)自每個(gè)網(wǎng)絡(luò)的雙數(shù)組拼接在一起碱鳞,創(chuàng)建一個(gè)新的子代神經(jīng)網(wǎng)絡(luò)。子代神經(jīng)網(wǎng)絡(luò)占據(jù)了垂死的神經(jīng)網(wǎng)絡(luò)空出的位置踱蛀。

有些后代會(huì)“突變”。也就是說(shuō)星岗,一些遺傳物質(zhì)是隨機(jī)的允华,而不是來(lái)自雙親。這就引入了基因庫(kù)中需要的多樣性寥掐,并模擬了突變的自然過(guò)程召耘。

種群被排序百炬,這個(gè)過(guò)程又開(kāi)始了。每次迭代提供一個(gè)循環(huán)污它。正如你所看到的,不需要訓(xùn)練集歇攻。所有需要的是一個(gè)對(duì)象來(lái)評(píng)分每個(gè)神經(jīng)網(wǎng)絡(luò)梆造。當(dāng)然镇辉,您可以提供一個(gè)得分對(duì)象使用的訓(xùn)練集忽肛,該對(duì)象使用訓(xùn)練集來(lái)對(duì)每個(gè)網(wǎng)絡(luò)進(jìn)行評(píng)分。


6.3.2使用遺傳算法

使用遺傳算法非常簡(jiǎn)單箍镜,使用NeuralGeneticAlgorithm類色迂。NeuralGeneticAlgorithm類實(shí)現(xiàn)mltrain接口歇僧。因此锋拖,一旦建成,它用的方法與其他encog訓(xùn)練類一樣侥钳。

下面的代碼創(chuàng)建訓(xùn)練神經(jīng)新對(duì)象NeuralGeneticAlgorithm舷夺。

提供基本網(wǎng)絡(luò)以將神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)與遺傳算法通信给猾。遺傳算法將忽略當(dāng)前由神經(jīng)網(wǎng)絡(luò)設(shè)置的權(quán)重敢伸。

隨機(jī)數(shù)發(fā)生器的設(shè)置使神經(jīng)網(wǎng)絡(luò)可以創(chuàng)建一個(gè)新的隨機(jī)種群池颈。與通常用的普通RangeRandomizer相比饶辙,NguyenWidrowRandomizer試圖產(chǎn)生不極端弃揽、更可訓(xùn)練的起始權(quán)重矿微。然而尚揣,兩個(gè)隨機(jī)數(shù)發(fā)生器都可用快骗。

500的值指定了種群大小方篮。較大的種群會(huì)訓(xùn)練得更好藕溅,但會(huì)占用更多的內(nèi)存和處理時(shí)間巾表。0.1個(gè)用于變異10%個(gè)后代集币。0.25值用于從居前25%的種群中選擇交配群體。

現(xiàn)在的訓(xùn)練器建好了,訓(xùn)練神經(jīng)網(wǎng)絡(luò)姜凄,就像任何encog訓(xùn)練對(duì)象那樣态秧。這里我們只重復(fù)50次扼鞋。這通常足以制造出熟練的神經(jīng)飛行員。

該神經(jīng)網(wǎng)絡(luò)也可以使用EncogUtility類訓(xùn)練,如在前一章科吭。只是簡(jiǎn)單的訓(xùn)練对人,EncogUtility通常是首選的方法拂共。然而宜狐,如果你的程序在每次迭代之后需要做些事抚恒,上面顯示的更手動(dòng)的方法可能是最好的柑爸。


6.3.3什么是模擬退化算法

模擬退火也可以用來(lái)訓(xùn)練神經(jīng)飛行員表鳍。模擬退火算法類似于遺傳算法譬圣,它也需要一個(gè)評(píng)分對(duì)象厘熟。然而绳姨,它在內(nèi)部起著截然不同的作用飘庄。模擬退火模擬冶金退火過(guò)程。

退火是一種非常熱的熔融金屬慢慢冷卻的過(guò)程迂求。這種緩慢的冷卻過(guò)程使金屬產(chǎn)生了強(qiáng)烈的揩局、一致的分子結(jié)構(gòu)掀虎。退火是一種使金屬不易斷裂或破碎的過(guò)程涩盾。

可以在神經(jīng)網(wǎng)絡(luò)上執(zhí)行類似的過(guò)程春霍。為了實(shí)現(xiàn)模擬退火址儒,將神經(jīng)網(wǎng)絡(luò)轉(zhuǎn)換為一個(gè)double數(shù)組莲趣。這與遺傳算法所做的過(guò)程完全相同喧伞。

隨機(jī)性是用來(lái)模擬散熱和冷卻效果的潘鲫。當(dāng)神經(jīng)網(wǎng)絡(luò)仍然是真正的“熱”溉仑,神經(jīng)網(wǎng)絡(luò)的現(xiàn)有權(quán)值在速度上增加浊竟。當(dāng)網(wǎng)絡(luò)冷卻時(shí)振定,這種隨機(jī)性會(huì)減慢后频。只有對(duì)網(wǎng)絡(luò)得分產(chǎn)生積極影響的改變才被保留下來(lái)徘郭。


6.3.4使用模擬退火算法

使用模擬退火訓(xùn)練神經(jīng)飛行員残揉,在運(yùn)行這個(gè)示例時(shí)抱环,在命令行上傳遞退火參數(shù)镇草。這是非常簡(jiǎn)單的使用退火的例子梯啤,而不是遺傳算法因宇。它們都使用相同的得分函數(shù)察滑,并且是可互換的贺辰。下面的代碼行使用了模擬退火算法饲化。

模擬退火NeuralSimulatedAnnealing對(duì)象是用來(lái)訓(xùn)練神經(jīng)飛行員蒋川。神經(jīng)網(wǎng)絡(luò)通過(guò)與使用遺傳算法訓(xùn)練的相同得分對(duì)象一起傳遞捺球。

10和2的值分別為起始溫度和停止溫度氮兵。就華氏度或攝氏度而言泣栈,它們不是真正的溫度南片。較高的數(shù)字會(huì)產(chǎn)生更多的隨機(jī)性疼进;較低的數(shù)字會(huì)產(chǎn)生較少的隨機(jī)性伞广。下面的代碼顯示了如何應(yīng)用這個(gè)溫度或因素嚼锄。

數(shù)字100指定從高溫到低溫每一次迭代需要多少個(gè)循環(huán)拧粪。一般來(lái)說(shuō)既们,周期越長(zhǎng),結(jié)果就越準(zhǔn)確婴氮。然而主经,數(shù)字越高罩驻,訓(xùn)練的時(shí)間就越長(zhǎng)惠遏。

對(duì)于如何設(shè)置這些值节吮,沒(méi)有簡(jiǎn)單的規(guī)則透绩。一般來(lái)說(shuō)帚豪,最好用不同的值進(jìn)行實(shí)驗(yàn)狸臣,看看哪一種訓(xùn)練你的神經(jīng)網(wǎng)絡(luò)最好固棚。

6.4使用訓(xùn)練集評(píng)分類

訓(xùn)練集也可用于遺傳算法和模擬退火厂汗。使用這種方法娶桦,模擬退火和遺傳算法與基于使用的傳播訓(xùn)練有點(diǎn)不同衷畦。使用這種方法時(shí)沒(méi)有計(jì)分功能祈争。你只是用TrainingSetScore對(duì)象菩混,以訓(xùn)練集沮峡,用它來(lái)評(píng)分神經(jīng)網(wǎng)絡(luò)。

一般來(lái)說(shuō)望薄,使用這種方式時(shí)彈性傳播優(yōu)于遺傳算法或模擬退火乡摹。遺傳算法或模擬退火算法在使用評(píng)分方法而不是訓(xùn)練集時(shí)非常出色聪廉。此外板熊,模擬退火有時(shí)可以將反向傳播從局部極小值中推出來(lái)干签。

在下面的代碼找到的helloworld應(yīng)用程序可以很容易地修改為使用遺傳算法或模擬退火算法:

要改變上面的例子來(lái)使用遺傳算法喘沿,必須添加幾行蚜印。以下幾行創(chuàng)建了一個(gè)基于訓(xùn)練集的遺傳算法窄赋。首先,創(chuàng)建一個(gè)TrainingSetScore對(duì)象错敢。

然后可以使用該對(duì)象與遺傳算法或模擬退火算法一起使用伐债。下面的代碼顯示它與一個(gè)遺傳算法一起使用:

使用TrainingSetScore對(duì)象與模擬退火萎馅,只是通過(guò)模擬退火的構(gòu)造函數(shù)傳遞糜芳,如以上所做塘辅。

6.5總結(jié)

這一章介紹了怎樣使用遺傳算法和模擬退火訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)扣墩,這兩個(gè)技術(shù)使用一個(gè)評(píng)分對(duì)象呻惕,而不是訓(xùn)練集亚脆,然而键耕,如果有需要的話這兩個(gè)算法也能使用訓(xùn)練集屈雄。

遺傳算法嘗試模擬達(dá)爾文進(jìn)化論棚亩,神經(jīng)網(wǎng)絡(luò)基于fitness排序讥蟆,最好的神經(jīng)網(wǎng)絡(luò)允許繁殖,較差的網(wǎng)絡(luò)死亡质况,下一代需要來(lái)自fitest神經(jīng)網(wǎng)絡(luò)的遺傳物質(zhì)结榄。

模擬退火是模擬冶金的退火過(guò)程臼朗,網(wǎng)絡(luò)權(quán)重從高溫到低溫,隨著溫度的降低挡毅,選擇最佳網(wǎng)絡(luò)跪呈,這就產(chǎn)生了一種適合于獲得更好分?jǐn)?shù)的神經(jīng)網(wǎng)絡(luò)薇溃。

到目前為止沐序,本書(shū)僅僅討論怎樣使用前饋神經(jīng)網(wǎng)絡(luò)堕绩,這個(gè)網(wǎng)絡(luò)訓(xùn)練使用傳播訓(xùn)練策幼,模擬退火或者是遺傳算法,前饋神經(jīng)網(wǎng)絡(luò)最常用的神經(jīng)網(wǎng)絡(luò)類型奴紧,僅僅因?yàn)樗鼈兪亲畛S玫奶亟悖筒灰馕吨鼈兛偸亲詈玫慕鉀Q方式,在下一章中黍氮,我們將看看一些其他的神經(jīng)網(wǎng)絡(luò)架構(gòu)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沫浆,一起剝皮案震驚了整個(gè)濱河市捷枯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌专执,老刑警劉巖淮捆,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異本股,居然都是意外死亡攀痊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)拄显,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)苟径,“玉大人,你說(shuō)我怎么就攤上這事躬审∩裕” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵盒件,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我舱禽,道長(zhǎng)炒刁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任誊稚,我火速辦了婚禮翔始,結(jié)果婚禮上罗心,老公的妹妹穿的比我還像新娘。我一直安慰自己城瞎,他們只是感情好渤闷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著脖镀,像睡著了一般飒箭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜒灰,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天弦蹂,我揣著相機(jī)與錄音,去河邊找鬼强窖。 笑死凸椿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翅溺。 我是一名探鬼主播脑漫,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咙崎!你這毒婦竟也來(lái)了优幸?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叙凡,失蹤者是張志新(化名)和其女友劉穎劈伴,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體握爷,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跛璧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了新啼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片追城。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖燥撞,靈堂內(nèi)的尸體忽然破棺而出座柱,到底是詐尸還是另有隱情,我是刑警寧澤物舒,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布色洞,位于F島的核電站,受9級(jí)特大地震影響冠胯,放射性物質(zhì)發(fā)生泄漏火诸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一荠察、第九天 我趴在偏房一處隱蔽的房頂上張望置蜀。 院中可真熱鬧奈搜,春花似錦、人聲如沸盯荤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秋秤。三九已至宏粤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間航缀,已是汗流浹背商架。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芥玉,地道東北人蛇摸。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像灿巧,于是被迫代替她去往敵國(guó)和親赶袄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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