其實我本來的預計是一個套件講兩天
但是畢竟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 :