GAでなんか問題を解いてみようというのでやってみた。
条件おさらい
・白黒マスメ
・シマの数は1個 縦横に連結したひと
・カドの数は最大
・カドの数が同じなら黒マスの数が最大
3×3、4×4、5×5 結果は
・・・・雑感。
・今回はC#を使ってみた。文法上からくる制約でキレイなソースになるのでいい。
・C#だと「不定長のDNA」というところがスッキリ書けた。
・「不定長のDNA」のときは評価関数に「DNAが短い方がよい」というところを加味した方がいいようだ。
・淘汰の方式は1対1の対戦方式にしてみた。参考:トーナメント方式。記事の末尾にはそのあたりのソースを載せた。
・マスメの数が大きくなってくると、「答えに到達するのか」?とか「スピードはだいじょぶか?」とか悩みは増える。
・もしも、全検索で済むような問題ならそちらの方がGAより確実。
・GAでは、各個体を評価する関数は成長するように、うまくかかないと
いけない。ここのところがやや「匠の世界」。
・でも全体的には、GAはプログラミングは、お気楽でよろしい。
以上
WINPUSH BattleCard(Kado
{
if (acard.m_shima == 1 && bcard.m_shima != 1){
return (WINPUSH.AWIN);
}else if (acard.m_shima != 1 && bcard.m_shima == 1){
return (WINPUSH.BWIN);
}else if (acard.m_shima !=1 && bcard.m_shima != 1){
return (WINPUSH.PUSH);
}
if (acard.m_kado > bcard.m_kado){
return (WINPUSH.AWIN);
}else if (acard.m_kado < bcard.m_kado) {
return (WINPUSH.BWIN);
}
if (acard.m_masu > bcard.m_masu) {
return (WINPUSH.AWIN);
}else if (acard.m_masu < bcard.m_masu){
return (WINPUSH.BWIN);
}
if (acard.m_dnalen
return (WINPUSH.AWIN);
}else if (acard.m_dnalen
return (WINPUSH.BWIN);
}
return (WINPUSH.PUSH);
}
コメントありがとうございます。境界条件というと盤面に関してでしょうか? 追加でモロモロ考察記事を書いてみます。
境界条件はどうなっているんでしょうか?
# 7x7の解はインベーダー風 (^^)