チームラボの通年インターンに参加してきました

こんにちは、ぬまです。
今回は11月と12月にわたってチームラボ株式会社でインターン生として業務に参加しました。
もともと業務での経験がゼロだったためだいぶ貴重な経験をさせていただいたので、参加記録を残したいと思います。極秘事項が多いため、詳しいことは残せないが残念です。
f:id:numa7pu:20201229024323p:plain:w300

インターン概要

日程:11月26日~12月23日
配属:ECサイトの案件
技術:Ruby on Rails, MySQL, Redis, Docker, AWS(ECS, ECR, CodePipeline)

応募背景

サマーインターンを通してある程度ハッカソンの開発経験を積んできましたが、業務経験がないので就業型に参加したい!つよつよエンジニアからレビューをもらいたい!!という思いがありました。あと、Rails書きたい!!ある日、Paiza経由でのスカウトをいただき、カジュアル面談という名の面接を申し込みました。(面接官がのちのメンバーでした)
応募理由や技術的な質問などをざっくばらんに話をして楽しく終わり、受かっても落ちてもチームラボ良さそうだなという印象を持った記憶があります。後日、プログラミング試験を受け、採用をいただきました。

そもそもチームラボ株式会社とは?

HPから引用させていただくと

TECHNOLOGY×CREATIVE
テクノロジーとクリエイティブの境界はすでに曖昧になりつつあり、今後のこの傾向はさらに加速していくでしょう。そんな情報社会において、サイエンス・テクノロジー・デザイン・アートなどの境界を曖昧にしながら、『実験と革新』をテーマにものを創ることによって、もしくは、創るプロセスを通して、ものごとのソリューションを提供します。(HP引用)

詳しくはHP見てみてください。かわいいです。
職種はテクノロジー、クリエイティブ、カタリストに分かれており、ざっくりいうと左からエンジニア、デザイナー、マネージャーという認識です。
僕は、テクノロジーの中のパッケージチーム、いわゆるWebエンジニアのチームの中のECチームに配属されました。

やったこと

参画した最初はi18nというgemの導入によりエラー文が英語表記になっていたためymlファイルをいじって日本語に直すような比較的簡単なタスクをこなす中で、アプリ全体をなんとなく理解していきました。その後はECサイトなため、さまざまなバリデーションやエラーハンドリングを実装しました。

初めての経験

・核となるアプリを拡張することで大きなECサイトを構築するという経験は今までしたことがなく、個人で実現できるわけでもなくかなり貴重な経験でした。その中で、モデル、コントローラ、ビューをそれぞれオーバーライドすることでアプリが完成していくのはなかなかに面白かったです。
・state_machineをつかった状態の管理。state_machineというgemを使うことでECサイトの各状態の遷移をみてバリデーションをかけたり、ある状態に移り変わる時になにかしたり、ある状態から移り変わる時になにかしたりと、融通が効くのでかなり面白かったです。
・ファイルインポート時のエラーメッセージをエラーの数だけ表示させる。エラーが起きた時にraiseすると処理が終わってしまうので、うまくエラー処理するのが難しかった印象があります。
・隣にメンターさんがいてくれたため、困った時に空いていればすぐに聞ける環境は初めてでかなりありがたく理解が数倍捗りました。
・そもそも業務に参画すること自体初めてでした。
・自分が書いたコードを実際のエンジニアの方にレビューを受け、それが実際のサービスの一部になる感覚。楽しすぎました。
・詰まった時に業務時間内に勉強できることは、飲食店や塾講師のアルバイトにはできない機会だと感じます。

ご飯(ここ重要←)

インターン期間中に連れてっていただいたご飯で特においしかったお店を紹介します。
・ポンチ軒:さくさくで口の中でお肉がとろけました。基本的に行列でたまたま一度だけいけました。
f:id:numa7pu:20201229024837p:plain:w300
つじ田:痺れの中のからさがあり、坦々麺うまい
f:id:numa7pu:20201229024929p:plain:w300
・一頭:お肉がうまうまで2回もいってしまいました。メンターさん曰く、トングの先が細い焼肉店はおいしいらしい(?)
f:id:numa7pu:20201229025006p:plain:w300

