Pythonプログラムついに完成!

プログラミング プログラミング

いつごろからやり始めたのでしょうか…年末には始めていましたので、丸2か月といったところでしょうか。プログラミングを勉強し始めたきっかけとなった問題に対しての解決策が出来上がりました!
私は下記のような問題に対して回答を作れるプログラムを組んでいました。

ゲーム&アプリエキスパートコース

問題 売上の合計金額からどの商品がいくつ売れたかを求める

多くの扉

こんな問題です。


2月の売り上げが840円。
商品は今のところ2種類で、商品Aの単価は300円、商品Bの単価は80円。AとBはそれぞれいくつでしょう!

このような課題に取り組んでいました。
この例自体は簡単なので、1から順に入れていけばいずれ答えは求められるのですが、そのあとの展開が必要でした。


3月から商品を1つ増やして3種類にしました。そのため売上も増え1740円でした。
商品A,Bの値段は変わりません。商品Cの単価は110円です。

この辺りから1から入れていくのは大変ですが、まだ何とかなります。
私が解きたかった規模感は下記のようなものでした。


4月には商品を2種類増やして、5種類になります。
バズったため売り上げも大きく伸び、1,547,447円です。さらに値段もそれぞれ2%ずつ値上げしました。
5種類それぞれいくらでしょう。

みたいな問題を解きたかったのです。
100万円を超えるものに対して数十円のものを1から掛けて、足していくのは現実的ではありませんでした。

エクセルを使って最初は解いていたのですが、エクセルの「ソルバー」という最適化というジャンルのものを勉強していました。

しかし、これは、できそうで条件面でできないことがわかりました。
通称;ナップザック問題というものです。
いくつか問題の種類があるのですが基本となるものはこんな感じです。

i種類の荷物があり、ナップザックに荷物を入れます。荷物の価値が一番高くなる組み合わせはどれでしょう。ナップザックの体積(又は耐荷重)はWです。
荷物の体積(または重さ)と価値は与えられます。

これに式を入れて解くことができます。

他にも、リンゴケーキとチーズケーキを作ります。
小麦粉は800g、時間は300分あります。
材料内、時間内に利益が最大になるのはどの組み合わせでしょう。
リンゴケーキに使う小麦粉は100g、時間は10分、儲けは200円
チーズケーキに使う小麦粉は80g、時間は7分、儲けは160円

こんな感じの問題の応用で、儲けが最大になるのところを目的の売り上げと一致させるに変換すれば答えがでると思っていました
というかエクセルのソルバーはその考えでなんとかできていました。

しかし、Pythonはそんな甘い考えじゃだめだったみたいです。
結局、Pythonの勉強時間を含めて2か月間悩み、いろいろなナップザック問題を解きましたが、答えは出ず…

私のように悩まないように学習するには…

困りに困ってQiitaにSOSを出したました。Qiitaはプログラマーの情報交換のサイトなのですが、いろいろな人がいろいろ質問をしていて、それにこたえてくれる人がいて…プログラミングの知恵袋みたいな感じです。質問じゃなくても、開発をしている際に感じたことの備忘録やちょっとしたコツを書いてあったりと大変たすかりました。

2か月悩んだ結果が「ナップザック問題では解けない」という結論で、でも次にどのようにしたらよいのか全く見当がつかなくなってしまったため、失意のなかQiitaに質問をしました。夜中の1時ころだったでしょうか。悩みすぎて眠れなくなったため、Qiitaに思いの丈を質問しました。
この質問で解決できなければ、プログラミングスクールに入会しようと思っていました。
Qiitaに質問を投稿した翌朝、10時ころある方が質問に答えてくださり、コード(プログラム)を教えていただきました。

さらに、最適化問題(ナップザック問題)では解くことは遠回りだと教えていただきました。→そのため、朝から悩みながら解いていたナップザック問題はすぐに終了!
早速教えてもらったコードで問題を解いた瞬間!
パン!っと答えが!!!

target_total = 510
a_max = target_total // 100
b_max = target_total // 30
# +1 for inclusive iteration
xs = ((aq, bq) for aq in range(a_max+1) for bq in range(b_max+1) if aq*100+bq*30==target_total)

print(f"quantities where total={target_total}:")
for aq, bq in xs: print(f"  a={aq}, b={bq}")

Qiitaより引用

感動1 動いたことが感動

Pythonを始めて一番最初に悩んだことはPythonをインストールしなければいけないこと。
PythonはPCに標準で入っているものではないため、別途インストールをしなければいけないのですが、PCを基本的に触ったことのない人間だったために、インストールをするという行為が怖すぎて、結構最初は躊躇していました。

実際にインストールしてもPythonは結構いろいろ追加を要求してくるのです。Pyhonだけ入れればいいと思っていたら、動かす?ために他のものも入れてーとか、それ知らないしとか、いろいろエラーで返ってくるのです。Pulpという謎の言語?もあるらしく、それも入れろ!って来たり、いろいろ調べてたらAnacondaを使ったほうがいいといわれるからAnacondaをインストールして、そしたら、pathが通っていないからpathを通せって言われて。でも、pahって何!?通すって何!?の状況からよくここまで来たと思う…
この教えてもらったコードは、何も問題なく動いたのです!!!

