2022年7月9日土曜日

プログラミングスキル向上のために

 プログラミングスキル向上のために、僕が考えていることを書いておきます。プログラミング言語は限定しませんが、オブジェクト指向型言語(C++, Java, Pythonなど)を想定しています。僕自身、プログラミングは苦手意識がありました。周りでプログラミングが上手な人を見て、「センスがないとプログラミングはできないのかな?」と考えたことがあります。けれども今では、下に書いたようなコツを掴めば、誰でも上達できると考えています。

[対象者]

・プログラミングに苦手意識がある

・プログラミングを勉強しているが、成長が感じられない

[プログラミングスキル向上のために]

1. 基本文法を身につける(構造化プログラミング:順次、選択、繰り返し)

最低限の基本文法は身につけないとプログラミングが始まりません。構造化プログラミングという、順次(上から下の順序で実行)、選択(if, switch文)、繰り返し(for, while文)の3要素を身につけましょう。これ以外の細かな文法は後からで十分です。薄めの参考書を利用して、例題をやってみてここまでの知識を身につけましょう。英語で言うと、基本的な単語、文法を覚えるのと同じです。

2. 上から下へのプログラムを書いてみる

構造化プログラミングを身につけたら、とにかく自分の力で、汚いプログラミングで良いので、プログラムを作ってみましょう。構造化プログラミングを使えば、基本的にどのようなプログラミングも書くことができます。冗長になったり、同じことが書いてあってもよいので、自分でプログラムを作れるようになりましょう。英語で言うと、英語で話かけられたときに、なんとか苦労しながら自分の言葉で返して、意味が通じた時の感覚です。この段階がクリアできれば、プログラムはどんどん書けるようになります。

3. プログラムをまとめる(関数化:ルールを見つける)

2でプログラムがなんとか書けるようになったら、それを機能的にまとめていきます。これは関数化すると良いです。関数化するときには、引数と戻り値を明確に示さなければなりません。プログラムを関数化するときには、ある種のルールを見つけることになります。例えば、同じ処理を何度もしている時、ループや引数を変えることでまとめることができます。同じ処理を関数化して、出来るだけプログラムをスリムにしていきましょう。関数化することができれば、後から再利用もできて便利です。英語で言うと、あいさつやいつも使う言い回しをまとめておくことと同じです。

プログラミング環境は、pythonでいうと1~3はJupyter Notebookにメモ的に書いて、実行を確認していくような形です。

4. プログラムをさらにまとめる(クラス化:システム的に処理できるように)

3で関数化してスリムになったプログラム同士を、ある目的のためにシステム化していきましょう。例えば、サイコロを指定回数投げた時に、指定された目の出る確率を実験的に求めると、指定回数、指定する目、各回でなんの目が出るか、今までに出た指定目の回数などいくつかの情報を組み合わせていきます。これらをシステム的にまとめたものがクラスになります。クラスには、複数の関数、インスタンス変数など目的に合わせて組み合わせていきます。システムとして提供できるプログラムとして、クラスを考えていくのが良いと考えています。英語で言うと、作文、論文、プレゼンなどで起承転結のような流れがあり、仮定から結論までの流れのようなものです。個人的には、この4ができるようになると、どのようなプログラミングでも組める気になります。ここまでできたプログラムは再利用できる価値が高いので、githubなどにアップして、自分のリポジトリにしましょう。

プログラミング環境は、4を実施するときは、1~3でJupyter Notebookで書いてきたものを、pythonファイル(.py)に書き換えながらやっていく形です。クラス化をすることで、役割分担が明確になり、プログラムの「型」に当てはめていく作業です。型に当てはめることで、プログラミングがわかりやすくなります。

5. データの扱い:呼び出し、保存ができる

4まででプログラミングの大枠ができるようになると、次はデータの扱いです。プログラミングにおいて、変数の値の保存や、データの取り込みは欠かせないものです。これを行うために、配列、リストなどデータの扱いに慣れておく必要があります。データの構造を考えると、配列構造もどのようにするか考える必要があります。データの更新タイミングも大事なポイントです。データの取り扱いを自由にできると、色々なプログラミングに応用ができます。

その他:Webシステムでのプログラミング

