Lesson12 修了演習

イメージ画像

ここまで学んだプログラムの知識を使って、現実世界の問題を解いてみましょう。次の問題は、高校で学習する「線形計画法」という方法を使って解くのが一般的ですが、コンピュータと Python を使えばそれよりももっと複雑な問題を解くことができます。

(解答のソースコードは第13回で配布します。)

今使うソースコードはここからまとめてダウロードできます。 ダウンロードfile_download

【問題】

あなたは、子ども会でキャンプの料理の材料を買う担当になりました。これから買いに行くお店ではジャガイモは、1 個 300g で 100 円です。また、ニンジンは、1 個 110g で 230 円です。あなたは、ジャガイモとニンジン、合わせてできるだけ多くの数を買いたいと思っています。

ただし、こども会から支給されるお金と買い物に使う自転車には次の条件があります。

(重さの条件)自転車に載せられるのは 5000g 以下です。
(お金の条件)持っているお金は、8000 円です。

ニンジンを何個、ジャガイモを何個買うと、この和が最大になるでしょうか?

考え方ですが、まず、ジャガイモとニンジンの買うことのできる上限を見つけます。上限は300 個以下でもいいですし、もっとおおざっぱに 1200 個以下とかでもよいです。
コンピュータは愚直に計算するので、上限が見つかりさえすれば命令できます。
コンピュータは疲れを知らずに正確に計算できるので、ゆるく見積もっても、シビアに見積もってもどちらでも構いません。

例えば、ジャガイモの上限は、ジャガイモだけを買うとすると、重さの条件から
5000÷300=16.666… なのでどんなにがんばっても、ジャガイモは最大で 17 個しか買えないとわかります。
同様に、ニンジンも最大何個までしか買えないか計算してみてください。(手で計算するのでなく、Python のコードで計算してみましょう)

次に、この上限で、ジャガイモを x 個、ニンジンを y 個買う場合を考えて、そのxと y の組を列挙します。

最後に、重さの条件とお金の条件を満たす x と y の組の中から x+y が一番大きくなる組を見つければ良いわけです。

数学の問題風にしてみましょう。

  1. ジャガイモを買わず、ニンジンだけを買うとすると最大何個まで買えますか?また、ニンジンを買わず、ジャガイモだけを買うとすると最大何個まで買えますか?この答えは 1つに定まりません。1 万個以下と答えてもよいし、もう少しシビアな数字でもよいです。
    enshu012_1.py という名前で保存してください。
  2. ジャガイモを x 個、ニンジンを y 個とします。1)の条件のもと、大ざっぱに考えられる (x, y) の組を列挙してみましょう。ensyu012_2.pyという名前で保存してください。なお、enshu012_1.py のコードを含めたほうがよいでしょう。
  3. 2)で列挙した(x, y) で重さの条件とお金の条件をクリアできる (x, y) の組を列挙してみましょう。enshu012_3.py
  4. 3)で列挙した (x, y) の組で x+y が最大になるような (x, y) の組を見つけましょう。enshu012_3.py にその処理を加えてください。

ヒント

x, y の組は、次のような 2 次元のリストで考えるとよいでしょう。ただし、リストをつくらなくてもこの問題は解けます。九九の表をつくったソースコードを見直してみてください。

 1
 2
 3
 4
 5
 6
xy_kumi =[
	[1,0],
	[1,1],
	[1,2],
	[1,3],
]

修了問題 補題

もし、3)の方針が立たない人は、以下の補題を解いてみましょう。????の中には、何が入るでしょうか?
リストが要素として入っているリストの中身を列挙するには、どうすればよいだろうか?

lesson12_10.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
xy_kumi =[
    [0,0],
    [1,10],
    [2,20],
    [3,30],
]

for xy in xy_kumi :
    print(xy)
    x = ????   
    y = ????
    print("x = " + str(x) + ", y = " + str(y))

以下のようにリストの中のさらにその要素を表示するプログラムを書くにはどのようにしたかな?
Lesson08 リストと for」のネストされたリストのループ処理 を見直してみよう。

実行結果

 1
 2
 3
 4
x = 0, y = 0
x = 1, y = 10
x = 2, y = 20
x = 3, y = 30