Saitekika

開発目的

身近なファミレスをお得で健康に楽しむ方法を開発する

システム概要

予算内で高カロリー・低塩分に注文するメニューの組み合わせを探す

システム詳細

1 . 対象店舗の決定

よりこのシステムを意義ものあるためにするには、対象店舗が多くの人々にとって馴染みのものにする必要性がある。そこで全国的に展開されていて日本人に最も親しみの深いファミレスの1つと言えるサイゼリヤを今回の対象とする。
サイゼリヤのグランドメニューがネット上で公開されているため、そこにj掲載されているメニューを本システムの対象として扱う。

www.saizeriya.co.jp

2 . 予算の設定

学生間で執り行われる飲み会代として一般的と考えられる

¥3,000

を今回の使用可能な予算に設定する。

3 . 定式化

この問題は以下のように定式化できる

上限金額 P_{max}=3,000[円]

上限塩分量 S_{max}=20.0[g]

i番目の注文メニューの金額 P_i[円]

i番目の注文メニューの塩分 S_i[g]

i番目の注文メニューのカロリー C_i[kcal]

としたとき

制約関数
\displaystyle{\sum_i P_i ≦ P_{max}}

\displaystyle{\sum_i S_i ≦ S_{max}}
において
評価関数
E(P_i,S_i,C_i)

を最大にする注文の組み合わせを見つける。

ここで評価関数E_i(P_i,S_i,C_i)について
・塩分量は少なく
・総カロリーは多く
・金額は多く使った方が多くの料理を注文できる
という点を考慮して以下のように定義した。

\displaystyle{E(P_i,S_i,C_i)=\frac{\sum_i P_i + \sum_i C_i}{\sum_i S_i}=\sum_i \frac{P_i + C_i}{S_i}}

4 . 使用するアルゴリズムの決定

ここで注文した各料理に対しての評価関数E_i(P_i,S_i,C_i)

\displaystyle{E_i(P_i,S_i,C_i)=\frac{P_i + C_i}{S_i}}

と置くと

\displaystyle{E(P_i,S_i,C_i)=\sum_i E_i(P_i,S_i,C_i)}

と書ける。

ここまでを踏まえると以上は
重量制限を総金額,総塩分の制限に、
総価値の最大化を評価関数E_iの合計の最大化に置き換えたナップサック問題1の応用であるとみなすことが出来る。以下、サイゼリヤ問題と呼ぶこととする。

以上より、今回の問題は制約関数が一つ多いナップサック問題の応用に帰着することができた。ナップサック問題はNP困難2であるため、最適解を求めるのに今回は遺伝的アルゴリズムを用いて最適解に近い組み合わせを求めることに決める。

結果

上記で定めたサイゼリヤ問題を遺伝的アルゴリズムで解くとtable1のような近似最適解が得られた。

table1

考察

table1を見るとアルコールがあり実に楽しそうな結果が得られた。
このようになった理由は評価関数Eにあると考えられる。

いまEは以下のように定義されている。

\displaystyle{E(P_i,S_i,C_i)=\frac{\sum_i P_i + \sum_i C_i}{\sum_i S_i}}

塩分の総量が分母にあるため

\displaystyle{\sum_i S_i}= 0[g]

になるような注文方法だと評価関数Eが無限大に発散してしまう。

また、塩分のオーダーは高々10^1なのに対して金額やカロリーのオーダーは高々10^3である。
これでは評価関数内でそれぞれのパラメータを同等に扱えていない。
今回のケースでは、分母にあるオーダーの小さい塩分が他の二つよりも大きな影響を与えてしまっていることになる。

以上二つの理由より、評価関数の見直しが必要である。 ここで以下のように改めて評価関数E(P_i,S_i,C_i)を定める。

\displaystyle{E(P_i,S_i,C_i)=\sum_i C_i + \sum_i P_i - 100*\sum_i S_i}

こうすることにより ・0除算による評価関数の発散 ・金額/カロリー/塩分 のパラメータのオーダー違い を解決することが出来る。

上の場合と同様に

\displaystyle{E_i(P_i,S_i,C_i)=C_i + P_i - 100*S_i}

とすることで

\displaystyle{E(P_i,S_i,C_i)=\sum_i E_i(P_i,S_i,C_i)}

と書けるので、相変わらず遺伝的アルゴリズムによって近似解が求められる。サイゼリヤ問題に新しい評価関数を適用した問題をサイゼリヤ問題(改)と呼ぶことにする。

このサイゼリヤ問題(改)に対して再度遺伝的アルゴリズムを適用して最適なメニューの組み合わせを求める。

結果 その2

サイゼリヤ問題(改)に対して遺伝的アルゴリズムを用いたところ、table2のような近似最適解が求められた。

table2

結論

サイゼリヤを健康に楽しむためには酒類と炭水化物を大量に注文することが有効であることが本システムによって解明された。

これは他のファミリーレストランチェーンに対しても言えるのではないかと考えられるが、その一般性についての検証は今後の課題としたい。



1 . ナップサック問題
重量と価値の2つのパラメータを持つ色々な種類のお宝が目の前にある。
重量制限があるナップサックを用意し、総重量の制限内で価値最大となるお宝の持ち帰りの組み合わせを求める問題である。
NP困難であることが証明されている。

2 . NP困難
正面から戦うと時間がかかり過ぎてとても解けない問題