日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

GFS(Genetic Fuzzy Systems)—— 基于专家先验规则库和遗传算法相结合的智能体决策算法

發(fā)布時(shí)間:2023/12/4 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GFS(Genetic Fuzzy Systems)—— 基于专家先验规则库和遗传算法相结合的智能体决策算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

      • 1. FIS 系統(tǒng)(Fuzzy Inference Systems)
        • 1.1 什么是 FIS 系統(tǒng)?
        • 1.2 使用 FIS 算法的幾個(gè)步驟
      • 2. GFS 系統(tǒng)(GA + FIS)
        • 2.1 什么是基因遺傳算法(GA)?
        • 2.2 使用GA算法進(jìn)化FIS規(guī)則庫(kù)

在大規(guī)模的多智能體集群協(xié)同任務(wù)中,DRL往往很難取得較好的效用。一旦智能體數(shù)目規(guī)模變大,聯(lián)合行為空間和聯(lián)合觀測(cè)空間規(guī)模就會(huì)變得巨大無(wú)比,因此在許多大規(guī)模的多智能體協(xié)同任務(wù)中,基于規(guī)則的控制器是解決規(guī)模龐大問題的一個(gè)有效的方法。但基于規(guī)則的方法缺陷在于:面對(duì)一個(gè)陌生場(chǎng)景下人們往往很難以制定出一套較好的規(guī)則庫(kù),這里的規(guī)則是指在 “什么樣的情況下” Agent 應(yīng)該采取什么樣的 “行為”,其中 “情況” 和 “行為” 在大多數(shù)情況下我們都能夠較為容易的獲得,但 “情況-行為” 的規(guī)則映射是難以事先確定的。為此,人們想到可以預(yù)先定義一些隨機(jī)的規(guī)則,通過遺傳算法來(lái)嘗試對(duì)這些規(guī)則進(jìn)行重組,通過查看新規(guī)則在場(chǎng)景中的得分,摒棄低得分的規(guī)則,保留高得分的規(guī)則,最終自我學(xué)習(xí)出一套較為完備的規(guī)則庫(kù),這就是 GFS 的由來(lái)。

【參考連接】:GFS原理鏈接,FIS代碼包鏈接。

1. FIS 系統(tǒng)(Fuzzy Inference Systems)

1.1 什么是 FIS 系統(tǒng)?

