ぱたへね!

はてなダイアリーはrustの色分けができないのでこっちに来た

FPGAX(FPGAエクストリーム・コンピューティング)#12

fpgax.connpass.com

東工大で開催されたFPGAX勉強会へ行ってきました。

会場は大きく、人も多く大盛況でした。イベント開催に向けて動いていただいた皆様、ありがとうございました。久しぶりに会う方も多く、近況を聞いたり挨拶したりができなかったのが残念。

「ElixirでFPGAを設計する」高瀬 英希さん(京都大学/JSTさきがけ)

ElixirはErlangとRubyの子供。Erlangの書きにくいところを書きやすくしてくれる。今の完成度だと数値のListのみが扱えるので、綺麗な書き方で数値計算ができるとうれしい感じ。Listがどこまでできるか微妙なのですが、グラフをListで表せばグラフ処理ができるとうれしい。

当日はZenは受けない雰囲気。FF4のコカトリスは隠れキャラだし単体にしか効果が無いのでは。そこが会場のリアクションが薄かった理由だと思った。

春から使ってみたい。

「シミュレーテッド分岐アルゴリズムのアクセラレータとその応用」辰村 光介さん(東芝 研究開発センター)

東芝さんのスパコン的な取り組みの紹介。背景からFPGAの実装まで。 歴史的なIsing Problemの説明と量子コンピューターの説明が面白かったです。

SB(Simulated Bifurcation)は、SAベースでは無く全結合の問題が解ける。グラフで目的変数の最小化が見えるのが面白い。Adiabaticサーチ -> Ergodic サーチ。

円→ドル、ドル→円の交換を行うと必ず損をする。そこに、他の国の通貨を混ぜて複雑な交換をすると、利益が出る瞬間がある。そこをリアルタイムで見つける話がすごかったです。これで開発費が回収できていたらもっと面白かった。

離散最適化の並列化に興味を持っていたので面白く聞けました。春から勉強したい

「柔軟な資源割当てを可能とするFPGAクラスタシステムとそのネットワーク」佐野 健太郎さん(理化学研究所 計算科学研究センター)

前半が理研とスパコンのお話でFPGAクラスターのアーキテクチャのお話。 プロセッサとFPGA間にバスを接続し、loosely couloed clustersを構築するお話。結局CPU→FPGAにボトルネックが増えそうなので、計算のアルゴリズムによってどれが最適なのかは分からない気がしました。

全然規模が違うのですが、1枚の基板にFPGAを17個並べる(4x4の真ん中にもう一つ)ボードを設計したのを思い出しました。懐かしい。

神戸の理研にあそびに行きたい

LT

時間の関係で途中までしか見れませんでした。

ROS+FPGAを使ったロボット開発(京大、新田さん)

関西でもFPGAXやりたい。

FPGAとGPUの性能比較ベンチマークをやってみた時にそこそこ苦労した話(安藤潤、ザイリンクスジャパン)

こういう情報が簡単にWebで見つかるようになって欲しい。やっぱりZenは受けない。

FPGAを使ったAIエッジコンテストのお知らせ+α(nkhrさん)

nkhrさんの正体はnakahara先生だった。ΩΩΩ<な、なんだってー

Google Colaboratoryで始めるFPGA開発入門(aster_ismさん)

トイレ開発は衛生面注意しましょう

この後、NNgenの公開イベントがあったもよう。春から頑張りたい。

数理最適化: Optimization Night #1

15日に行われた数理最適化の勉強会に行ってきました。 会場はブレインパッド様の部屋をお借りしました。いつもありがとうございます。

動画はこちらから見ることができます。素晴らしい。

www.youtube.com

技術書典を支える最適化技術

sfujiwaraさんの発表です。

発表資料はこちらで見れます。

speakerdeck.com

技術書典というイベントでのブースの配置を最適化する話です。最適化の余地を残すところと、ハイパーパラメータの調整はやりたくないのバランスを取るところが面白そうでした。

ブースの分類にRubyと機械学習の両方タグがあった場合、Rubyの島に入れるのか、機械学習の島にいれるのか自動で判別するのが難しい問題。会場から上がったRubyの方が愛を感じるからRubyでしょに対して、sfujiwaraさんがそれが人間の判断じゃんと返したところが面白かったです。愛をどう特徴量に落とすのかがキモですね。一つは、タグの希少度だと思います。Rubyと自作キーボードだと、どっちに愛があるのか難しいですね。

