See the Pen PzJZNz by kanaparty (@kanaparty) on CodePen.
あとで
See the Pen PzJZNz by kanaparty (@kanaparty) on CodePen.
あとで
See the Pen 障害物を避けて進化 by kanaparty (@kanaparty) on CodePen.
前回
のコードをベースに、障害物を設置してそれを避けて通るように進化させる課題。
前回のコードとの大きな違いは、ビークルの表現のクラスのなかの、適応度を更新する部分。
//適応度を更新 updateFitness() { this.fitness = Math.pow(1 / this.RecordDistance * this.finishTime, 4); if(this.hitObstcle){ this.fitness *= 0.01; } else if(this.hitTarget){ this.fitness *= 2; } }
前回はライフサイクルが終了した時のビークルの位置を見て適応度としていたが、
今回はライフサイクル中に一番近い付いたときの距離と、そのサイクル数の短さが適応度に反映されるようにする。
また、ターゲットにぶつかったときは2倍の適応度に、障害物にぶつかったときは10分の1の適応度にすることで重みをつけている。
この課題、写経なのでなんとなくできている感のある動きになってはいるものの、
適応度を図る部分や突然変異率、母数などちょっとしたことが与える影響がかなり大きくて
自分一人で1から組み立てチューニングできるようになるのは大変なんじゃないかな、と思ったり。。
See the Pen 獲物に向かうように進化するビークル by kanaparty (@kanaparty) on CodePen.
久しぶりにnature of codeの課題!
前回の進化の課題の表現を文字列から運動に変えて、
解を「獲物(画面右端の丸)にたどり着くこと」とした。
はじめはてんでバラバラの方向に向かう集団が、世代を進めるとだんだん獲物に辿り着けるように進化していく。
URL(リソースの場所)、URN(リソースの名前)、URI(リソースの識別)
REST・・・webのアーキテクチャスタイル(指針・作法・流儀、システムを設計するときの指針)
「クールなURIは変わらない」
Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)
ソケット・・・ネットワークのデータのやりとりを抽象化したAPI。
HTTPはステートレスなプロトコル。
ステートレスでは・・ - アプリケーション状態を保持しない
ステートフル
アプリケーション状態・・セッション状態(ログインしてからログアウトするまで)のこと
どっちでもリソースの作成ができる。でも、クライアントがURIを決めたいときはPUTが適しているが そのURIが存在しているか調べたり、クライアントが内部実装を熟知していないといけなかったりするので 特別な理由がない場合はPOSTでリソース生成をしたほうがよい
冪等 - Wikipedia 「ある操作を1回行っても複数回行っても結果が同じであること」
GET PUT DELETE で実現できる機能はべき等と安全性が利用できるのでなるべくそれで実現する
クライアントの挙動を左右するのでステータスコードの選択は重要。
Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)
関係モデル(関係モデル - Wikipedia)RBDMS(関係データベース管理システム - Wikipedia)などのER図から考える
オブジェクト指向モデルのクラス図から考える
情報アーキテクチャ(よくわからなかったのでまたいつか・・)
Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)
See the Pen Genetic Algorithms(遺伝的アルゴリズム) by kanaparty (@kanaparty) on CodePen.
遺伝的アルゴリズムを使ってランダムな文字列から「音はしぐれか」 種田山頭火 - Wikipediaへ進化させる。
ステップは大きく分けて3つ
これを繰り返して進化させていくアルゴリズム (「進化させていく」って表現でいいのかしらと思ったら本には「特定の問題を解決することを意図して実装される」と書いてあった。 遺伝的アルゴリズム - Wikipedia wikipediaでは「解を探索する」と書いてあった。) 解は決まっていて、そこまでたどり着くための手法。 この経過の様子を眺めているのが結構楽しい。
遺伝的アルゴリズムを実装するときに必要な、ダーウィンの進化論の中核の3つの要素
初期化部分。 解、初期集団を生成する。 コードでいうとこの部分
//ターゲット句 var target = 'おとはしぐれか'; //集団の初期化 var population = new Population(); population.init(); //個体 class DNA{ constructor(){ this.genes = []; this.fitness = 0;//適合度 } //初期化 init(){ for (var i = 0; i < targetLength; i++) { this.genes[i] = String.fromCharCode(Math.floor(Math.random() * 81) + 12354); } } } //個体群 class Population{ constructor(){ this.List = []; this.length = 100; this.children = []; this.finished = false; } init(){ for (var i = 0; i < this.length; i++) { this.List.push(new DNA()); this.List[i].init(); } } }
目指す句の文字列を決めて、ランダムな文字列の句の集団を100個作る。
今回は7文字の文字列が「おとはしぐれか」に近いものをより選択しやすくする状況を作る。 選択するときは、一致している具合に応じた数(適応度が高ければ多く、低ければ少ない)親を入れ物(配列)にコピーしていれておいて そこから次の世代の親を2つ拾うようにする。 結果的に適応度が高い個体が選ばれやすくなる。
適応度に応じてプールにいれているところ↓
//プール var matingPool = []; //個体 class DNA{ //適合度をはかる calcFitness(){ var score = 0; for (var i = 0; i < targetLength; i++) { if(this.genes[i] === target.charAt(i)){ score++; } } this.fitness = score / targetLength; } } //個体群 class Population{ //淘汰 naturalSelection(){ matingPool = []; for (var i = 0; i < this.length; i++) { this.List[i].calcFitness(); var fitness = this.List[i].fitness; //完全一致していたら止める if(fitness === 1){ this.finished = true; } //適応度に応じた数をプールに入れる for (var j = 0; j < count; j++) { matingPool.push(population.List[i]); } } } }
親をプールから選んで次の世代を作っているところ
//個体群 class Population{ createNextGenelation(){ //プールから親二つを取り出す for (var i = 0; i < this.length; i++) { var parentA = matingPool[Math.floor(Math.random() * matingPool.length)]; var parentB = matingPool[Math.floor(Math.random() * matingPool.length)]; //生殖(突然変異含む) this.children[i] = parentA.crossover(parentB); } } } //個体 class DNA{ //交配 crossover(partner){ var child = new DNA(); var midpoint = Math.floor(Math.random() * targetLength); var mutate = (Math.random() < 0.1) ? true : false ; //突然変異 if(mutate){ child.init(); } else{ for (var i = 0; i < targetLength; i++) { if(i < midpoint){ child.genes[i] = this.genes[i]; } else{ child.genes[i] = partner.genes[i]; } } } return child; } }
という感じでこれを繰り返すといつか「おとはしぐれか」になる!