
進化的プログラミング言語としてのFR2 Cyclon
どーも、どーも、こんばんわー、ハルキーです。
今日はいままでの経過を発表します。
以前書いたとおり、モニターが壊れて、いいモニターを新しく買ったのですが、このモニターが本当よくて、テレビやネットテレビを見る時間が増えました。(前のモニターはパソコン専用で、音も悪かった)
しばらくしたら、作業に集中するようになるのかなあと思いますが、テレビのコンテンツ力ってすげえ高けえなあといった感じです。
今、FR2 Cyclonの実装ですが、進化プログラミングの実装を進めています。
進化的プログラミングはテストして、選別するといった感じなので、ABテストにも対応できます。
文法がどのようになるのかサンプルコードはこちら
gene x{
int label<- gene.Label
int m <- {int.max.random()|
return (val1.n + val2.n) / 2
}
int n <- gene{10|
##0
return (g1.n + g2.n) / 2
##1
return (g1.n + g2.n) % int.max
}
[T[]] ArrayCross gene {var l1, var l2, T.list[0]|
T[] bs
##a
bs = T.list[l1]
##c
bs = T.list[(l1 + l2) / 2]
##end
for{var i = 0, i < bs.Length, i++|
T b = null
var r = [0, 1].random();
if {r == 0|
if (val1.length <= i| b = T.new()
else {b = val1[i]
else {
if {arr2.length <= i| b = T.new()
else {b = val2[i]
}
}
[T[]] ArrayMutation {0.1|
return val.add(T.new())
}
return bs
}
score int M
Blk[] blks <- ArrayCross[Blk](val1.length, val2.length)->ArrayMutation[Blk]
}<-{
var start = 0
var limit = gene.x.Count
var gs = gene.x.Select(var {x, y| x. M <= y.M}).Range(start, limit)
while{var g in gs, true|
if {var random : [0, 1].random(), random == 0|
return g
}
}
}
model Blk{
int x <-{int.max.random()|
return (val1.x + val2.x) / 2
} -> {0.1|
return 1
}
int y <- {int.max.random()|
return
} -> gene(0.01, 0.2) {##return|
return int.max
}
}
gene.x.New()
gene.x.M = int.max.random(30)
gene.x.Send()
gene.x.Select(var {x, y| x.M <= y.M}).Range(10);
##x.label.a
print(1)
##x.label.b
print(2)
機能的にだいぶ複雑なんで、だいぶ実装に手を焼いています。
int x <-{int.max.random()|
return (val1.x + val2.x) / 2
}
というコードは整数xを宣言し、初期値はランダム、交配するときに2つのデータを足して2で割ると指示しています。
int x -> {0.1|
return 1
}
このコードは、突然変異の確立が10%で、突然変異したら値を1にするという意味です。
gene x{
score int M
...
...
}<-{
var start = 0
var limit = gene.x.Count
var gs = gene.x.Select(var {x, y| x. M <= y.M}).Range(start, limit)
while{var g in gs, true|
if {var random : [0, 1].random(), random == 0|
return g
}
}
}
が、新しく子を産むとき、親をどう設定するかというコードです。
{|}は2つのブロックを宣言できるので、雄と雌を別々に設定することができます。
int n <- gene{10|
##0
return (g1.n + g2.n) / 2
##1
return (g1.n + g2.n) % int.max
}
これは、値の交配の仕方を遺伝的アルゴリズムで最適化するという意味で、2つの計算方法を自動で選別交配します。
サンプルコードを書くのは簡単なんですが、実装すると見えないところを地道に実装していって、地道にテストしていかないといけません。
まあ、気長に実装していこうかなあと思います。
応援してくれると嬉しいです。
スキ、フォローよろしくお願いします。