Slide 1

Slide 1 text

マインクラフトのコマンド圧縮の効率化を考え たら、40年前の論文のアルゴリズムを実装す ることになった話 Kurisaki Kazuma Meguro LT 2024-06-25

Slide 2

Slide 2 text

Kurisaki Kazuma 
 AI-Shift (CyberAgent) Frontend engineer Hobby: ♠ 🦑 💻 🚶 https://x.com/KK_sep_TT https://github.com/kult0922

Slide 3

Slide 3 text

マインクラフトの画像変換アプリを作っています 作成した設計図はゲーム上に自動生成が可能 https://www.minecraft-dot.pictures

Slide 4

Slide 4 text

コマンドで配置する /setblock (x y) block_id /setblock 0 0 plank /setblock 0 1 plank /setblock 0 2 plank /setblock 1 0 plank /setblock 1 1 plank /setblock 1 2 plank /setblock 2 0 plank … 配置するブロックの数 = 実行コマンド数

Slide 5

Slide 5 text

コマンドで配置する /fill (x y) (x y) block_id 指定範囲の長方形の範囲に指定ブロックを配置する 左上 右上 /fill 0 0 4 3 plank 💡fill コマンドを使うことで実行コマンド数を圧縮できる

Slide 6

Slide 6 text

fillは長方形の形でしか配置できない OK NG /fill (x y) (x y) block_id

Slide 7

Slide 7 text

つまり。。。 複合長方形の最小分割を求めたい 最少分割数 : 3

Slide 8

Slide 8 text

アルゴリズムの論文があった! https://cir.nii.ac.jp/crid/1050282812867071360

Slide 9

Slide 9 text

論文を理解して実装 アルゴリズム概要 1. 複合長方形の縮退線を求める 2. 独立な縮退線の最大マッチング を求める 3. 複合長方形の輪郭をlinked listで管理 4. 2の縮退線で分割複合長方形を分割 5. 分割された長方形をの輪郭を走査して 8つのパターン分け で 分割していく skip

Slide 10

Slide 10 text

できた

Slide 11

Slide 11 text

単純な貪欲法との比較 分割数: 8 分割数: 14 複合長方形の大きさ、形に依存するが 、小さいものでも半分ほど圧縮できる 単純貪欲: 水平方向の連結だけを見てグルーピング 論文の実装 (理論値)

Slide 12

Slide 12 text

大変だったこと ● アルゴリズムが難解 ○ 理解するのに1日 ● 実装が鬼大変 ○ 図形の輪郭抽出 → linked list 化 ○ linked listの輪郭を分断するアルゴリズム ○ エッジの最大マッチングの実装 ● アルゴリズムをガッツリ組むにはTS(JS)だと大変 ○ console.log の出力が参照なのでデバッグが困難 ○ 有名アルゴリズム、データ構造でもライブラリがない (or 機能が少ない) 実装まで丸一週間くらいかかりました 😇 輪郭抽出して linked list で管理

Slide 13

Slide 13 text

振り返り Good ● 大変だったが、実装は楽しかった ● TS(JS)で複雑なアルゴリズム力が付いた ● コマンド圧縮の理論値を出せた ● 理論値はロマン Bad ● すごい時間がかかった ● コマンド圧縮によるユーザへのインパクトは少ないかも?

Slide 14

Slide 14 text

個人開発ならオーバーエンジニアリングは自由 ● (モチベが続けば) 無限にリソースを投下してもOK! ● オーバーエンジニアリングによって得られる学びもある 面白そうなことは利益度外視でやっていきたい 💪