技術書典はまだ行ったことがないので次は行ってみたいですね。

「カルチョビット」で選手のトレーニングメニューを最適化してみた。

mas_yamamotoさんの発表です。

発表資料はこちらです。

www.slideshare.net

ゲームのトレーニングを最適化しようというお題でした。いくつもの組み合わせを見ると最適化したくなってしまうのは職業病ではと若干心配になりました。

面白かったのは、手持ちのカードだけで最適化してしまうと上手く行かないところがある所です。次に引くカードの予測が入っていないため、目先の最適化だけで進めると後で要らないカードが残ってしまう。一方で未来のカードは何が来るのか分からないので最適化に使えない。これは、次に来るカードの確率も入れて最適化するしか無いなと思いました。

Google OR Tools で数理最適化に入門する

杉山さんの発表です。

発表資料はこちらです。

speakerdeck.com

ツールを選ぶ選択肢としてpipでインストールできるとうれしい、本日二回目の話題でした。pipうれしいですね。MiniZincという制約ソルバーは少し触った事があったので、デモ自体はふーんという感じで聞いてました。どの最適化ツールもそれなりに面倒ですね。数理最適化が仕事の人ならともかく、たまにツールとして使いたいってときに、もっと簡単なのがあっても良いと思います。

制約条件を英語で書いたら勝手に制約条件にしてくれる技術(多分Deep Learningでできるよ)に期待します。

その他

最適化問題の良い本を教えてもらいました。

ナース・スケジューリング (シリーズ:最適化モデリング)

https://www.amazon.co.jp/dp/4764905582www.amazon.co.jp

そういえば、Veritakの開発者がこういう最適化をやっていると聞きました。

https://nurse-scheduling-software.com/profile2.pdf

僕のお勧めは、離散最適化で良ければCorseraのこのコースです。

www.coursera.org

すごく面白かったので、次回か次々回には発表したいですね。 発表ネタはあるのですが、日本ディープラーニング協会のE資格の勉強が結構大変・・・

ONNXの最適化まとめ

ONNXの最適化を一通り試してみたのでまとめ。

サポートしている最適化一覧の取得

サポートしている最適化は、get_available_passesで取得できます。

from onnx import optimizer
all_passes = optimizer.get_available_passes()

大きく分けると、このように分類できます。

  • 意味のないOpの削除 (eliminate_deadend等)
  • 2つのOpのfusion (fuse_matmul_add_bias_into_gemm等)
  • Convへのfusion (fuse_add_bias_into_conv等)
  • その他

convへのfuseは全く動かず、バージョンアップ待ちです。

最適化の結果

Qiitaにそれぞれまとめました。

nop

nopは最適化のパスとして指定できますが、何も最適化しません。他の最適化のテンプレートです。

lift_lexical_references

これは上手く試すことができませんでした。Loopや条件分岐で階層的になってしまっているグラフをフラットにするようですが、動かすことができませんでした。バージョンアップ時に試してみたいです。

split最適化

これが唯一面白かった最適化です。

グラフの中で毎回計算しないといけない所と、一度だけ計算すればよい所を別のグラフに分離します。

このグラフで考えます。

f:id:natsutan:20191002095626p:plain

左上のAddが定数のみの足し算です。グラフの計算を実行する時に毎回計算する必要が無い部分です。真ん中のAddは、入力Xによって結果が変わるので毎回計算必要です。これを、split最適化を行ってグラフを分離すると以下の2つになります。

f:id:natsutan:20191002095652p:plainf:id:natsutan:20191002095704p:plain

左が一度だけ計算すればよいグラフ、右が(その結果も使って)推論時に毎回計算するグラフになります。

コンパイラでよくある定数の畳込み(定数伝播)を実現するための最適化です。ONNXの場合実行時の計算精度がわからないのでホスト(最適化の実行環境)で畳込んでしまうのではなく、畳み込みの計算をonnx runtime側に計算させる意図があるのかなと思いました。

最後に

ONNXの勉強も兼ねて順番にやってみましたが途中で飽きてしまいました。最後のsplit最適化が面白くてよかったです。

グラフの最適化はどのフレームワークでもやるので、個別のフレーワークでそれぞれ書かずにONNXでやるのは合理的なきがしましたが、この程度ならそれぞれ書いてもよいですね。操作のためのAPIは、もう一個上のレイヤー欲しい。