プログラミングというとコンソールでやっていくようなイメージがあり、何となく難しいイメージがあります。Webシステムでプログラムを作っていくと、外部設計と連動するので、実際にどのように動かすかがイメージしやすいです。Webシステムの場合は、データはデータベースと連携してやりとりする場合が多いです。データ構造(モデル)、ビュー(表示、表、グラフ)、コントローラ(プログラミング)のMVC環境で行っていくことで、自然にわかりやすいプログラムが書けるようになります。

以上、僕がプログラミングするときにやっている方法を書きました。プログラミングに苦手意識があった僕も、このような段階を踏んでいくことで、プログラミングに対して苦手意識がなくなり、どのようなプログラミングでもトライできるようになりました。特に、4で紹介した「型に当てはめる」ということで、大規模なプログラムもすっきり作れるようになります。中々細部まで説明が難しいですが、授業などで話す機会があれば触れていきます。頑張って下さい。


2022年4月17日日曜日

AWS Academyの登録方法(学生版)

AWS Academyに利用者(学生)として登録する方法です。

(1) メールを確認する。

教員がAWS Academyに学生を登録すると、以下のメールが来ます。

Get Started をクリックして、登録を行います。

(2) アカウントを作成する
Get Startedをクリックすると、次の画面になります。
ここでアカウント作成「Create My Account」をクリックします。
パスワードを設定:任意のパスワード
Time Zone : Tokyo (+09:00) を指定
利用規約(一番下のチェックボックス)にチェック

Register をクリック
招待されたコースに移ります。

これでアカウント作成は終了です。
次回以降ログインする場合は、https://www.awsacademy.com/LMS_Login
からログインします。(上の方から)


(3) Modulesを利用する
(注意)
Courses -> Modules -> Learner Lab Foundation ServicesLearner Lab - Foundational Services
と進んだとき、画面が出てこない場合があります。

この場合は、画面右上のアイコンが「third-party cookie blocking」となっています。


これを許可に変えると、通常の画面が出てきます。
Chromeの場合 -> Site not working?をクリック-> Allow cookies をクリック

最初にModuleを使おうとするとき、利用規約が出てきるので、I agree をクリックします。


この画面が出てくれば、実習が利用可能になります。

2021年8月26日木曜日

組み合わせ最適化1 (ナップザック問題)

 組み合わせ最適化は、基本的に説明変数が整数値をとり最適化を行います。説明変数は0または1をとるときも多いです。典型的な例でナップザック問題をやってみます。

ナップザック問題の定式化

例題として、お菓子を値段制限があるなかで、どれだけ満足度を高められるか考えます。(Pythonで始めるプログラミング入門 コロナ社 P127 プログラム10-2 を改変)

name = ['チョコ', 'ポテトチップス', 'クッキー', 'ラムネ', 'ガム']
weight = [130, 120, 80, 30, 20] #お菓子の価格
value = [18, 15, 12, 4, 2] #お菓子の満足度
capacity = 300 #お菓子の値段合計上限

プログラムは再帰呼び出しを利用して、最大の満足度になるように計算をしています。途中、リストに入っている場合はcontinueをしているので、お菓子の重複が無いようにしています。定式化でも重複が無い式になっています。

ソースコード

ソースコードの一番下に、ソルバーを使った場合のナップザック問題を入れているので、それも実行してみると同様の答えが得られます。

今回のプログラムは少ないお菓子でしたので、総当たりで計算ができますが、商品数が増えるととても計算が終わりません。その場合は、分枝限定法やメタヒューリスティックの方法で解いていきます。

復習として、下記も参考にしてください。

・線形計画法1

・非線形計画法1(無制約)

・非線形計画法2(制約付き)

2021/09/06 ナップサック問題をdeapを使ったものを上記のソースコードに追加。遺伝アルゴリズムのフレームワークで、形式的に利用できるが、カスタマイズをするにはそれなりに内容を理解しないと使いこなせないものです。

2021年8月25日水曜日

非線形計画法2 (制約つき)

 非線形計画法での無制約のやり方は、

https://mizunolab.sist.ac.jp/2021/08/1.html

でした。ここでは、非線形計画法の中で制約つきをscipy.optimize.minimize を使ったやり方でやっていきます。この場合、数学的な知識がそれなりに必要ですが、まずはツールとして使えるようにしていきます。制約つきの中で、(i) 線形制約、(ii)非線形制約 でツールの使い方が少し変わってきます。線形計画法と同様に制約の行列表現が重要です。また非線形制約の場合は、制約条件を関数で返しています。

ソースコード