情報オリンピック夏合宿発表
DESCRIPTION
暫定TRANSCRIPT
SRM 543 Div2 Medium - EllysXors
● A,B が与えられる. (1 A B 4*10^9)≦ ≦ ≦
● A 以上 B 以下の数の排他的論理和を出力
A xor (A+1) xor (A+2) xor ... xor B
● ふつうにループすると TLE することにする
GP で解いた● 小さいケースは全探索で解ける
● それを教師として利用する.乱数生成
● (a から b までの xor)
= (0 から b までの xor) ^ (0 から a-1 までの xor)
● ランダム生成プログラムがいくつ正解しているかを評価値とする評価関数を用いた.
もっと厳密に● 非終端記号 :
四則演算 (+,-,*,/) (a == b ? c : d) , (a < b ? c : d)a,b,c,d で動作が決まる四項条件演算子
● 終端記号 : 変数 x もしくは 1~5 の定数
● 評価値 : 教師データ (100 問 ) に対する正答数と式の長さ
● 1 世代の集団の個体数 :250
● 集団に突然変異が 5% くらい起きて交叉は
45% くらい起きる.
結果● 第 0 世代 : 正答率 41% � 運よく高かった !
● 第 1600 世代 : 正答率 55%
● 第 1800 世代 : 正答率 69%
● 第 4500 世代 : 正答率 86%
● 第 26000 世代 : 正答率 100%
● 出来上がった 0 から x までの xor を求める式「 (((((x-((1<1)?(x):((((((x%4)<(3/3))?((x+2)):(x))-x)+((x%x)*(x-x))))))/1)+((2/2)%(2*((x<x)?(4):(1)))))*(((((x+4)+(x+x))+((2+1)+4))-(2%3))%2))+((((x+2)%4)+1)/(1*3))) 」
Codeforces #122 Div2 B. Square
● 一辺長さ n の正方形がある.
● 左下の頂点からはじめて時計回りに n+1 個飛ばしで番号をつけていく.左下の頂点に再び番号がつくのは何番目か.
結果● 20 分実行した結果 ,100 件の教師データに対して正答する
「 ((((((((2*x)*(x-x))+(x%2))+((x%(-1))*x))*((((3+(-5))-4)==((((x%x)%((-5)+x))+(-3))*((((-5)+x)%(4%x))%(-5))))?((((((((3+((x+x)/x))-(1%((x+(-2))/(x%(-2)))))-2)%(-3))*1)*(4-(((-1)*5)%((3/x)-((x-(4*x))-3)))))/((-5)%x))):((-2))))-(-5))*x)-(x-((x/x)%(x*4)))) 」
という式が得られた.
GP の弱点● 本当に式を予測しているだけだから今回のように WA することもあ
る
● ただ教師データの全てに正解するようなプログラムであればある程度正しい ( 式が短い場合に限るが )
● ただし,式の変数が増えるとぜんぜん良い式を出してくれないのでつらい (1 変数だけ与えられる問題ってびみょう )
まとめ
● 簡単な法則性とか見つけるのが得意みたいなので,問題解けないときは GP しましょう.
● 評価関数の自動生成とかよさそう ( 適当 )
● ぶっちゃけ, GP で解けるような法則性の問題は人間がやったらすぐ気づけそう
● GP 遅いし微妙にバグってても気づかない