FIS(Fuzzy Inference Systems)的全稱是模糊推理系統(tǒng),其主要作用是對(duì)變量做 “模糊化” 和 “去模糊化”(參考資料:這里)。那么什么是模糊化和去模糊化?這里用一個(gè)例子作為引入:假設(shè)你是一個(gè)應(yīng)屆畢業(yè)生,現(xiàn)在需要選擇一個(gè)工作,那么你在挑選工作的時(shí)候可能會(huì)有這么幾個(gè)標(biāo)準(zhǔn):

  • 薪資高,工作時(shí)長(zhǎng)少,優(yōu)先考慮
  • 薪資高,工作時(shí)長(zhǎng)一般,一般考慮
  • 薪資一般,工作時(shí)長(zhǎng)長(zhǎng),一般考慮
  • 薪資低,不考慮 (不管工作時(shí)間長(zhǎng)短,只要工資低就不考慮)
  • 現(xiàn)在有幾家 offer 擺在了你面前,工作時(shí)長(zhǎng)和薪資待遇都開放給你,你需要設(shè)計(jì)一個(gè)系統(tǒng)來(lái)幫你選擇去哪一家公司,你該如何讓計(jì)算機(jī)來(lái)理解你的標(biāo)準(zhǔn)呢?你該怎么樣讓計(jì)算機(jī)明白薪資多少算是 “高”,多少工作時(shí)長(zhǎng)才算 ”長(zhǎng)“?其實(shí)這里的 “薪資高” 和 “時(shí)長(zhǎng)少” 都是人們內(nèi)心的主觀概念,人們也很難具體說出一個(gè)具體的數(shù)字,只能根據(jù)一個(gè)具體的數(shù)字來(lái)大致判斷這個(gè)數(shù)字是 “多” 還是 “少”,這就是 “模糊邏輯” 的概念,即將一個(gè)連續(xù)變量的值做模糊化,使其具體的數(shù)值被模糊為一個(gè)程度值。這里可以簡(jiǎn)單理解為將一個(gè)具體的數(shù)值做分類,其被分類為 “少”、“中”、“多” 三類中的哪一類(真實(shí)得到的輸出是這個(gè)值被分為這三類分別的置信度是多少,這和 softmax 函數(shù)的概念很像,如果不能理解就簡(jiǎn)單理解為歸類為著三類中的其中一類就行了)。

    因此,FIS 的核心思想就在于:將連續(xù)變量模糊化,根據(jù)既定的規(guī)則得到一個(gè)模糊化的行為,最終再將這個(gè)行為去模糊化。 注意,通過模糊化后推理出的行為也是一個(gè)模糊變量,拿上面的例子來(lái)說,在薪資高工作時(shí)長(zhǎng)一般的時(shí)候,所采取的行為是 “優(yōu)先考慮”,代表你很愿意去選擇這個(gè)工作,“愿意程度” 其本質(zhì)也應(yīng)該是一個(gè)模糊變量,最終具體選擇這個(gè)工作與否需要你自己根據(jù) “愿意程度” 來(lái)作參考進(jìn)行選擇,這個(gè)過程就叫做 “去模糊化”。

    1.2 使用 FIS 算法的幾個(gè)步驟

    使用 FIS 算法做推理包含以下幾個(gè)關(guān)鍵性的步驟:

  • 對(duì)輸入變量做模糊化(分配隸屬函數(shù))
  • 制定推理規(guī)則(根據(jù)輸入值推斷行為動(dòng)作)
  • 行為模糊變量推理,去模糊化行為變量
  • 得到具體行為
  • 以上 4 步是使用 FIS 算法最基本的 4 個(gè)步驟,下面將結(jié)合上面說到的找工作例子,使用 FIS 模糊推理來(lái)根據(jù)不同 offer 的薪資和工作時(shí)長(zhǎng)來(lái)決定是否接受這個(gè) offer。

    • 輸入變量模糊化(分配隸屬函數(shù))

    我們之前提到,對(duì)于一個(gè)輸入變量具體值,我們需要對(duì)其進(jìn)行模糊化,使其變?yōu)?“程度變量”,隸屬函數(shù)的作用就是用來(lái)表征一個(gè)具體變量值屬于“高”、“中”、“低”三種程度的置信度。我們假設(shè)給定薪資范圍為:20 ~ 32(w),工作時(shí)長(zhǎng)為:6 ~ 12(小時(shí)),我們畫出這兩個(gè)變量的隸屬函數(shù)圖像:

    其中,“poor”、“average”、“good” 分別代表 “低”、“中”、“高” 三種不同的程度,隸屬函數(shù)就是這個(gè)三角形的函數(shù)。怎么根據(jù)隸屬函數(shù)來(lái)判斷一個(gè)具體的薪資值屬于哪一種程度呢?我們看這個(gè)圖的縱坐標(biāo),這是一個(gè) 0 ~ 1 的取值,y 軸的值就是代表這個(gè)值屬于這個(gè)程度的“置信度”。舉例來(lái)說,我們看橫坐標(biāo)為 26 的點(diǎn),這個(gè)橫坐標(biāo)對(duì)應(yīng)的黃色線(average)的 y 值取值為 1,這代表 26w 的年薪在整個(gè)年薪區(qū)間中屬于 “薪資中等” 這一個(gè)程度。我們現(xiàn)在換一個(gè)不這么特殊的點(diǎn),當(dāng)橫坐標(biāo)為 24 的時(shí)候,藍(lán)線(poor)和黃線(average)都會(huì)有其對(duì)應(yīng)的 y 值,藍(lán)線取值大概在 0.4 左右,黃線取值大概在 0.6 左右,這意味著 24w 的薪資有 0.4 的置信度被認(rèn)為是 “薪資低”,0.6 的置信度被認(rèn)為是 “薪資中等”。因此,通過隸屬函數(shù)我們能夠輕松的將一個(gè)輸入的 “具體值” 映射到一個(gè) “程度” 上,這就是輸入變量的模糊化。 工作時(shí)長(zhǎng)的隸屬函數(shù)也是同理,這里直接放上結(jié)果圖,不再做分析:

    • 制定推理規(guī)則(根據(jù)輸入值推斷行為動(dòng)作)

    至此,我們已經(jīng)成功將輸入變量模糊化了,接下來(lái)我們需要制定規(guī)則,即在什么情況下采取什么樣的行為。參照 1.1 中提到的 4 條規(guī)則,這里我們把這些規(guī)則變成 FIS 算法內(nèi)部需要的規(guī)則格式。在 FIS 算法中,一條規(guī)則長(zhǎng)這個(gè)樣子:

    If "薪資高" and "工作時(shí)長(zhǎng)少" Then "很愿意接受這份工作"

    可以看出來(lái),在 FIS 算法內(nèi)部,規(guī)則由 “規(guī)則前件” + “行為后件” 組成,即 If 后面到 Then 之前的部分為規(guī)則前件,由多個(gè)模糊變量組成,各模糊變量之間由邏輯運(yùn)算符 and 或者 or 連接;Then 之后為行為后件,代表在這樣的規(guī)則下應(yīng)該采取哪一個(gè)行為。邏輯運(yùn)算符 and 和 or 用于表示各模糊變量之間的關(guān)聯(lián)關(guān)系,這里的 and 和 or 和平時(shí)理解的稍有不同,平時(shí) and 和 or 都是 0 和 1 之間運(yùn)算,即 1 and 0 = 0,1 or 0 = 1。在 FIS 中,模糊變量的取值并不是非 0 即 1(因?yàn)槭侵眯哦?#xff09;,而是有可能為一個(gè) float 值(0 ~ 1之間),因此這里的 and 指取兩個(gè)變量值中的最小值,or 指取兩個(gè)變量值中的最大值。(Example:0.8 and 0.2 = 0.2;0.7 or 0.4 = 0.7)

    我們把上面的 4 條規(guī)則全部列舉出來(lái),形成該問題下的 “規(guī)則庫(kù)”:

    If "薪資高" and "工作時(shí)長(zhǎng)少" Then "很愿意接受這份工作" If "薪資高" and "工作時(shí)長(zhǎng)中等" Then "中等愿意接受這份工作" If "薪資中等" and "工作時(shí)長(zhǎng)很長(zhǎng)" Then "中等愿意接受這份工作" If "薪資低" Then "不怎么愿意接受這份工作"

    這樣我們就能根據(jù)一組模糊變量來(lái)推得一個(gè)行為的模糊變量,即接受這份工作的 “愿意程度”。

    • 行為模糊變量推理,行為變量去模糊化

    至此輸入模糊化和規(guī)則庫(kù)都已經(jīng)定義好了,我們現(xiàn)在就可以根據(jù)一組具體的輸入數(shù)據(jù)來(lái)推理出行為模糊變量了,我們這里舉例薪資為 22w,工作時(shí)長(zhǎng)為 8 小時(shí),輸入該系統(tǒng)會(huì)得到怎么樣的推理。首先對(duì)輸入薪資 22w 進(jìn)行模糊化,通過查看隸屬函數(shù),我們能夠發(fā)現(xiàn) 22w 屬于 “較少程度” 的類型,且置信度為 0.64 左右:

    再對(duì) worktime 做模糊化,可以得到 8 個(gè)小時(shí)的工作時(shí)間屬于 “中等程度”,且置信度為 0.66 左右:

    這樣我們就分別得到了 worktime 和 salary 的所屬程度類別以及他們的置信度,此時(shí)我們?nèi)ヒ?guī)則庫(kù)中尋找對(duì)應(yīng)的規(guī)則:薪資為 “少” 且工作時(shí)長(zhǎng)為 “中等” 的規(guī)則,通過查找與上述最后一條規(guī)則匹配:

    If "薪資低" Then "不怎么愿意接受這份工作"

    因此我們所采取的行為應(yīng)該是 “不怎么愿意接受這份工作”,但我們之前說到,這個(gè)推理出的行為變量同樣是一個(gè) “模糊變量”(程度變量),代表著接受這個(gè)工作的 “愿意程度”。那么怎么去確定這個(gè)變量的置信度(這里可以理解為愿意程度)呢?這里就需要引入 “strength” 的概念,即 “置信強(qiáng)度 ” 的概念。其實(shí)這個(gè)值很好計(jì)算,如果規(guī)則是 A and B,那 strength 就等于 A 的置信度和 B 的置信度中較小的那一個(gè),如果規(guī)則是 A or B,則取兩者置信度較大的即可。由于這里我們定義只要 “薪資低” 就不用考慮這個(gè)工作了,所以這里 strength 就等于薪資低的置信度 0.64,“接受行為” 的模糊變量隸屬函數(shù)如下:

    我們 strength 值(0.64)去對(duì)相應(yīng)的行為程度(規(guī)則中是 “不大愿意接受”)進(jìn)行截取,截取后我們就可以得到一個(gè)輸出分布(Output Distribution),圖中淺藍(lán)色填充的部分就是輸出分布。如何去根據(jù)輸出分布確定行為的模糊程度值呢(去模糊化)?這里有兩種方法:Mean of Maximum(mmo)法、Center of Mass(com)法。

    mmo 法是指找到被截區(qū)域最高的直線部分,取直線中點(diǎn)橫坐標(biāo)作為行為去模糊化后的值,如下圖所示:

    com 法是指取被截區(qū)域的質(zhì)心,將質(zhì)心點(diǎn)的橫坐標(biāo)作為行為去模糊化后的值,如下圖所示:

    在我給的例子中我選用的是 com 質(zhì)心法,可以看到去模糊化后 “愿意接受” 變量的行為值為 2.1 左右。

    • 得到具體行為

    現(xiàn)在我們已經(jīng)拿到了行為的 “愿意程度值” 了,現(xiàn)在要參考這個(gè)值作為行為決策了。這個(gè)部分的自由度就比較高了,你可以按照你自己的想法來(lái)進(jìn)行行為決策,例如這里我將愿意程度范圍取值為 [0, 12],而最后可采取的行為只有 “接受” 和 “不接受”,因此我定義 “當(dāng)愿意程度小于 6 則不接受”,“愿意程度大于 6 則接受”,上述例子中的行為值只有 2.1,因此選擇不接受該 offer。

    • 一些特殊情況
  • 在有些時(shí)候,規(guī)則庫(kù)中可能存在若干個(gè)規(guī)則對(duì)應(yīng)同一個(gè)行為,那么應(yīng)該怎么選擇 strength 呢?答案是選擇最小的 strength 作為截?cái)嘀眯艔?qiáng)度。例如:If "薪資高" and "工作時(shí)長(zhǎng)很長(zhǎng)" Then "中等愿意接受這份工作" 和 If "薪資中等" and "工作時(shí)長(zhǎng)中等" Then "中等愿意接受這份工作" 都對(duì)應(yīng)的是 “中等愿意接受這份工作”,前者的 strength 是0.32,后者的 strength 為0.53,那么最后我們?cè)谧鼋財(cái)嗟臅r(shí)候就選擇較小的 0.32。
  • 一個(gè)行為包含若干個(gè) “程度隸屬函數(shù)” 怎么辦?答案是將整個(gè)范圍內(nèi)的輸出分布合起來(lái),若不同程度的隸屬函數(shù)之間有交集,則選擇較大值,如下圖所示:
  • 紅色劃線部分為最終的聯(lián)合輸出分布,行為的橫坐標(biāo)為劃線部分的質(zhì)心點(diǎn)橫坐標(biāo)。上述例子的薪資輸入為 30w,工作時(shí)長(zhǎng)為 8 小時(shí),通過規(guī)則推理 “高薪資” + “一般工作時(shí)長(zhǎng)” = “中等愿意接受工作”,可見 FIS 最終計(jì)算出的 accept 行為的去模糊值也落在 6.1,正好是 “中等愿意接受” 的范圍,和我們的預(yù)期相符。

    • 實(shí)現(xiàn)代碼

    上述代碼實(shí)現(xiàn)如下,代碼中使用了模糊推理運(yùn)算三方庫(kù) skfuzzy,安裝命令:

    pip install -U scikit-fuzzy

    具體安裝細(xì)節(jié)和 API 相關(guān)見:這里。

    """ @author: P_k_y """import skfuzzy as fuzz import numpy as np from skfuzzy import control as ctrlACTION_RANGE_MIN = 0 ACTION_RANGE_MAX = 13def main():# define fuzzy variablesalary = ctrl.Antecedent(np.arange(20, 33, 1), 'salary')worktime = ctrl.Antecedent(np.arange(6, 13, 1), 'worktime')# define fuzzy actionaccept = ctrl.Consequent(np.arange(ACTION_RANGE_MIN, ACTION_RANGE_MAX, 1), 'accept')# define the membership functionsalary.automf(3)worktime.automf(3)accept.automf(3)salary.view()worktime.view()# define the rulesrule1 = ctrl.Rule(salary["good"] & worktime["poor"], accept["good"])rule2 = ctrl.Rule(salary["good"] & worktime["average"], accept["average"])rule3 = ctrl.Rule(salary["average"] & worktime["good"], accept["average"])rule4 = ctrl.Rule(salary["poor"], accept["poor"])# define the simulationaccept_actor_ctrl = ctrl.ControlSystem([rule1, rule2, rule3, rule4])accept_actor = ctrl.ControlSystemSimulation(accept_actor_ctrl)# compute the final resultaccept_actor.input["salary"] = 30accept_actor.input["worktime"] = 8accept_actor.compute()print("How much would like to accept this offer: %.2f%%" % (float(accept_actor.output['accept']) / (ACTION_RANGE_MAX - 1) * 100))accept.view(sim=accept_actor)salary.view(sim=accept_actor)worktime.view(sim=accept_actor)if __name__ == '__main__':main()

    2. GFS 系統(tǒng)(GA + FIS)

    2.1 什么是基因遺傳算法(GA)?

    GA(Genetic Algorithm)算法是一種仿生學(xué)算法,其仿照生物進(jìn)化時(shí)基因通過不斷重組和變異,優(yōu)勝劣汰,最終生存下來(lái)的都是優(yōu)秀的基因群組的原理。當(dāng)我們現(xiàn)在有一堆規(guī)則的時(shí)候,我們并不能保證這些規(guī)則中定義在一種 “情況” 下采取某種 “行為” 是最優(yōu)的,因此我們可以考慮使用遺傳算法,將規(guī)則中的不同 “情況” 和不同 “行為” 做重組形成新的規(guī)則,最后按照這些新規(guī)則的表現(xiàn)好壞來(lái)決定保留或是摒棄這些新產(chǎn)生的規(guī)則。在有些很復(fù)雜的場(chǎng)景下,我們無(wú)法為規(guī)則庫(kù)中的每一條規(guī)則手動(dòng)賦予對(duì)應(yīng)行為,因此一般來(lái)說我們會(huì)為每一種 “情況” 隨機(jī)賦予一個(gè) “行為”,再通過遺傳算法來(lái)學(xué)習(xí)到一個(gè) “情況” 下所對(duì)應(yīng)的最高效用的 “行為”。

    我們還是拿找工作的例子來(lái)做說明,薪資待遇有高、中、低三種等級(jí),工作時(shí)長(zhǎng)同樣有高、中、低三種程度等級(jí),則這兩個(gè)模糊變量做組合一共可以得到 3 * 3 = 9 條規(guī)則,因此一個(gè)完整的規(guī)則庫(kù)應(yīng)該包含 9 條規(guī)則:

    If "薪資高" and "工作時(shí)長(zhǎng)長(zhǎng)" Then ... If "薪資高" and "工作時(shí)長(zhǎng)中等" Then ... If "薪資高" and "工作時(shí)長(zhǎng)少" Then ... If "薪資中等" and "工作時(shí)長(zhǎng)長(zhǎng)" Then ... If "薪資中等" and "工作時(shí)長(zhǎng)中等" Then ... If "薪資中等" and "工作時(shí)長(zhǎng)短" Then ... If "薪資短" and "工作時(shí)長(zhǎng)長(zhǎng)" Then ... If "薪資短" and "工作時(shí)長(zhǎng)中等" Then ... If "薪資短" and "工作時(shí)長(zhǎng)短" Then ...

    規(guī)則前件的組合我們可以通過窮舉列出來(lái),但是所對(duì)應(yīng)的行為怎么辦呢,我們無(wú)法為每一個(gè)規(guī)則前件都賦予一個(gè)適合的動(dòng)作行為,因此通常來(lái)說我們都可以隨機(jī)初始化這些前件對(duì)應(yīng)的動(dòng)作值,在這個(gè)例子中我們 “愿意接受offer” 模糊變量同樣也有高、中、低三個(gè)程度,我們用數(shù)字 0、1、2 來(lái)分別代替這3個(gè)行為變量,于是初始規(guī)則庫(kù)變?yōu)榱?#xff1a;

    If "薪資高" and "工作時(shí)長(zhǎng)長(zhǎng)" Then 0 If "薪資高" and "工作時(shí)長(zhǎng)中等" Then 1 If "薪資高" and "工作時(shí)長(zhǎng)少" Then 1 If "薪資中等" and "工作時(shí)長(zhǎng)長(zhǎng)" Then 0 If "薪資中等" and "工作時(shí)長(zhǎng)中等" Then 2 If "薪資中等" and "工作時(shí)長(zhǎng)短" Then 1 If "薪資短" and "工作時(shí)長(zhǎng)長(zhǎng)" Then 2 If "薪資短" and "工作時(shí)長(zhǎng)中等" Then 0 If "薪資短" and "工作時(shí)長(zhǎng)短" Then 0

    011021200 就代表了規(guī)則庫(kù)策略,因?yàn)橐?guī)則前件的順序是不變的,因此這一串?dāng)?shù)字就是我們的規(guī)則庫(kù)策略,能夠根據(jù)一中特定情況來(lái)選擇一個(gè)行為。但是這個(gè)數(shù)字串是我們隨機(jī)生成的,并不具有好的策略效用,因此我們需要通過遺傳算法來(lái)對(duì)這串?dāng)?shù)字串進(jìn)行進(jìn)化,從而得到一個(gè)具有較高得分的規(guī)則庫(kù)策略。

    2.2 使用GA算法進(jìn)化FIS規(guī)則庫(kù)

    使用 GA 算法優(yōu)化 FIS 規(guī)則庫(kù)通常包括以下幾個(gè)步驟:

  • 建立初始規(guī)則染色體群(population)→\rightarrow Initialize
  • 染色體群中各規(guī)則染色體(chromosome)之間交叉/變異,得到新一代規(guī)則染色體群 →\rightarrow Train
  • 在重復(fù)若干輪進(jìn)化迭代后,保存當(dāng)前代染色體群中得分最高規(guī)則染色體,將其作為學(xué)習(xí)出的最優(yōu)策略 →\rightarrow Save
    • 建立初始規(guī)則染色體群(population)

    一個(gè)染色體群 population 中包含多條規(guī)則染色體,其中規(guī)則染色體是指一個(gè)具體的規(guī)則策略,2.1中提到的 “011021200” 就是一條規(guī)則染色體,其代表了一個(gè)具體的規(guī)則策略。初始的 population 中會(huì)包含多條 chromosome,一般都是通過隨機(jī)生成來(lái)得到的,chromosome 的長(zhǎng)度為規(guī)則庫(kù)中所有規(guī)則的數(shù)目總和(該示例中為 9 ),例如一個(gè) size 為 5 的 population 如下:

    011021200 222010120 010201020 111020012 210120120
    • 進(jìn)化規(guī)則染色體群

    初始的染色體群是我們隨機(jī)生成的,里面的每一條規(guī)則染色體都不一定具有較好的效用,因此我們需要對(duì)該群組進(jìn)行進(jìn)化訓(xùn)練,進(jìn)化訓(xùn)練一共分為以下 3 個(gè)步驟:選擇下一代父染色體群(select)、染色體交叉重組(cross)、染色體變異(mutate)。

  • 選擇下一代父染色體群(select)
  • 由于染色體進(jìn)化是一輪一輪迭代的,因此在下一輪進(jìn)化迭代時(shí)我們需要選擇保留這一輪中哪些優(yōu)秀的染色體到下一輪。這和 “優(yōu)勝劣汰” 的思路很像,我們將這一代中那些得分高的規(guī)則染色體按較高概率保留到下一代中去,將那些得分低的規(guī)則染色體按照較低的概率保留,其中規(guī)則染色體的 “得分” 是通過將這個(gè)規(guī)則染色體應(yīng)用到實(shí)際問題中去運(yùn)行得到的反饋回報(bào)。例如,011021200 這個(gè)染色體中,對(duì)于 “薪資高” 且 “工作時(shí)長(zhǎng)短” 這一個(gè)情況選擇的是 “不太愿意接受這個(gè) offer” 這個(gè)行為,那很明顯你會(huì)覺得這是一個(gè)很差的行為決策,因此你會(huì)給這條規(guī)則染色體一個(gè)很低的得分,以表示這個(gè)規(guī)則是很差的規(guī)則,盡量不要保留到下一代 population 中去。具體示例如下:

    當(dāng)代染色體群:011021200 -> 0.82 score 222010120 -> 0.22 score010201020 -> 0.35 score111020012 -> 0.19 score210120120 -> 0.08 score下代父染色體群:011021200 (0.82 )011021200 (0.82 )010201020 (0.35 )011021200 (0.82 )222010120 (0.22 )

    上面展示了一個(gè)具體的例子,上半部分 -> 后代表的是當(dāng)代的當(dāng)前染色體得分,下半部分()內(nèi)是該染色體在上代染色體群中的得分??梢钥闯?#xff0c;當(dāng)代染色體群中得分越高的染色體越有較高的概率被保留到下一代中去。

  • 染色體交叉重組(cross)
  • 染色體交叉重組是指一個(gè) population 中相鄰的兩條染色體之間進(jìn)行交叉重組,從而得到新的規(guī)則染色體。交叉重組過程首先會(huì)隨機(jī)在染色體中隨機(jī)選擇一個(gè)點(diǎn)作為交換切斷點(diǎn),兩條染色體交換被切斷點(diǎn)切斷的染色體片段,具體示例如下:

    交叉前:01102 1200 # chromosome 1,切斷點(diǎn) index 為 5 ( 1 條規(guī)則染色體被分為 2 段)22201 0120 # chromosome 2,切斷點(diǎn) index 為 5 ( 1 條規(guī)則染色體被分為 2 段)交叉后:22201 1200 # 新的子代 chromosome 1(與另一染色體交換了第 1 個(gè)染色體片段)01102 0120 # 新的子代 chromosome 2(與另一染色體交換了第 1 個(gè)染色體片段)
  • 染色體變異(mutate)
  • 染色體變異是指在一條染色體上的某一個(gè)位置上的基因發(fā)生突變,基因突變分為前向突變與后向突變,首先隨機(jī)選擇一個(gè)突變切斷點(diǎn),前向突變指切斷點(diǎn)前面的基因全部隨機(jī)突變成另一個(gè)行為值,后向突變指切斷點(diǎn)以后的基因全部隨機(jī)突變?yōu)榱硪粋€(gè)行為值,例如:

    突變前:01102 1200 # 切斷點(diǎn) index 為 5 ( 1 條規(guī)則染色體被分為 2 段)前向突變:10201 1200 # 前向突變子代 chromosome(突變斷點(diǎn)前的基因均重新隨機(jī)取值)后向突變:01102 2012 # 后向突變子代 chromosome(突變斷點(diǎn)后的基因均重新隨機(jī)取值)
    • 保存最優(yōu)規(guī)則策略

    在完成了若干輪的進(jìn)化后,通過篩選出該 population 中得分最高的一條 chromosome 即可得到最優(yōu)規(guī)則策略。在設(shè)定進(jìn)化輪數(shù)的時(shí)候,我們可以使用閾值限定的方法,查看在一輪中最高得分的規(guī)則染色體得分是否到達(dá)了我們?cè)O(shè)置的閾值點(diǎn),如果已有染色體滿足了我們?cè)O(shè)置的得分閾值即可停止進(jìn)化,并保存滿足得分的規(guī)則染色體作為最終策略。


    至此,這就是對(duì) GFS 系統(tǒng)的全部?jī)?nèi)容講解了,完整 GFS 代碼可以參見 我的GitHub。

    總結(jié)

    以上是生活随笔為你收集整理的GFS(Genetic Fuzzy Systems)—— 基于专家先验规则库和遗传算法相结合的智能体决策算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。