質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

320閲覧

puthon のナップザック問題で値が変わる

h_proc

総合スコア68

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/06/20 12:12

編集2019/06/20 12:22

7トン、4トン、5トン、6トン、3トンの5種類の荷物があり、制限質量15トンに収めるというナップザック問題を解いています。以下のようにコードを書いたのですが、15トンぴったりの組み合わせが表示されません。符号が間違っているのでしょうか。教えていただけたら嬉しいです。よろしくお願いいたします。

python

1class Item: 2 def __init__(self,name,weight):#クラスの定義 3 self.name=name 4 self.weight=weight 5 6 7 8#初期化する 9limit = 15 10items=[Item("A",7),Item("B",4),Item("C",5),Item("D",6),Item("E",3)] 11L=len(items) 12 13 14result=[]#結果を入れる 15 16def judge(i,select): 17 18 if select+items[i].weight<limit: 19 select +=items[i].weight 20 result.append(items[i].name) 21 if i<L-1: 22 judge(i+1,select) 23 if select+items[i].weight>limit: 24 select+=0 25 if i<L-1: 26 judge(i+1,select) 27 28 29 30select=0 31judge(0,0) 32 33print('選んだ荷物の組み合わせは') 34print(result) 35

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

前から選んで、入れることができたら受け入れるという特に探索をしていないコードだからではないですか?

総当たり:
https://wandbox.org/permlink/8ug63FVQMO8Ef815

python

1class Item: 2 def __init__(self,name,weight):#クラスの定義 3 self.name=name 4 self.weight=weight 5 6#初期化する 7limit = 15 8items=[Item("A",7),Item("B",4),Item("C",5),Item("D",6),Item("E",3)] 9L=len(items) 10 11import itertools 12 13def calc_total_weight(items, choices, limit=15): 14 ret = sum([x.weight*a for x, a in zip(items, choices)]) 15 if ret > limit: 16 return 0 17 return ret 18 19choices_weight = [(choices, calc_total_weight(items, choices, limit=limit)) 20 for choices in itertools.product([0, 1], repeat=L)] 21ans = list(sorted(choices_weight, key=lambda x: x[1], reverse=True)) 22 23print('選んだ荷物の組み合わせの重みは') 24print(ans[0][1]) 25best_weight = ans[0][1] 26for v in ans: 27 if v[1] < best_weight: 28 break 29 print('選んだ荷物の組み合わせは') 30 print(v[0]) 31 print([items[i].name for i, v in enumerate(v[0]) if v == 1])

投稿2019/06/20 13:15

編集2019/06/20 14:00
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ナップザック問題ですと組み合わせ最適化のナップザック問題ですかね?
最適化の考えですとA B C D Eのナップザック(集合Ai)には利用価値Ciが付与されており
それぞれの重さがXiとします。この場合重さの集合は
Wを15トンとします
Xi=(X1 X2 X3 X4 X5)=(7 4 5 6 3)ですので

目的関数: ΣCiAi=C1A1+C2A2+C3A3+C4A4+C5A5→Max 制約条件: ΣXiAi=7A1+4A2+5A3+6A4+3A5=<W=15

と定式化できますが
ここで優先指標を決めます。
ΣXi/Ciとします
優先指標は
この条件(今回は各重さに対して利用価値の割合が大きいものを優先してナップザックに詰めるというものです)に満たすか
条件に対しては貪欲法を用いてA B C D E で見ていくとしましょう。

となるわけです。
とりあえず価値Ciなしでは解を求められないのではないかと思います。
今の段階だと単純に品物集合から足して15になる重さの組み合わせしか求められないきがします。
コードを詳しく見たわけではありませんので何かほかの価値総和があれば教えてください。

投稿2019/06/20 12:43

編集2019/06/20 12:45
flan

総合スコア146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h_proc

2019/06/20 12:47

回答ありがとうございます。品物番号と質量以外に価値は設定されていません。正しければ1、正しくなければ0といった価値判断でもいいのでしょうか。
flan

2019/06/20 13:09 編集

はい、いいと思います。 https://qiita.com/drken/items/a5e6fe22863b7992efdb ↑このサイトの一問目に同じような問題がありました。 大学では価値総和があるものしか教わらなかったたので・・・。 動的計画法の制約なし最適化のほうでナップザック問題があるのですね。 失礼しました・・・ 前提として重さを最大にしたい。この場合は15にしたいということで B C Dあたりが選ばれるとうれしいということでしょうか。 肝心のコードですが result.append(items[i].name) ↑ ここでおそらく強制的にAが選ばれてしまうためおかしくなるのではないかなと思いました。 あまり自信はありません・・・
flan

2019/06/20 13:23

はい、いいと思います。 https://qiita.com/drken/items/a5e6fe22863b7992efdb ↑このサイトの一問目に同じような問題がありました。 大学では価値総和があるものしか教わらなかったたので・・・。 動的計画法の制約なし最適化のほうでナップザック問題があるのですね。 失礼しました・・・ 前提として重さを最大にしたい。この場合は15にしたいということで B C Dあたりが選ばれるとうれしいということでしょうか。 肝心のコードですが result.append(items[i].name) ↑ ここでおそらく強制的にAが選ばれてしまうためおかしくなるのではないかなと思いました。 あまり自信はありません・・・ あ、あとこれはAから決めて始めているので 次はB 次はC ・・・・ といったようにfor分で回すといいです。 そしてそのfor分の中で例えばBを最初に選んだ場合 C D Eと行くのがワンクール 次は DEというのがワンクールと 全て見れるようにして 一番大きい組み合わせを配列に持つといいです。 こうすることで取りこぼしがなく見つけられますね つまり for i in 集合Ai for j in 集合Ai judge でいいとおもいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問