Qiitaは書けば書くほど、誰もいいねしていない記事ですら検索の上にくるので、微妙な気持ちになりました。検索ページの3ページ目くらいで出てくれれば良いんですが、そういうのは難しいのかな。今回、Qiitaとはてなに同じような記事を書いたのも、SEO力の比較をしたかったというのがあります。どうなることやら。

TFUG KANSAI Meetup 2019

土曜日に久しぶりのTFUG KANSAIのイベントを行いました。

https://tfug-kansai.connpass.com/event/146442/

会場は、株式会社SANSAN様の透明感あふれるオフィスをお借りしました。ありがとうございます。 参加者はほぼ予定通りで、会場の椅子がぴったり埋まりました。TFUG KANSAIの傾向として年配の方の参加が多く、質問はそれなりに突っ込んだもの、ハッシュタグがほとんど使われません。これはTFUG KANSAI開始時からずっと同じ傾向です。今回も質問は活発に行われ、最後ちょっと時間足りない感(もっと質問や議論がやりたそうな雰囲気)で終わるのも、これはこれでよいと思っています。ちょっと物足りなかった人は、ブログで気になったことを書いてもらったり、別の勉強会や次のTFUGで話題にしてもらったらと思います。

今回もすごくおもしろかったので、また次回企画しています。

機械学習の解釈について

一年前からずっと勉強していたことをまとめて発表できました。 https://www.slideshare.net/minorunatsutani/interpretable-ml

資料の最後にあるお勧めテキストです。興味ある方はぜひ読んでみて下さい。

・Interpretable Machine Learning https://christophm.github.io/interpretable-ml-book/

・機械学習モデルの判断根拠の説明 https://www.slideshare.net/SatoshiHara3/ss-126157179?fbclid=IwAR1H4Ert-_XpcoL-Vy3W_MvtSI7DjFmS3M0ldHgm1k3Y-1Ob-uiXWsSE8Q4

・AIプログラマになれる本 https://www.amazon.co.jp/dp/4296102052

TensorFlow 2.0rc overview 新村さん

@tf.functionにまつわる奇怪な挙動についての説明がわかりやすかったです。 TenserFlowの中でユーザーからは見えない状態を持ってしまっていて、同じ関数でも呼び出すタイミングで挙動が変わります。保存やExport周りでいっぱいトラブルありそうな感じがひしひしと感じます。グラフ(ニューラルネットワーク)を記述しているつもりが書いた順番に実行されちゃうのも、そこからくるトラブルもありそうです。

とりあえず素人はKeras使っておけばよさそう。

コンパイラ好きとしては、とても興味深いお話でした。

TensorFlow 2.0へ移行した話 有山さん

タイトルは間違いで移行しようとしたお話でした。こちらも2.0では苦労がいっぱいのようです。Googleさんは、量子化とかエッジ向けの機能も2.0対応をしっかりサポートしてほしいです。

スマホUIがおしゃれで、あの技術がうち(弊社)にも欲しいなと感じました。

発表内容の本筋とは外れますが、Tensorflowのよくわからん挙動について気楽に回答もらえる場は欲しいと思います。ただ、TFLite周りだとissueに何か見つければラッキーという状況はあんまり変わらない気がしますね。僕もONNXでそんな感じの時があります。

素人はまだ1.x系を使った方がよさそうでした。

M5StickVではじめる軽量モデルの実世界への応用 ミクミンP/Kazuhiro Sasao(@ksasao)さん

発表資料です。 https://www.slideshare.net/ksasao/20190928-m5stickv-tfug

M5StickVは初めて見ましたが小さいのにRISC-Vも入って機能がいっぱいでした。どうせお前らカメラ付いていたら物体検出するでしょ、ってのはまさにその通りで、いろいろ遊びでやる事にはAPIがそろっていて驚きました。

MoblieNetを特徴量抽出機として使い、別のアルゴリズムにつなげる話が面白かったです。こういう選択肢が増えると、低コストなハードの可能性が広がります。もっと精進せねばと思いました。

QRコードをかざしてM5StickVを制御するのが、僕的には謎技術で一度試してみたいところ。

最後に

オーガナイザー募集しています。 もし興味ある方がいらっしゃればご連絡ください。

