気づけば床に物が増えている。机の上もカオス。だけど掃除ってどこから手をつければいいか分からない。
そんなとき、ふと「これ、アルゴリズムで最適化できるのでは?」と考えてしまうのが、ソフトウェアエンジニアの性。
本記事では、20年のソフトウェア開発経験をもつ筆者が、部屋掃除にロジックを持ち込んでみた結果をお伝えする。
結論から言うと、「全探索」ではなく「貪欲法+バックトラック」が最も現実的だった。
1.掃除対象を構造化する:部屋を木構造とみなす
ソフトウェア開発で「構造化」は基本中の基本。まず筆者は部屋を木構造(tree)として再定義した。
「リビング」「キッチン」「寝室」などをノード(節)として捉え、それぞれの中に「机」「棚」「床」などのサブノードを持たせる。
さらに、棚の中に「文房具」「書類」「コード類」などを分類して階層化。こうして部屋全体をノードとリーフで構成されたオブジェクトとして捉えた。
これにより、どこまで掃除が進んでいるかを状態管理しやすくなり、優先度や重要度もタグとして付加できるようになった。
エンジニアリング的には、ツリー構造+タグベースのマネジメントで、複数の観点から進捗をトラッキングできるようになるのがポイントだ。
出典:ほしのこCH
2.アルゴリズムの選定:貪欲法とバックトラックの併用
部屋掃除のアルゴリズムに万能なものはない。全探索を試みたが、現実には時間的・体力的コストが高すぎた。
そこで筆者は「貪欲法(Greedy)」をベースにし、途中で失敗したら「バックトラック(Backtrack)」で戻るという方針をとった。
貪欲法では、目の前に最も散らかっているエリアを優先して着手。目視で「視覚ノイズ」が多いエリアを選ぶのがコツだ。
だが、途中で行き詰まることもある。たとえば、散らかっている棚の整理中に思い出の品が出てきて手が止まる、など。
こういうときは「中断フラグ」を立てて他のノードに移動。一定時間後に再挑戦する「バックトラック」を自動で走らせる。
まさに、ロボット掃除機のアルゴリズムと人間の気分をミックスしたような、人力AI的手法と言える。
🎁 Sponsors: Amazon | Prime | Music | Audible | Kindle Unlimited 🎁