感想

実務での開発がどういう物なのか正直想像もついていない状態で参加させていただいて、実際の一人での開発と大きく違うこととして、自分以外のエンジニアが僕のコードを読むことだったり、仕様を理解することであったり、メンバー同士で話し合う環境があったり、人と関わる点で大きく違うなと実感しました。
また、チームラボではチームの仲が良く、Slackで業務と全然関係ない話で盛り上がったりミーティングでも楽しくお話しする時間があったり、開発する上でのチーム力がものすごく高かった印象です。
コロナ禍にもかかわらず、オンラインオフライン兼用でインターンシップに参加させていただきありがとうございました。コロナ禍で不安はあったものの、毎朝全フロアを消毒を徹底しており、扉の前にマスクが常備してあるので、外出て戻ったらマスクを変える制度ができており、社員さんのみでなくインターン生に対する受け入れ体制も充実していた印象です。このような状況下でも受け入れてくださりありがとうございました。
f:id:numa7pu:20201229025819p:plain:w400
↑これはオフィス6階の共用スペースで外部の人とのミーティングなどはここで行われています。めちゃくちゃかわいいです。ぜひ一度足を運んでみてください
では〜

2020年振り返り

こんにちは、ぬまです。
12月31日ということで振り返り記事が多くなってきたので流れに乗ってみようと思います。
f:id:numa7pu:20201231221940p:plain:w200

専攻を大きく変えた

 私は学部で機械情報工学科というロボットをメインとし制御や情報まで幅広く学ぶ学科に所属していました。今年は心機一転し、CS専攻として大学院進学したのがついこの間のように思えます。研究では遺伝的アルゴリズムなどの進化計算に興味があり、最適化の研究をしたくて進学しました。実際には、授業や後述の開発に時間を取られ、まともにやっていませんが、2021年は学会出たり、修論を書き終えて終了したいと思います。

インターンシップ

 大学院進学して将来を考えた時に自分は何がしたいのかさっぱりわからない状態でした。機械学習を使いたいと思ったり、アプリ開発をしたいと思ったり、はたまた研究職として研究でお金をもらったりも考えました。少なくともCS出身としてプログラミングで何か開発できなければ人権はない(個人の見解)と考えていたので、とりあえず何か作ってみようと思いました。そこで、Javaに触ったことがなく興味があったためJavaで何か作ろうと思い立ち、Udemyや書籍を買ってTodoアプリを作りました。SpringBootというフレームワークに触れ、よくわからない言葉だらけで正直写しただけのようなものでした。これは2020年の3月のことでしたねぇ。ここからProgateでいろいろな言語を学んでいきました。エンジニアとして就職したいという熱い思いはありませんでしたが、様々なインターンシップを経験して見定めたいと思うようになりました。なので、とりあえず、インターンに申し込むことにしました。しかし現実は甘くはありませんでした。そう。「インターンに行くためにはインターンに行った経験が必要」いやいや、矛盾でしかないやん。
 多く見積もって6月くらいから申し込んで15社以上面接したかなと思います。参加したインターンシップは・・・
・株式会社GATechnologies(6月末)
これは2日間のハッカソンで3人1チーム+メンターさんで日々の課題を解決するテーマでプロトタイプを開発するというものでした。Railsでアプリを作り、フロントはBootStrapで開発をして、3人中2人が未経験で、1人がつよつよでした。ほとんどが彼の手で完成し、僕はhtmlやCSSを整えるくらいのことしかできず、悔しい反面、こんなにアプリ作れる人になりたいと思うようになりました。

サマーインターン

