MyEnigmaスマートフォン用の表示で見るMyEnigmaとあるエンジニアのブログです。有名な組み合わせ最適化問題であるナップサック問題をcvxpyで解いてみました。下記の記事のように、有名な組み合わせ最適化問題の一つです。値段の総和が高くなるように、ナップサックに入れる品物を選ぶ問題です。何をどれだけ入れれば、コスパが高いか?という問題を考えればわかりやすいかと思います。下記のようになります。入れる)を格納したベクトルを最適化における変数としました。上記の制約を守った上で、コスト関数を最大化するベクトルxを求めるのが目的になります。上記の最適化式を見ると分かる通り、ナップサック問題は線形計画問題の一つになります。一般的なソルバーではなく、それらの問題を解くことができるECOS_BBのような特別なソルバーが必要になることが多いようです。今回は凸最適化の問題として、ソルバーを使って解いてみたいと思います。今回は下記記事のナップサック問題の例題をcvxpyで解いてみました。Qiita基本的には、前述の式をcvxpyで記述しただけです。下記のようにちゃんとナップサック問題を解けていることがわかります。品物の種類を10000種類まで増やしてみました。10000種類でも、自分のMacなら5秒ほどで解くことができました。一種類の品物を複数個選べる問題も作れます。そんな時は、Boolベクトルを正の整数のベクトルにすればOKです。下記のようなコードで解くことできます。下記のように、4個目の商品を11個買うのがいいみたいです。(正しいかは不明ですが..)GitHubリポジトリ上記のコードはすべて下記のGitHubリポジトリでも公開しています。Supportersもしこの記事が参考になり、ブログをサポートしたいと思われた方は、こちらからよろしくお願いします。はてなブログProとあるエンジニアのブログです。Page月別アーカイブスポンサーリンクスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。