見出し画像

進化的プログラミング言語としての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つの計算方法を自動で選別交配します。

サンプルコードを書くのは簡単なんですが、実装すると見えないところを地道に実装していって、地道にテストしていかないといけません。

まあ、気長に実装していこうかなあと思います。

応援してくれると嬉しいです。
スキ、フォローよろしくお願いします。

いいなと思ったら応援しよう!