ここからサマーインターンの参加した企業です。6月にインターン経験が活きたのか、魔法のスプレッドシートやPaizaでいくつか申し込み、参加できました。
・株式会社いい生活
不動産業界の物件検索サイトを4人1チームで開発していくものでした。ここで初めてVue.jsに触れたり、APIを叩くということをしたり、様々な技術を知ったり、Gitを理解してきたり多くの学びがありました。また、チームメンバーに年下にも関わらず、情報系でないのにつよつよであったり、院試とインターン選考を並行したつよつよだったり、Webエンジニアになるかわからないけどめちゃくちゃ吸収力のあるつよつよがいたりメンバーにかなり刺激をもらえて楽しかったです。
楽天株式会社
「人と人をオンラインでつなぐ」というテーマのもと6人で2週間程度で設計から開発するものでした。初めてまともにインターンRailsを触れRailsAPIを初めて作り、さらにはReactでフロントを書いて、どうやって設計して各機能に落とし込むのか経験できたのはかなり充実しました。結果として3位/7チーム中という結果で手に汗握りましたが、チーム力がどのチームよりもダントツで優っていた点でかなりメンバーにも恵まれて楽しい2週間でした。
二子玉川夏の陣に参加してきました - numa7pu’s diary

通年インターン

・チームラボ株式会社
ハッカソンを経験して、業務に参加してみたい!!レビューを受けたい!!レベルアップしたいという思いから、業務に参加できるインターンを探していたところ、Paiza経由でスカウトを受けたので、これだ!と思い、申し込み参加しました。
チームラボの通年インターンに参加してきました - numa7pu’s diary

就活

なんやかんやでインターンを経験するうちにいつしかWeb開発が楽しくなり仕事としてやっていきたいと思い本選考をいくつか申し込んだり、インターンからの早期選考の機会をいただけたりし、いきたいと思う企業さんで働くことになりました。
就活の軸はグローバルと多様性。将来的に、スキルを突き詰めて働くというよりチームを引っ張るような仕事がしたいと考えているので、さまざまな視点から物事を考えつつエンジニア力を高められると思い決めました。

競プロ

プログラミングに慣れたいという思いからはじめてみましたが、普段のアルバイトが土曜日の朝から夜まであるので、コンテストに全然出れず、最近ではあまりできていませんが、来年は積極的に着手する予定です。まずは目指せ緑!f:id:numa7pu:20201231220626p:plain:w300

時系列で軽くまとめる

1月・2月・・・卒論
3月・・・Progate始める
4月・・・授業始まる。SpringBootでアプリ作る
5月・・・Railsおもろそう
6月・・・GAtechnologiesでハッカソン、個人開発始める
7月・・・サマーインターン選考
8月・・・Ruby勉強、サマーインターン
9月・・・サマーインターンRuby勉強、研究
10月・・・面接、研究
11月・・・チームラボインターン
12月・・・研究構想発表、チームラボインターン、某R社内定承諾、アプリデプロイ

2021年の抱負

・卒業する
ポートフォリオ作成
・β版アプリを本格化
Atcoder水色(夏までに緑)
・TOEIC800点
という感じで楽しくがんばります!!
では、2020年ものこりわずかですが、良いお年を〜

二子玉川夏の陣に参加してきました

こんにちは。ぬまです。
今回は楽天株式会社のサマーインターンでおなじみ、「二子玉川夏の陣」に参加してきました!
インターンシップの詳細はこちら 二子玉川 夏の陣2020 楽天 インターン オンライン開催

概要

  • 期間:9/1~9/11のB日程
  • 待遇:時給1300円
  • オンライン開催
  • 内容:5人1チームで2週間かけて新規サービスの開発
  • テーマ:オンラインで人と人をつなぐ

やったこと

2週間あり、最初の1週間弱は企画・設計、詳細設計に関するレビューをもとに改修し、残りの時間を実装と発表準備に割り当てられました。設計の段階では、実際のマネジャーやエンジニアの方からレビューがもらえると言う非常にレアな体験ができました。では、各フェーズごとにやったことをまとめていきます。
メンバー6人
フロントエンド2人
バックエンド4人
※フロントのUI部分はバックエンドのフロント若干かける人たちでサポート

企画

 まず、オンラインで人と人をつなぐ点で現在の問題点を洗い出します。ここで、ブレインストーミングを使ってひたすら書いていきます。だいぶ話し合いをした気がします。問題点とともに簡単な解決策を絞り出します。

f:id:numa7pu:20201004012003p:plain
ブレインストーミング

