見出し画像

【球場飯】最大効率の料理選びを求める~Excelのソルバー機能を使ってみた~

お久しぶり,あるいは初めまして.しがないコストリーガーのサボり魔です。

前回のコストリーグ結果分析から約2か月,前回は”第一弾”結果分析を銘打っていたくせに,第二弾はいまだ下書きすら書いておりません。サボり魔です。

言い訳すると,リアルの方で修士論文書いてました。この記事を書き始めた日にちょうど修士論文を提出したので修士論文から解放されてすぐに記事を書いてます。
論文と比べれば形式も内容も気にしなくていいnote最高!!
なら早くコストの続編を書け;’.・(゚ε゚(O三(>_<`)o

そんな話は置いておきまして……
今回は「プロスピa内のイベント『俺の球場飯!!』において今持ってる食材で最もポイントを稼げる料理の組み合わせを求めてみよう」
というコンセプトのもとExcelを利用してやってみたことの紹介です。

参考にしていただくもよし,ここおかしいだろうとつっこんでくれるもよし,シェフのお任せに勝るものなし!ᕙ( 'ω')ᕗムキッのストロングスタイルもアリだと思います。
可能な範囲で分かりやすく,かみ砕いて紹介していくつもりですので是非お付き合いをよろしくお願いします。(*ᴗˬᴗ)⁾⁾

注)Excelを利用しますのでMicrosoft Officeのライセンスがない人はおそらく使えません。Offfice入ってないけど,やってみてできたって方は是非教えていただけますと嬉しいです。

前提条件

まずこれを参考にする人は
とりあえず
「すべての球場飯を作り終えてコンプリート」の状態にしてください.
イベントの進め方としては

①とりあえず全メニューコンプする。
②累計までポイントを稼ぐ。

の流れだと思います。
この②を効率よくやるための方法なので①は各自でお願いします。
①はそんなに手間じゃないはず……(あくまで個人の見解です。炎上したくないので予防線張っておきます.)

この画面が出てからが本番だったりする……(拾い画です)

さらに,球場飯の作り方として

同一レアリティの食材3つで球場飯を作る

を前提条件としています。
違うレアリティの食材だと一定確率で上のレアリティの球場飯ができたりしますが,今回は考えてません。
理由は主に私は特訓90%を信じてなかったりするからです。
なんで特訓90%は失敗するのにSランク10%契約書は全然当たらないんでしょうね???
Aランク90%契約書と改名してくれた方が精神衛生上いいのになぁと思ったり思わなかったり……
話がそれましたね~
前提条件は
・全メニューコンプしてからこれを参考にしてほしい
・食材のレアリティは3つとも同じで球場飯を作る
ってだけです。
分かりやすく.かみ砕いてって言ってたのに冗長になっていますね…悪い癖です。(研究室の同期の倍以上のページ数の修士論文書いてて死にかけたのに学ばないサボり魔です)

事前準備

題名にもありますが,今回はExcelの機能の一つであるソルバーを使います。
ソルバー機能を導入すること自体はExcelが使える環境なら1分もかからずにできますので,その手順からご紹介します。
もうソルバーアドイン追加してるって人は飛ばしてください。
(Excelを使えないっていう方(主にMicrosoftOfficeのライセンスがない方だと思います)にはすいませんがソルバーアドインの追加方法を知らないです……今回の手法は使えないと思って,このnoteから卒業してください。)

第1ステップ~ソルバーアドインの追加~


では早速ですが,第一ステップ一緒にやっていきましょう!!
上に添付したExcelを開いていただきまして……
(ウイルスとかしこんでないので安心してください。不安な方は一番下にこのExcelでそれぞれのセルがどのような関数になっているのか説明しますのでご自分で作っていただいてもOKです!)

おそらくこういう画面になります

左上にあります,ファイルをクリックするとこんな画面になると思います。

左の一番下,オプションをクリック

左の一番下にあるオプションを選択。
すると次のような画面になりますのでアドインを選択。

左の下から2番目アドインを選択

いろいろな機能が出てくると思いますが,一番下の「管理」の横のタブに「Excelアドイン」が選ばれていることを確認して,さらにその横の設定を選択。

真ん中の一番下のタブがExcelアドインになっていることを確認してから,設定をクリック

すると追加できるアドインが表示されるので,「ソルバーアドイン」チェックをつけてOK!

このような状態でOKをクリックすれば終了です!

これで事前準備は終了です。お疲れさまでしたm(❁_ _)m

作業手順

第2ステップ~所持食材の打ち込み~

先ほど添付したExcelファイルにおいて右上に「所持食材」とあり,セルが黄色くなっているところに現在の皆さんの持っている食材数を打ち込んでいってください。

ここですね

この際に「同一レアリティの食材」の数だけを打ち込むことに注意してください。
☆1なら☆1の食材の数を,☆2なら☆2の食材の数だけに注目して各食材の所持数を打ち込んでください。例えば、下の画像であれば☆1に注目するのであれば,上から8,1,4,3~となりますし,☆2に注目すれば4,2,3,8~というような感じです。

この画面は試合選択画面から行きましたが,イベントホーム画面からであればExcelの順序と同じ順で表示されます。

第3ステップ~ソルバー機能を使う~

打ち込みが終わったら,ソルバー機能を使って最適な答えを求めていきます。
一番上の「ファイル」「ホーム」とあるところの「データ」を選択すると,先ほどソルバーアドインを追加したことによってソルバーの項が増えていると思います。この「ソルバー」を選択します。

データの項を開き,ソルバーを選択

すると次のような画面が表示されると思います。

この画面が表示されていれば,解決をクリックするだけです。

この画面が表示されているあなた!次の裏ステップは飛ばしてください。
されていない場合は,設定を最初からしていく必要があります。
1つ1つ一緒にやっていきましょう!

裏ステップ~ソルバーの設定を行う~

まず最初に目的セルの設定を行います。
ここでいう目的セルは「球場飯を作ることによって得られるポイントの累計を表しているセル」になりますので,下の画像の右下,獲得ポイントの最も下のセルとなります。どのセルの値を目的通りにしたいのかを設定している操作です。

右下のセルはそれぞれの球場飯の作成によって得られるポイントを累計したものになっています

次にその目的セルの値をどうしたいのか,目標を決めます。
今回の場合,累計獲得ポイントを最も大きくしたいので最大値にマークします。

最も累計ポイントを大きくしたいので最大値を求めます。

次に「変数セルの変更」を行います。
ここでいう変数,つまり色々変える数字は「どの球場飯を何個作るのか」になりますので作成数の列,今回のExcel上ではR26からR46となります。

次は様々な制約条件を設定します。制約条件の追加は上の写真真ん中右にある,「追加」を選択するとできます。

こんな感じで制約条件を追加できます

細かく1つ1つの制約条件を説明はしませんが,今回の方針としては

  • 球場飯の作る数は整数
    →実際の料理のように0.5人前の料理とかは作れないので整数に限定。(制約条件の1列目:今回のExcelでは上はR26から下はR46までの各球場飯作成数を「セル参照」に選択したのちに真ん中のタブでは「int(整数)」を選択)

  • 必要食材は所持食材の数以下
    →持ってる食材で最大のポイントを求めたいので,持ってない食材を使って球場飯を作ることのないように。仙人のように霞を食べてポイントもらえたらいいのに……
    (制約条件の2行目より下すべて:今回のExcelではE2からE15までの必要食材をそれぞれ「セル参照」に。真ん中のタブは≦(小なりイコール)を選択し,「制約条件」にはC2からC15の所持食材をそれぞれ選択してください。)

で行います。
逆に言うとこれだけです。
これを式として書くと分かりづらくなってしまいますが,やってることはこれだけ。非常に簡単。小学生でも説明されればわかると思います。
最後に「制約のない変数を非負数にする」にチェックを入れることを忘れずにしまして,同じく「解決」を選択すれば終了です。
チェックを入れずに解決すると-1の球場飯という謎の概念が生まれます。謎の概念は呪術廻戦の中だけにしまっておきましょう。

得られた答えで何をすればいいの?
~プロスピAでの作業編~

こうして得られた答えをどうやってプロスピ内で活用するのか?
それは作成数に表示されている数だけその球場飯を作るだけです。
この表示されている作成数が
「現在の所持食材で最もポイントを稼げる球場飯作成パターン」
になっています。

その通りに作ればそれが最も効率的!ソルバーアドインをそもそも追加していた人にとっては所持食材を打ち込む数分だけで最適な作り方を求められると思います。
ソルバーアドインの追加も1分もあればできると思うので大して変わりませんが( ̄▽ ̄;)
制約条件を打ち込む必要があった場合はさらに数分かかりそうなので約10分ほどで最適化!
それでも結構短いのではないかと思います。

赤字で示しているようにこの回数、球場飯を作りましょう

あとがき

まずは皆さんここまでお付き合いいただき,ありがとうございます。
私自身かなりの効率厨ですのでこんなことできないかなぁと思っていたものを大学の課題ついでに作ってみてたのですが,自分一人で欠陥を見つけるのもめんどくさいしなぁと簡単に皆さんに紹介してみました。
ぜひ自分もやってみたがここがおかしいなどのフィードバックお待ちしています。

本当はGooglespreadsheet(以下スプレッドシート)とかでできればよかったんですけどね~
どうやらスプレッドシートではソルバー機能はなくなってしまったようです。
ExcelはOfficeのライセンスがないと多分使えないので意外と敷居が高いんですよね……
Googleさん復活させてくれませんか?

やっていることは多変数の線形計画問題ですので,めっちゃめんどくさいですが紙とペンがあれば計算できないこともないですし,こういったことに詳しい人であれば,称号の際の極意書何枚がベストか求めてくれるツールのようにwebページ上に最適化ツール作ってくれるのではないかと期待したりしています。
なんにせよ,これを読んだ人が次に次につなげていくことを期待して紹介いたしましたので,プロスピAを楽しんでいる人に一人でも多く届いて,使って,さらに改善していっていただければなぁと思います。

それでは今回はここらへんで失礼します。
よきプロスピAライフを!

ダウンロードしたくない人向け,表の解説(2/21加筆)

Excelをダウンロードしたくないよ~って人向けに私の作ったExcelファイルがどのようになっているか解説しようと思います。
今回の最適化に必要な要素は主に3つです。

  1. 所持食材を打ち込む欄

  2. 必要食材を計算する欄

  3. 球場飯の種類と,それに必要な食材をおよび作成数がまとめられている欄

それではおすすめの作成順序で説明していきましょう。

まず最初に作るのは所持食材を打ち込む欄ですね。
理由は楽だから(笑)
こういうのは最初のハードルが低い方がとっかかりやすくていいと思います。始めてしまえばやる気は出始めるって脳科学の偉い人が言ってました。

実際の作業としては食材一覧を縦に並べて,その横の列を打ち込む用のスペースとして空けておくだけ。
所持食材の順序は球場飯のイベントトップページからいける食材一覧の順序にしておくと所持食材の数を打ち込む際に楽です。

特に関数等も入れておらず,ただ打ち込むだけの簡単作業

次に作るのは3.の飯の種類と必要食材および作成数をまとめた欄です。

正直これがめんどくさい……
頑張ってやっていきましょうか……(一回完成したnoteを加筆するのも負けず劣らずめんどくさいなぁ……と筆者のサボり癖が出ております。)

まずは縦に球場飯一覧を,横に食材一覧を並べてください。下の表の一番左の列と一番上の行のような感じ。

体裁はまぁいいかと一部セルを飛び出しておりますが気にしない気にしない

次に,それぞれの球場飯に必要な食材を打ち込んでいきます。
例えばカレーであれば,ごはんと人参とジャガイモが必要なのでカレーの横の行かつごはんと人参とジャガイモの下の列に1を打ち込んでいきます。

これをすべての球場飯で記入が終わったら,次に作成数を打ち込むスペースを作ります。食材の横の列(順番通りならえびの横になります)に作成数を記入する行を作り,すべての球場飯のスペースを作ったのちにその下にSUM関数を入れたセルを作ります。このSUM関数は範囲内の数値の合計を求めてくれる関数なので,作成数を記入できるスペースすべてを範囲にすると全球場飯の総作成数が勝手に求まります。
この作成数は自分で打ち込むことはないので,空白のままで構いません。
ソルバー機能くんがいろんな数字を入れてみて最適な値となったものを表示してくれます。

下の表では視覚的にわかりやすいようにあえて,「獲得ポイント」の列を作り,そこにSUM関数を入れていますが,その場合,各球場飯の持ちポイント(レア度に応じて10~30)を作成数で乗じる,つまり掛け算する必要があるので少しだけ手間が増えます。
自分用であれば,作成数の行だけ作って,その範囲をSUM関数の範囲にするだけでいいのでそちらをお勧めします。
上のソルバー機能の説明では目標セルを「獲得ポイントの累計」を表したセルになっていますが,「作成数」のみでも最適化できますので問題ありません。
最適化する目標セルを「作成数の累計」のセルに変えるだけ,つまりSUM関数を入れたセルに変えるだけでほかの作業は変わりませんのでご安心を。

SUM関数の範囲はこんな感じ
ちなみにソルバー機能の目的セルがこのSUM関数を入れたセルになります

最後に2.の必要食材を計算する欄を作りましょう。
所持食材の欄の隣にあると,ソルバー機能で制約条件を作るときに楽だと思います。

ごはんのところの関数を表示させていますが,全部の食材で関数をそれぞれ入れる必要があります


必要食材の欄に入れるべき関数は先ほど3.で作った球場飯ごとの必要食材とその作成数から考えるだけです。
例えば,ごはんであれば,
ごはんを使用する球場飯は
カレー,オムライス,牛丼,天丼,寿司,マグロ丼の6種類ですので,それぞれの作成数を合計したものが必要なご飯の数になりますね。
ということで,SUM関数なり,単純にこれらの球場飯の作成数を示しているセルを足し算していくことでごはんの必要食材数が計算できます。
こんな感じですべての食材に対して必要数を計算してくれるように関数を書けばめでたく完成です!

実はここに入れてる関数は私が作っているときはめちゃくちゃパワープレイの関数なんですよね……だから上の写真の関数も無駄の多いものになってしまっています。
わざわざ食材の欄に1を入れて,作成数とかけてから足し算してます。
正直無駄です(笑)
なので3.でのそれぞれの球場飯に必要な食材のところで1を入れていく作業は必ずしも必要ではなかったりします。
(いまさら言うなやというお叱りは甘んじて受けとめます。)

じゃあなんで3.のところで食材のところに1を記入していく作業をしたのかというと,単純に各食材の有用度を可視化したかったんですよね。いろんな球場飯に使う食材ほど重要度が高く,限られた球場飯にしか使わない食材は重要度が低いのでそれを可視化するためです。

と言い訳してみましたが,最初に作ったときには無駄な作業だと気づいてなかっただけですwww
作っちゃったので後付けで上の言い訳を思いつきました。機転って大事。

はい。まぁこんな感じで長々と加筆しましたが,わかりにくいところなどあれば修正していくのでぜひぜひコメント待っています。

(2/21加筆 サボり魔)

この記事が気に入ったらサポートをしてみませんか?