AutoML Vison 物体検出 edge版のニューラルネットワークを見てみた

はじめに

natsutan.hatenablog.com

あれから時間も経ちだいぶ傷も癒えたので、また思い切って自腹でAutoML回してみました。会社のお金で回せる環境にあるのですが、実際にエッジAIやってるメンバーが忙しくて興味本位でお願いできず。ただ、そんなに費用かからなかったと報告を聞いています。ちなみに会社のお金でAutoMLで1回学習するために決裁書上げてもらいました。(パワポで資料を作って役員にお願いしたりしましたが、それはまた別のお話)

速度優先でやった所無料枠に収まり、精度優先にすると数時間かけても終わらなかったので途中でキャンセルしました。月が変わってボーナスが見えたら精度優先でもやってみたいです。

前回からの変更点

まず、物体検出もEdge向けにtfliteを出せるようになりました。デプロイ(有料)に関しても、勢いでチェック入れるようなUIではなくなりました。

f:id:natsutan:20190923123358p:plain
automl_train

UIの大きな変更点としては、注意点も含めて日本語になりました。分かりやすくなりましたね。

計算に使うコンピューティング時間に制限をつけられるようになりました。これで安心です。 早めにトレーニングが終わった時はそれ以上追加トレーニングができなかったです。これは前回がどうだったのかは良く覚えていません。

データセット

VOC2012を使いました。会社でAutoML回したメンバーより、データ数を少なくすると早く終わって費用が安くなると聞いていたので少しデータを減らしました。

f:id:natsutan:20190923123652p:plain
dataset

クラスは3つで、bottleが1266枚、personが2503枚、tvmonitorが1129枚の、合計4592枚です。personだけオリジナルのデータから数を減らしました。

学習結果

速度優先で学習すると、5時間程度で学習が終わりました。

f:id:natsutan:20190923123725p:plain
automl

結果はmAPが0.328と非常に残念な結果になりました。0.5を超えていればなんとかやりくりできそうですが、0.3程度だと実用上厳しそうです。早期終了した場合は追加学習ができないようで、これ以上速度優先で精度を上げるためにはデータを変える必要がありそうです。

f:id:natsutan:20190923123807p:plain

クラス別ですとtvmonitorはそこそこいってますが、personもbottleも全然駄目でした。

f:id:natsutan:20190923123825p:plain

ちなみに前回やったエッジ向けじゃ無い方の学習結果(低レイテンシー)では、personももっと良い値でした。

画像が足りないのか、エッジ向けで精度が落ちてしまうのか気になるところです。 次はpersonだけでも全データ使ってやってみたいですね。精度優先もやりたいですが、誰かスポンサーになって欲しいです。

個人的にはVOCのpersonは、personっていうより顔じゃね?とか一枚全部人みたいなデータもあるので、もうちょっと人を見つけに行くデータセットだと上手く行くかも知れません。AutoMLで物体検出するときのデータセットはこういうのが良いよとかノウハウが出てくると使いやすくなりますね。例えば、小さい物から大きい物までまんべんなく、物体の場所は問わない、とかそういうのありそうです。

学習後のモデル

前回と同じやり方で、学習後のモデルを可視化しました。

natsutan.hatenablog.com

予想以上に複雑なニューラルネットワークが出力されました。

https://raw.githubusercontent.com/natsutan/cocytus/master/doc/edge_od.png

入力が192x192という非常に小さいサイズになっていたので、このサイズ前提のデータセットにするともう少し精度上がるのでは無いでしょうか。あと、8bit量子化しないで、32bitの浮動小数点のままのtiny-yoloの方が速そうな感じはします。時間があれば比べてみたいですね。

One-Netbook OneMix 2SでDOSのゲームを遊ぶ

One-Netbook OneMix 2Sをゲーム機として買ったのですが、通常のゲームは字が小さくて辛くどうしてもDOSのゲームを遊んでしまいます。 ところが、SteamやGOGで購入したDOSのゲームを起動すると右側が切れる症状に悩まされていました。最近ようやく解決できたので記録しておきます。

f:id:natsutan:20190916123721p:plain

駄目な画面はこんな感じ。GPD Pocket等でも同じ報告あり。