結果として、動画を使って趣味を共有できればコロナ禍でも寂しくないという結論になりました。

設計

 ここでは、どんな機能があると問題点を克服できるのか、深く洗い出します。今回も同様にブレインストーミングから案を出し、グループ分けをおこないました。そのグループの中でランク付をします。
①最も優先順位の高い機能
②必要な機能
③無くてもいいかなぁという機能
 それぞれ、P1、P2、P3という名前で機能を分類(P = Priority)し、その機能をコーディングに落とし込めるレベルで設計しました。例えば、その機能からどんなモデルが必要でDB設計はどうするのか、その機能からどんなデータがどんな形式でやりとりされるのか、、、
このあたりはだいぶ知識がなかったので、学びながら、エンジニアのメンターの方に多少のサポートをいただきながら進めました。メンバーもみんな強くて互いの知恵を共有できた点でかなり質が高いように感じました。

実装

 使用技術:Docker, RubyOnRails, React+Redux, MySQL, Github, (CircleCI), Material UI
 各機能のメソッドレベルでタスクを分割し、メンバーに割り当て実装開始
 まぁ、設計通りにはいきません。

発表

 発表は、基本英語で行うため準備に丸一日かけて協力しながら原稿やスライドを仕上げました。
結果は4位/7チームという真ん中の成績でしたが、チームワークはダントツ一位だったので強みが出たなと言う印象で盛り上がりました。

つくったサービス

結論から言うと、動画で人と人をつなぐSNSサービス「TheaTalk」を開発しました。
f:id:numa7pu:20201004010723p:plain
YouTube動画のURLから動画を共有できるルームを作成し、ユーザが各動画部屋で動画をリアルタイムで同じ場面を見てチャットができるというサービスです。
ユーザは趣味のタグをフォローしていて、ルームを作る時にルームにタグをつけられます。他のユーザはタグで検索ができ、気になるルームに入ってルーム内のユーザ同士でチャットができます。それによって共通の趣味で繋がることができます。
YouTubeではリアルタイムでのチャットが必要になりますが、このサービスによって、配信のリアルタイムでは無く部屋単位のリアルタイムをもつことで一緒に見ていると言う感覚から人と関われない寂しさを解決できます。

全体を通して

 必要な機能を盛り込みすぎて実装できないだろという量のタスクになり(人間は貪欲だぁ,,,)、タスクの削減をすることで実装する機能を早い段階で抑えることでプロトタイプとして必要な機能を最優先で実装し切った点でかなりやり切ることができたと思います。また、使ったことのない技術や機能を実装したりDBを設計する方法論など学んだりできたので、密度の濃い成長を実感できる楽しいインターンだと確信しています。また、発表が英語な点でグローバルな人材にはまだまだ程遠いことを実感しチーム全員がやる気に満ちたインターンと感じます。

今後

 われわれのチームはこのTheaTalkをインターン中にデプロイはしたものの、チーム力ダントツ1位であることとみんなのやる気が満ち溢れており削減した機能や仲が良くなってしまったために全会一致でiOSアプリとWebアプリの開発そして機能の拡張をしサービスの運営をすることとなりました!!!現在進行中です。
 1月にはiOSと拡張版TheaTalkをリリースする予定です。お楽しみに〜

では〜

スキーマ定理を頭のすきーまに置いておきたい

スキーマ定理

こんにちは。ぬまです。今回は遺伝的アルゴリズム(GA)での探索をする際の基本原理であるスキーマ定理についてまとめたいと思います。
そもそもGAとはなんぞやという方はこちらを参照ください。
サルでもわかる遺伝的アルゴリズム - numa7pu’s diary

スキーマ定理とは

スキーマ定理でぐぐると以下の内容が記されていました。

遺伝アルゴリズムにおいてある遺伝子の特徴がどのように次の世代に遺伝していくかを示した定理. 遺伝子の部分列をスキーマといい, このスキーマをもつ遺伝子の数が遺伝演算によって次世代でどのように変化するかを確率的に示す事ができる.

