こんにちは!しゅんです!
今回はstreamlitでナップサック問題を解くwebアプリを作ってみたのでそれを実際に使ってみようと思います。
これまでは組合せ最適化の色んな問題をpythonで解く方法などを紹介していましたが、コードを書かなくても皆さんが解けるようなwebアプリを作ろうかな~と思い、streamlitを使ってwebアプリを作ってみました。
今回作ったものはこちらからアクセスできます。良ければ使ってみてください。
Streamlit (knapsack-problem-shun.streamlit.app)
初めてwebアプリ開発をしたので中々苦戦しましたが、何とかナップサック問題を解くwebアプリを作ることができたので今回はそれを実際に使ってみたいと思います。
webアプリ開発に関してはまだまだ初心者で解説できるレベルではないので、今回作ったアプリのコード解説とかはしません。githubにソースコードを公開しているので気になる人はそれを見てみてください。
それではやっていきましょう!
普段は組合せ最適化の記事を書いてたりします。
ぜひ他の記事も読んでみてください!
このブログの簡単な紹介はこちらに書いてあります。
興味があったら見てみてください。
このブログでは経営工学を勉強している現役理系大学生が、経営工学に関することを色々話していきます!
ぼくが経営工学を勉強している中で感じたことや、興味深かったことを皆さんと共有出来たら良いなと思っています。
そもそも経営工学とは何なのでしょうか。Wikipediaによると
経営工学(けいえいこうがく、英: engineering management)は、人・材料・装置・情報・エネルギーを総合したシステムの設計・改善・確立に関する活動である。そのシステムから得られる結果を明示し、予測し、評価するために、工学的な分析・設計の原理・方法とともに、数学、物理および社会科学の専門知識と経験を利用する。
引用元 : 経営工学 – Wikipedia
長々と書いてありますが、要は経営、経済の課題を理系的な観点から解決する学問です。
問題設定
10個のアイテムの中からいくつかをナップサックに詰めて旅行に出かける。ナップサックの容量は200で、各アイテムにはコスト(今回だと重量)と価値が以下のように設定されている。

目的:
容量制限を満たしながら、価値の合計が最大となるアイテムの組合せを求める。
今回は上記の問題をぼくが作ったwebアプリを使って解いてみたいと思います。
webアプリの概観

アプリを開くと上記のような画面が出てきます。今回はその場で各パラメータを入力するタイプとcsvファイルをアップロードして計算してくれるタイプの2つを用意しました。
一応このサイトの使い方ページも用意しました。左側のページ選択の所から「このサイトの使い方」ボタンを押せば以下のようなページに飛ばされます。

それでは実際にその場で入力verとcsvファイルverを使ってみたいと思います。
その場で入力verで解いてみる
STEP 1 : データを入力する

まず最初に各パラメータの数値を入力しましょう。
STEP 2 : 「計算実行」ボタンを押す

数値を入力し終えたら、左下にある「計算実行」ボタンを押します。ボタンを押したら以下のような結果が得られました。

左側に表示されているのが選ばれたアイテムたちです。今回はアイテム2,3,4,7,8,9,10が選ばれたようです。
右側に表示されているのが最適値と選ばれたアイテムのコストの合計です。今回の問題の最適値は400、コスト合計が200であることが分かります。
csvファイルverで解いてみる
csvファイルverではデータが入力されたcsvファイルをアップロードすることによってナップサック問題の答えを求めてくれます。
STEP 1 : テンプレートのcsvファイルをダウンロードする

まず最初に「テンプレートをダウンロードする」ボタンを押してテンプレートのcsvファイルをダウンロードします。このファイルは以下のようになっています。

このcsvファイルにデータを入力していきます。左から順番に「アイテム名」、「アイテムのコスト」、「アイテムの価値」を入力する列となっています。
STEP 2 : データを入力する

それでは実際に先ほどダウンロードしたcsvファイルに各パラメータの数値を入力しましょう。

ちゃんとナップサックの容量も入力しておきましょう。
STEP 3 : csvファイルをアップロードする

上記の所をクリックしてSTEP 2でデータを入力したcsvファイルをアップロードしましょう。

ファイルをアップロードするとcsvファイルの中身を上図のように表示してくれます。特に問題がなければ「計算実行」ボタンを押しましょう。
STEP 4 : 「計算実行」ボタンを押す

ファイルをアップロードしたら「計算実行」ボタンを押しましょう。ボタンを押したら以下のような結果が得られました。

手入力verと結果は同じですね。ちなみに手入力verのときは自分でアイテム名を決めることができませんでしたが、csvファイルverの方は各アイテムに好きな名前を付けることができます。
おわりに
いかがでしたか。
今回の記事では自作したナップサック問題を解くwebアプリを実際に使ってみました。プログラミングができない人でもナップサック問題を解決できるアプリを作れて大満足です。
今後も少しずつこのような最適化のアプリを作っていきたいな~って思っています。
最後までこの記事を読んでくれてありがとうございました。