解決策としては、正しくフルスクリーンで表示できるDOSBoxを使う事です。とりあえず、僕の環境で上手くいったのは、Steam版 Wizardry 6: Bane of the Cosmic Forge に含まれるDOSBox Daumです。DOSのゲームは、DOSBox Daumから起動することでフルスクリーンで遊ぶことができます。

f:id:natsutan:20190916123742p:plain

Dungeon Hackもこの通り。

DOSBoxの設定はDOSSHELLを使っています。

f:id:natsutan:20190916123755p:plain

このように、実行するDOSBoxのパスをSteamのWiz6の下にあるDOSBox DaunにすればOKです。

Coursera Discrete Optimization

www.coursera.org

動機

この講義は2年くらいまえから気になっていて、Machine Learningの次くらいに受けようかなと思っていたのが大分遅くなってしまいました。僕は大学でコンピュータサイエンスとかプログラミングを習ってないので、大学のコンピュータサイエンスの講義に憧れがあるんですよね。

そんなこんなでお仕事でもエッジのDeep Learningをやるようになりました。量子化された状態で係数をいじって再学習するのを浮動小数点演算を使わずにやろうとすると、それって離散最適化だよねって気がついて、そこから根性出してやってみました。

どんな講義

  • 熱血先生の熱い授業
  • 最先端のトピック
  • 異常に難しい課題

この辺が、僕が憧れるハイレベルな大学の講義そのもので良かったです。多分、東大とか京大とかMITとかはこんな講義しているはずです。

僕が卒業した東京理科大学でも熱血先生はいましたが、ちゃんと授業を聞いていれば単位はもらえたし、単位もらうために自分で論文を探してきて読んで理解しないと駄目って事は無かったです。はい。

最後までやってみてある程度のプログラミング技術と経験は必要かなと感じました。(情報系以外の学部生だと正直きついと思う)

  • グラフやツリーのデータ構造を書けて、適当に操作できる。可視化ツールを自分で作れる。
  • レアケース用の入力データを自分で作ってちゃんと処理できるか確認できる。
  • アルゴリムに乱数を使うときはシードを固定してデバッグするとか、そういう実践的なテクを知っている。
  • nが大きくなったときにメモリ不足で落ちるような、アルゴリズムと関係の無い障害も乗り越えられる。
  • 最後力業で解けそうなとき、ピンポイントで処理速度をチューニングできる
  • 英語の論文を読んでアルゴリズムを実装できる。上手く性能がでなくても泣かない。

くらいの力は欲しいです。

基本的には長い動画を見て、自分で離散最適化を解くソルバーを書きます。解くといっても全部最適解は最初から無理で、それなりの時間で近似解を求める実装になります。だいたい週末の課題が6問あって、先生の言うとおりに実装しても1問目くらいしか解けないのが困ったところ。制約ソルバーのアーキテクチャが聞けるという素晴らしい体験をしましたが、その通りに実装してもn=10000くらいの問題を解くのは無理だと思う。

講義のレビューを見ても「今まで受けたオンライン講義の中で一番難しい」とか「動画がクソ長い(loooooooooong)」とか、散々書かれていますが、☆5つだったりすので最後までやった人は楽しんでやってたと思います。個人的には動画が長いよりも、動画の内容が課題を解くのに役に立たないのがなんとかして欲しい。

ちなみに、Courseraには他にも人気の離散最適化のコースがあります。

www.coursera.org

三国志のアニメが目立つこちらの講義は、MiniZincという制約ソルバーを使って離散最適化を解く講義です。問題をどのようにソルバーに落とし込むかという講義です。講義のアニメが面白いのですが、僕の目的とは違ったので途中で解約しました。単純にソルバー使って問題解きたい人はこちらの講義をお勧めです。

プログラミング環境

最初は自分のVAIO+Rustでやってましたが、出張中のホテルでやりたくなって途中から会社支給のPCにしました。win10、i5、メモリ8Gの人権があるかどうかギリのラインです。人権以前にRust環境(正確にはVSのリンカー)が入れられなくてPythonで解きました。終わってみれば、そんなにハイパワーな環境は要らなかったです。

Rustはこういうアルゴリズムを試行錯誤するにはものすごく向いていない言語で、アルゴリズムが固まってからRustで清書しないと駄目という事を実感しました。例えば、ナップサック問題で入力が整数なのでi32としていろいろ書いた後、リラクゼーションという整数を実数に拡張してプルーニングの効率をあげる仕組みを入れようとすると、ほぼ全ての場所を書き換えて回るのが辛かったです。ただ、絶対負にならないと思っていた値が負になった瞬間に落ちてくれたので、しっかりしたプログラムを書くには良い言語だと思います。Rustに関しては、もっと経験値を上げたいところ。