わかりやすいですね。簡潔です。私もここまでまとめたいのですが、説明しがちなので、どゆこと?という人向けに説明します。

そもそもスキーマってなんやねん

スキーマとはGAにおける遺伝子の集団に保持される部分構造で0, 1, * で表される。*は0,1どちらでもよいという意味でワイルドカード記号ともdon't careとも呼ばれる。
具体的には、
H = * * 1 1
スキーマについて考えると各個体0 0 1 1, 0 1 1 1, 1 0 1 1, 1 1 1 1がスキーマHに属するという。
すなわち、スキーマHがわかると集団の特徴がわかるということになる。
さらに、スキーマについて語るのに外せないのがスキーマの定義長とオーダーという概念。

スキーマの定義長

 \delta(* * 1 1) のように書き、左から見て最初の*以外の文字と最後の*以外の文字との距離である。
例えば
 \delta(* * 1 * 1 * ) = 5 - 3 = 2
 \delta(* 0 * * * *) = 0

スキーマのオーダー

 O(* * 1 1)のように書き、スキーマの0または1の数を表す。
例えば
 O(* * 1 * 1 *) = 2
 O(* 0 * * * *) = 1
これらを用いてスキーマ定理を紹介する。
現世代を t世代としたときのスキーマHの数を m(H, t)として次世代にどう影響があるのか数式化する。
使われる変数を以下にまとめる。

変数

 n 集団のサイズ
 f_1, f_2, \cdots, f_n 各個体(遺伝子コード)の適応度
 f(ij{\cdots}k) 文字列 ij{\cdots}kの適応度
 f(H) スキーマHの適応度
 \bar{f} 集団の平均適応度
 m(H, t) 世代tにおけるスキーマHに含まれる文字列の数
 l 遺伝子の長さ
 \delta(H) スキーマ Hの定義長
 O(H) スキーマ Hのオーダ
 P_c 交叉確率
 P_m 突然変異確率

これらを用いて、次世代のスキーマHの数 m(H, t+1)を交叉も突然変異もない場合、交叉のみ起こす場合、突然変異と交叉を起こす場合の3通りを考える。

スキーマ定理(メイン)

スキーマ定理を3通りから導出する。遺伝的アルゴリズムは遺伝子操作に交叉と突然変異があるため、スキーマの定理は最後の式となる。

交叉・突然変異がない場合

個体iは全個体の適応度の中に占める適応度の割合で次世代に残るので
 m(H, t+1) = m(H, t) \cdot n \cdot \frac{f(H)}{\sum{f_i}}
 m(H, t+1) = m(H, t)\cdot\frac{f(H)}{\bar{f}}
となる。

交叉のみの場合

定義長が長いと交叉が起きたときにスキーマが破壊されやすくなる。さらに、交叉点が \delta(H)の中にあるときに破壊される。よって
 m(H, t+1) \geq m(H, t+1)\cdot\frac{f(H)}{\bar{f}} \cdot (1 - P_c \cdot \frac{\delta(H)}{l-1})
となる。

突然変異・交叉がある場合

スキーマが破壊されるのはスキーマHのO(H)個の0または1 が突然変異を起こしたときであることがわかる。よって
 m(H, t+1) \geq m(H, t) \cdot\frac{f(H)}{\bar{f}} \cdot (1 - P_c \cdot \frac{\delta(H)}{l-1} - O(H) \cdot P_m)
とわかる。これがスキーマ定理である。
これより、短くて低いオーダであり、かつ適応度が平均以上のスキーマが飛躍的に増大するということがわかる。

まとめ

いかがだったでしょうか?
難しかった人も簡単に理解ができた人もみなさんの頭のすきーまに残ってくれると嬉しいです。
今回はGAを語る上で大切な基本定理スキーマの定理を紹介しまとめた。面白い定理です。
それではまた。
参考文献
スキーマ定理とは何? Weblio辞書
http://mikilab.doshisha.ac.jp/dia/monthly/monthly03/20030602/personal/GA/01_mori.pdf

AtcoderBeginnerContest174 C問題の考察

ABC174Cの考察

こんにちは。numaです.

