iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 16
0
AI & Data

GA Note - 基因演算法的世界系列 第 16

【Day16】GA with you - R Package mcga R套件mcga (3)

其實我本來的預計是一個套件講兩天
但是畢竟mcga是第一個套件
讓我們就講詳細一點讓大家快速上手


昨天埋的伏筆不知道大家有沒有去找
沒有沒關係
今天就來揭曉哪邊出了問題

這邊帶大家回顧到 mcga的第一篇
範例所設定的適應函數f

f<-function(x){
  return ((x[1]-7)^2 + (x[2]-77)^2 +(x[3]-777)^2 +(x[4]-7777)^2 +(x[5]-77777)^2)
}

f要尋求x[1]、x[2]、x[3]、x[4]、x[5]五個數值最佳的答案,來求出其最小值
我們所知道的最小值應該是要多少
就是 0 對吧!!!
那要變成 0 不就讓各項為 0
相加起來就是 0
說到這裡大家應該就知道

x[1]=7
x[2]=77
x[3]=777
x[4]=7777
x[5]=77777

這樣就得了吧~
那為什麼昨天所計算出來的結果不是0呢???
不知道大家有沒有想過
說到這應該不就出現
基因演算法就不好 不知道在搞啥
等等等等~
我們回顧一下當初的設定吧

m <- mcga( popsize=200, 
           chsize=5, 
           minval=0.0, 
           maxval=999999999.9, 
           maxiter=2500, 
           crossprob=1.0, 
           mutateprob=0.01, 
           evalFunc=f)

大家有沒有發現所設定的maxval竟然是999999999.9
這是何其大的數字
跟我們第五個77777差距有多少
由此我們就可以知道
當你設定錯誤的時候
就會影響整個基因序列在運轉的結果
而我們所設定的maxiter只有2500
當2500代過去了,沒有讓他跳回5位數時
所計算出來的結果就十分不盡人意
所以參數的設定是十分重要的


修改上限值

剛剛說了這麼多,我們就來設定一次比較正常的內容

> m1 <- mcga(popsize=200, 
+            chsize=5, 
+            minval=0.0, 
+            maxval=99999.9, 
+            maxiter=2500, 
+            crossprob=1.0, 
+            mutateprob=0.01, 
+            evalFunc=f)
> cat("Best chromosome:\n")
Best chromosome:
> print(m1$population[1,])
[1]     3.110001    75.989349   767.962032  7776.994563 77777.003116
> cat("Cost: ",m1$costs[1],"\n")
Cost:  97.83841 

從這邊就可以看出來相較昨天的結果更趨近於0了

玩弄族群數

若是我們把popsize增加多一點
一次多一點會有什麼情況呢?

> m1p <- mcga(popsize=2000, 
+             chsize=5, 
+             minval=0.0, 
+             maxval=99999.9, 
+             maxiter=2500, 
+             crossprob=1.0, 
+             mutateprob=0.01, 
+             evalFunc=f)
> cat("Best chromosome:\n")
Best chromosome:
> print(m1p$population[1,])
[1]     7.00000    76.40625   777.00000  7777.00000 77777.00000
> cat("Cost: ",m1p$costs[1],"\n")
Cost:  0.3525391 

有沒有發現不同的地方
這邊的cost降低了 更趨近0

玩弄代數

我們再換個方式
修改迭代的次數

> m1i <- mcga( popsize=200, 
+              chsize=5, 
+              minval=0.0, 
+              maxval=99999.9, 
+              maxiter=25000, 
+              crossprob=1.0, 
+              mutateprob=0.01, 
+              evalFunc=f)
> cat("Best chromosome:\n")
Best chromosome:
> print(m1p$population[1,])
[1]     7.00000    76.40625   777.00000  7777.00000 77777.00000
> cat("Cost: ",m1p$costs[1],"\n")
Cost:  0.3525391 

這邊也可以發現答案其實跟上面的一樣了
也是非常接近0


每一個設定的變數都可以去嘗試
根據需求設定正確符合的數值
這樣的結果會更符合需求

不知道今天這樣講解有沒有讓大家理解這是在做什麼了


今天的程式碼
Command: click
Result :


上一篇
【Day15】GA with you - R Package mcga R套件mcga (2)
下一篇
【Day17】GA with you - R Package genalg R套件 genalg (1)
系列文
GA Note - 基因演算法的世界30

尚未有邦友留言

立即登入留言