感動2 エラーが出なかった

Qiitaで過去に他の人が質問していて回答されていたコードをコピペしたときには結構頻回にErrorが発生していました。
もうプログラミング勉強を始めてずーーーーっと「Error」。しかもそのエラー内容は英語。
英語はGooglechromeさんに任せると決めて全く勉強してこなかったのに、プログラミングのエディターの中にはchromeさん入ってきてくれないから、エラーを全部コピーして翻訳アプリに突っ込んで訳してもらって、訳してもらっても知らない単語が出てくるからそれを調べて、知らない単語を調べてるとさらに知らない単語が出てきて…と、常にchromeさんのタブがパンパンになってる状況でした。
私がPythonを始めて覚えた英語「name ‘a1’ is not defined」。正確な意味は理解していないけど、「そんな名前のやつないし」という意味だと思っています。
他にも「SyntaxError: invalid syntax」。これは「文法間違ってますけど」って意味。

Pythonに悪意はなく、親切でエラーの中身を教えてくれていることはわかっているけれど、本当に、時々イラっとした。
でもイラっとする相手はPythonじゃなくて、私自身なんだけどね。
この教えてもらったコードはエラーが出なかったのです!!!

感動3 商品を増やすことができた

質問したときの商品は2種類でつくりました。将来的には増やしたい旨も記載したからなのか、増やしても大丈夫(というか簡潔で、初心者の私でも増やし方がわかる)コードでした。
もしかしたら2か月のセルフ特訓で自力がついたのかもしれませんが、増やすことができたことが感動でした。

感動4 値段を変えられた!

値段の替え方もわかりやすかったです。コード自体がすごく簡潔だったため、これが何を示しているかわかりやすくて、追加・変更がしやすかったです。

感動5 早い!!!

以前、エクセルのソルバー機能で計算をしていました。1つの解を求めるのに1時間とかザラでした。小さい売り上げの時でも数分かかっていました。それが…全体では30分くらいかかるものもありましたが、数秒で一部の解が表示され、基本的にはその上位表示されるものが欲しい値であることが多かったのですごく時短になりました。本来の使いかたやスペックをフルには活用できていないのかもしれませんが、目的とすることができたことで大満足です。

感動6 質問に答えてくれる方がいること

これが最大の感動でした。
こんな、初心者の質問に懇切丁寧に答えてくれて、さらにご自身で時間まで測ってから質問に答えてくださった方がてくれたことです。本当に親切な方々(きっとQiitaの中にはたくさんいると思うので複数形)です。
私は、とりあえず、この結果を使って、今の自分のやることに全力を出します。そこで人の助けになります。(今、この売り上げから個数を出すことができずに困っているのです)
その後、このあとまだ勉強は続けていくので今後誰かの役に立つ日が来たらいいなとおもいました。

私のように2か月も悩む前に教えてもらうためには?

完成した後に起こったこと

追ってくる手私はプログラムが完成した直後(1時間後)くらいから唇の違和感を覚えました。口唇ヘルペスになっていまいした。口唇ヘルペスは、疲労、風邪、ストレスなどによって起きるそうです。私は幼少期に口唇ヘルペスになっていますので、潜伏していたのでしょう。

口唇ヘルペスになった原因

プログラミングの勉強(だけが原因ではないでしょうが)結構、この2か月間、何かしらストレスがかかっていたのでしょう。平日も仕事が終わったら帰宅後勉強→土日は1日中プログラミング勉強、夢の中でもプログラミングをしていましたので。
口唇ヘルペスの再発は薬局で市販の薬で治るので、重い症状にはならないでしょうし、2週間程度で治るようです。それでも、肉体又は精神は結構キテいたのかもしれません。わからないことを解くことは楽しいと思うことのできる性格ですし、プログラミングは本当に面白いとおもいました。でも、、、、結果はこんな感じでした。
正直、こんなことになるなら最初からプログラミングスクールに入会して教えてもらえばよかったなと思っています。

独学について

自分で勉強をしたこと(独学)に後悔はありませんが、口唇ヘルペスになるくらい追い込んでしまったことに後悔しています。質問をして、1日で答えが返ってくるということはプログラミングスクールに入って入れば一瞬で解けた可能性がありますよね。その時間がもったいなかったなと思います。

何よりきついのは

マスクが痛い。口唇ヘルペスになると見た目に汚いので嫌な気持ちはありますが、2週間程度なので、まぁいいやと思います。しかし、今の時期、新型コロナウィルス対策でマスクは必須ですよね。そのマスクの不織布が引っかかって痛い!ウレタンのマスクは持っていなかったので、購入の検討をします。
ヘルペスになる前に、きちんと教えてもらうことをお勧めします。

まとめ

今回、私が悩みに悩んだ問題について解決したことを紹介しました。売り上げからの個数はナップザック問題では解けません!
プログラミングを初めて勉強される方は本当にプログラミングスクールに入会することをお勧めします。

コメント

タイトルとURLをコピーしました