今回は前回のABC174がどうして解けなかったのか。どういう風に考えれば解けるのか。分析して自分の脳内を整理したいと思います.

筆者自身、まだまだ茶色の端くれで理解が甘いところがあると思うのでご指摘や別解等があると嬉しいです.

ABC174での出題問題

A: Air Conditioner

B: Distance

C: Respect

D: Alter Alter

E: Logs

F: Range Set Query

今回はCのRespectに着目します.

C: Respect

問題文

高橋君は K の倍数と 7 が好きです。
7,77,777,… という数列の中に初めて K の倍数が登場するのは何項目ですか?

存在しない場合は代わりに -1 を出力してください。

制約

1≤K≤10^{6}
K は整数である。

僕はこの問題を解いてて1週間は7が嫌いになりました.

むずかしくないか??

とりあえず、num=7; num*=10; num+=7; するんだろうけど、、

明らかにオーバーフローするからどう対処するの、、、

longlongでやるにも18桁後にはオーバーフローを起こすしなぁ、、、

私はこのとき、modに着目しあまり理解をしていないフェルマーの小定理やmod逆元などについて調べてました.いけそうだけどいけない(心の声...)

では、解説に移りましょう. 

と、その前にmodについてまとめます.

modとは

modとは余りを求める演算子のことでプログラミング言語ではしばしば「%」という演算子で求められます.Atcoderなどの競技プログラミングをしたことのある人は使ったことのない人はいないと思います.

例えば 20 (mod 3)を考えてみましょう.20を3で割った余りなので2となり

   20 % 3 = 2

と計算してくれます.

これは  20 ≡ 2 (mod 3) と書きます.

どこで使えるの?という方に

modは基本的に

ユークリッド互除法

・mod逆元

・二項係数

などがあります.

まとめに詳しい参考文献を紹介します.
解説に移りましょう.

解説

まず、アプローチとして

7, 77, 777, 7777, ...

の中でKの倍数となるのは何番目?という問題なので順番にmodを取ることで余りが0となるときに初めてKの倍数になることがわかります.

すなわち、modの世界で倍数判定を行えばうまくいくことがわかるでしょう.

例えば、入力例1を考えます.

input: 101, output: 4

なので、7777は101の倍数であることがわかるので、4番目の4が答えとなります.

これをmod 101 の世界で考えます.

ans = 1 のとき  n = 7 ≡ 7 (mod 101)

      ↓ n = n*10 + 7

ans = 2 のとき n = 77 ≡ 77 (mod 101)

      ↓ n = n*10 + 7

ans = 3 のとき n = 777 ≡ 70 (mod 101)

      ↓ n = n*10 + 7

ans = 4 のとき n=7777 ≡ 707 ≡ 0 (mod 101)

      ↓ n = n*10 + 7

      …

というように7, 77, 70, 0, 7, 77, 70, 0, ...というようなグラフ構造になることがわかります.よって、最初に余りが0になる、すなわち101の倍数となるのは4番目の7777が答えとなります.また、サンプルにもあるように入力が2の時は奇数である77...の倍数にはなり得ないことに注意してください.

これで解けました.プログラムは以下のようになります.

#include<bits/stdc++.h>
using namespace std;
#define fast_io ios_base::sync_with_stdio(false) ; cin.tie(0); cout.tie(0);

int main(){
    fast_io
    
    ll k;
    cin>>k;
    if(k == 2){
        cout << -1 << endl;
        return 0;
    }
    ll num=0;
    for(int i=1;i<2e6;i++){
        num *= 10;
        num += 7;
        num %= k;
        if(num==0){
            cout << i << endl;
            return 0;
        }
    }
    cout << -1 << endl;

    return 0;
}

まとめ

オーバーフローに対処する時にmodの世界で考えるというのが肝でした.
modというのは今後たくさん出てくる可能性が高く、フェルマーの小定理や拡張ユークリッドやユークロッド互除法などの整数分野で必須の知識となるので復習が必要だと考えます.
では、今日はこの辺で.

参考文献

qiita.com

サルでもわかる遺伝的アルゴリズム