内容

ナップサック問題

week1はチュートリアルなので、先生のコスプレを楽しんでいればOK。普通の人はweek2のナップサック問題で心が折れると思う。

f:id:natsutan:20190908012307p:plain

ナップサックに荷物を入れる入れないをツリー構造にして、再帰的に解を探し行く方法を教えた後にこういう例がでてきます。探索空間でずっと左ばっかりやって駄目だったら、一個右にいって後は左ばっかり選んでも良いよってのりなんですが、あれこれ単純に再帰で書くの難しくね?って思っていろいろ考えるわけです。

で練習問題は、n=1000とn=10000があってそもそもこのやり方だと全然計算が終わらない。普通にDP使っても駄目。ここで改めて最適解を求めたら駄目で、適当な点数を稼げる近似解が必要と理解するも、なかなか近似解の情報って無いんですよね。ちょうどその時に、この本を入手して事なきを得ましたが、この本がなかったらこの講義はweek2で挫折していたでしょう。

www.kyoritsu-pub.co.jp

彩色問題

ここで、汎用的な制約ソルバーの話がでます。

f:id:natsutan:20190908012408p:plain

多分、これを信じて汎用ソルバーを実装すると、それだけですごい時間食いそうな気がします。講義では4色とか決まった色を割り当てるアルゴリズムはそれっぽく教えてくれるのですが、課題は最小の色数を探す問題なのでこれまた講義が役に立ちませんでした。ちなみにこの問題の有効な解き方(Local Search)は後の週で詳しく教わります。

巡回セールスマン

ここが最大の壁でした。ただ、巡回セールスマンについては、厳密解が求めにくいこともあり、Webで近似解の情報を集めることができたのは良かったです。クロスした経路をまっすぐにしたり、ちょっと手を加えると値が小さくなるのがうれしかったのですが、課題の都市数が多すぎて小手先の最適化では歯が立たなかったです。

乱数を使ったアルゴリズムに入れる前に、greedyの出力をある程度整形してあげると効果が上がるのですが、整形しすぎると同じような局所解になってしまうのが面白かったです。ほどほどの状態で乱数を投入するのが良かったです。本来はここでシミュレーテッドアニーリングとかタブーサーチとか遺伝アルゴリズムを使って欲しそうな講義でしたが、基本的に講義のアルゴリズムは課題を解くときに信じないことにしていているので気合いで乗り切りました。

全体を通してずるをしたくなったのが唯一この週です。乱択アルゴリズを採用したので、暇な会議中にずーっとソルバーを回していると、たまに最適解っぽいのを出すんですよね。そうなると、自分が書いたソルバー自体は解く能力があるんだから、そのまま正解だしてもよくねと思ってしまいました。講義の最初に、答えだけ出力するのは駄目よって言われていて、外部のソルバー使って解いてもOKなのに、なんで答えだけはNGなんと思っていたのが、こういうことなんだなと。

人生で一度くらいは巡回セールスマンソルバー書いても良いと思います。

工場配置問題

講義ではシンプレックス法の説明がありました。多分、この本読んだ方が分かりやすいです。 https://www.amazon.co.jp/dp/4320017862

ほどほどに手こずって解きました。結局シンプレックス法は使わなかったし、人生で一度くらいはシンプレックス法書いた方が良いと思いました。

最終問題

最後の問題はあーなるほどーと思える問題でした。(内緒)

感想

SICPやCourseraのMLコースでも感じたのですが、途中まで泣きそうな課題を出しながら、最後の最後は急に難易度が下がるのはそういう物なんですかね。

greedyアルゴリズムが最強。いろんな指針でgreedy回したり、iterated greedyやるだけでもずいぶん点数かせげました。頭が良い人が考えるgreedyは、下手なアルゴリズムよりも良い成果と近似保証もあり侮れないなと思いました。

世の中にある汎用ソルバーはすごい。自分で実装したら数時間かかるものが秒で答え返してくる。

巡回セールスマンソルバーを書くという人生の実績を解除したので、また次の講義に挑みたいです。すごく楽しかったです。