サルでもわかる遺伝的アルゴリズム

こんにちわ。numaです。

基本的な遺伝的アルゴリズムについてまとめたいと思いたちました。

サルでもわかるようにまとめるつもりですので、温かく読んでいただけると幸いです。

(ウキウキーーウキーーー)

サルでもわかるはそういうわけではないです、、笑

ご指摘や改善案、感想などは絶賛募集中です。(たたくのだけはやめてください笑)

遺伝的アルゴリズム(Genetic Algorithm:通称GA)

遺伝的アルゴリズムとは生物の進化から着想を得た人工知能です。これは1975年にミシガン大学のJohn Hollandが考案しました。

人工知能と言えば数年前から有名なDeepLearningや機械学習といったワードがが思い浮かぶと思います。DeepLearningは人間の脳を模倣したモデルですが、遺伝的アルゴリズムは生物の進化を模倣してその時の環境(評価関数)に対して最適な解(なるべく良い答え)を求めることが可能な手法です。

雑に言うと、たまたま良いものが出たら後世に伝えていこう、といったイメージです。

(伝われ!!!雑、、)

では、実際のアルゴリズムです。

基本的なアルゴリズム

①初期集団生成

 プログラマが決めた集団数個の個体をランダムに生成します。

②評価

 集団内のそれぞれの個体に評価値をつけます。

③選択

 評価値の高い個体を選択します。

④交叉

 選択された個体同士を交叉させて新たな個体を生みます。

⑤突然変異

 ある一定の確率で突然変異を起こします。これは良い方向や悪い方向さまざまです。

⑥条件を満たしていれば終了、満たしていなければ②~⑤を繰り返す。

 試行回数がプログラマが指定した回数に達していたり、最良の評価値が最適解に達したりしたら終了します。

 

f:id:numa7pu:20200802135103g:plain

 (http://home.interlink.or.jp/~kumagai/genealg.htm から引用)

逆上がりを例にイメージしてみる

ここでは小難しい話や複雑な話は割愛します。実際とは多少異なることがあるかもしれないですがわかりやすさを重視するためご了承ください。逆上がりの習得を例に考えてみましょう。

①初期集団生成

わかりやすく言うと何百人の子供が鉄棒に初めて触れて坂上がりのやり方を知らずに1回やってみる感覚に近いと思います。

②評価

逆上がりを知っている教師がそれぞれの子供たちに決められたルールに従って点数をつけていく作業です。

③選択

点数の高い子供を選びます。

④交叉

本来は交叉させて新たな個体を生みますが、例が下手なため表現を変えます。

選択された子供が他の子供たちにどうやったら点数が上がったのか口頭で一回教えるイメージです。つまり子供たちがレベルアップしたのです。これで多少はより高い評価がもらえるかもしれません。

⑤突然変異

突然子供がコツを掴んだり感覚が狂ったりするイメージに近いですかね。

⑥終了条件判断

子供たちの逆上がりチャレンジ回数やきれいに成功した人がいたら終了です。満たしていなければ繰り返します。

 

これにより、何も知らない子供たちが先生の評価に従って最適な逆上がりを探索できました。

研究例

・スケジューリング問題

・巡回セールスマン問題

・実数値関数最適化

・ナップザック問題

等さまざまな複雑な問題に対して最適化の研究が行われています。

GAで生まれた実際の例

・新幹線N700系

詳しくはこちら https://plaza.rakuten.co.jp/sugowaza/diary/200707060000/

まとめ

サルでもわかる遺伝的アルゴリズムいかがでしたか?

GAはまるで自分でサンプルを生成して学習しているような挙動が興味深く感じてきませんか?そうでしょう。そうであってほしいです。

GAのイメージの手助けになっていると嬉しいです。また、ここで得られる最適解はいままでの最適解とは一味違った見たこともない結果が出てくる可能性があるので面白いですね。

 

参考資料

楽天ブログhttps://plaza.rakuten.co.jp/sugowaza/diary/200707060000/

 Kumagai's PAGE~GAとは~ http://home.interlink.or.jp/~kumagai/genealg.htm