Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
アルゴリズム入門第1回
~ガイダンス、数の計算~
情報理工学系研究科創造情報学専攻
中山 英樹1
教員について
中山 英樹大学院情報理工学系研究科 創造情報学専攻
専門: コンピュータビジョン、自然言語処理、人工知能、機械学習
講義情報(スケジュール、資料など)http://www.nlab.ci.i.u-tokyo.ac.jp/~nakayama/lectures.html 「中山英樹 東京大学」で google ITC-LMSからもリンク張ってます
2
教科書 情報科学入門 Rubyを使って学ぶ 増原英彦 他著
正誤表http://lecture.ecc.u-tokyo.ac.jp/johzu/joho-kagaku/text/
3
情報科学とは何かLawrence Livermore National Laboratory
「計算」と「情報」の科学的基礎 様々な分野に現われる「情報」を扱うための科学
cf. 数学は様々な分野の「数理」を、物理は「物質」を扱うための科学
• 生物の理解: 個体→細胞→化学反応→情報の流れ• ロボット工学: 機械→制御→ソフトウェア
科目「情報」の土台部分 情報系の学科で学ぶことの入り口
Christian Blouin 2006 (c
National Research Council of Canada
(C) Honda Motor Co., Ltd.
情報教育の重点化 イギリス
2014年9月からプログラミング初等教育に正式科目として導入
フィンランド 2016年より小学校の科目として導入
米国 オバマ大統領:「全ての米国人にプログラミングを学んで欲しい」
https://www.youtube.com/watch?v=6XvmhE1J9PY
日本 (2014/6/24) 成長戦略: 「義務教育段階からのIT教育」
5
講義の目的
前半:プログラミング コンピュータに「計算(=情報処理)」をさせる手段
後半:情報科学の基礎概念 特に、「アルゴリズム」と呼ばれる領域を中心に プログラミングそのものは主目的でない
前提知識 夏学期「情報」
6
プログラミング言語 Ruby
比較的、新しい言語で、初学者のしきいが低い
選択に深い意味はない 米国の大学だったら Python だったかも
日本発で世界的に使われている言語(これ大事) 開発者の多くが日本人である(これ大事)
7
8
アルゴリズム 問題の解き方
有限時間で答が出ることが保証されているもの
一つの問題に複数のアルゴリズム アルゴリズムによって計算時間が劇的に違う
異なる問題に同じアルゴリズム 本質的に同じ構造の問題なら、使いまわしができる
?
9
異なる問題、同じアルゴリズム
日米間には沢山のネットワーク経路がある 各経路には帯域幅がある 日米間全体の最大
帯域幅は? 注: 単純な和でない
3
41
3
53
21
10
異なる問題、同じアルゴリズム
生産割当問題 車種別の必要台数 工場別の生産台数の上限 どの工場でどの
車種を作れるか
30 40 20 30
50 X
40 X
30 X X
?
成績評価
共通試験50%:平常点50%
平常点 毎週出題の課題(毎回講義時間の後半は課題の時間) 半分終わったところで多めの課題(11/10の予定) ちゃんと授業に出ていれば単位はとれます
優は3割 相対評価
11
毎週の課題 自分で手を動かして考えることが大事(テストではない)
友達と相談したり、TAに質問してもよい ただし、コピペはダメ(全員0点にします)
出席は別途、講義時間中に毎回とります 課題がどうしてもできなかった場合の救済 ただし、出席のみで課題を提出しないのはダメ。考えてみたところま
でを書いて出してください
自信のある人向けに、+αの課題を出すことがあります 提出は任意ですが、提出があった場合は加点します 難しいけど授業で扱った範囲の知識で解ける(はず)
12
ITC-LMS
ITC-LMSの利用登録ウェブブラウザ(Safariなど)からhttps://itc-lms.ecc.u-tokyo.ac.jp/「アルゴリズム入門(金1)中山英樹」を選択する
出席、課題の提出 アンケート(無記名):質問、感想
コンピュータとの対話 ターミナルの起動 ⇒ irbの起動 ⇒ 数式の入力
cm12345$ irb 改行irb(main):001:0> 1+1 改行=> 2irb(main):002:0> コントロールDcm12345$
今回は、指示されるまで、irbを使いながら…
ターミナルのプロンプト
irbのプロンプト
irbの返答
入力は赤で示す。改行はReturn,
Enter とも。
もう1つ「ターミナル」のウインドウを
開く
数式の計算 ― 電卓がわり
irb(main):003:0> 7 – 2=> 5irb(main):004:0> 7 * 2=> 14irb(main):005:0> 7 / 2=> 3irb(main):006:0> 7 % 2=> 1irb(main):007:0> 7 ** 2=> 49 7を2で割った余り
7の2乗
irb(main):009:0> 7 - 2 * 3=> 1irb(main):010:0> (7 - 2) * 3=> 15irb(main):012:0> 7.0 / 2=> 3.5irb(main):013:0> 7 / 2.0=> 3.5
以下、改行は省略
整数と浮動小数点数
Ruby (他の言語も)は区別する
整数と整数の演算は答も整数
整数と「小数」の演算は答も「小数」
3 は整数 3.0 は「小数」
16
さまざまなエラーirb(main):001:0> 3/0ZeroDivisionError: divided by 0
from (irb):1:in `/'from (irb):1
irb(main):002:0> 7 - 2 3SyntaxError: compile error(irb):2: syntax error, unexpected tINTEGER, expecting
$endfrom (irb):2
irb(main):003:0> (7 -irb(main):004:1* 2) * 3)SyntaxError: compile error(irb):4: syntax error, unexpected ')', expecting $end
from (irb):4irb(main):005:0>
式の途中で改行するとプロンプトが異なる
わけがわからなくなったら
ともかく コントロール C を押す irb はトップレベルに戻る
クイズ: 17 - 17/3*3 の値は?
1: 0.02: 03: 24: 15.11111111111115: 16
irbを使わずに答えよう!
数学関数
irb(main):003:0> include(Math)=> Objectirb(main):004:0> sqrt(2)=> 1.4142135623731irb(main):005:0> cos(3.141592/3)=> 0.50000018867511
数学関数を使う準備irbを起動し直すたびに必要
変数 ― 値に名前を付ける
irb(main):003:0> h=188.0=> 188.0irb(main):004:0> w=104.0=> 104.0
irb(main):006:0> w / (h / 100.0) ** 2=> 29.4250792213671
変数への値の代入
↑キーで入力が復活!
変数を使うわけ 式の意味が理解しやすくなる
wweightbody_weight_in_pound
違う値で計算のやり直しができるirb(main):008:0> w=104.0-10=> 94.0irb(main):009:0> w / (h/100.0) ** 2=> 26.5957446808511
•小文字で始まること•アンダースコアは
小文字と考える
関数の定義 ― BMIを求める関数irb(main):003:0> def bmi(height, weight)irb(main):004:1> weight / (height/100.0) ** 2irb(main):005:1> end=> nil
irb(main):007:0> bmi(188.0, 104.0)=> 29.4250792213671
irb(main):008:0> 1.1*bmi(174.0, 119.0 * 0.454)=> 19.6289470207425
スペースキーを押してインデントを入れるとよい(見やすくする)
書き方になれる
数学なら… BMI 関数 f(h, w) = w / (h / 100)2
Ruby ならdef f(h, w)
w / (h / 100.0) ** 2end
こっちがベターdef bmi(height, weight)
weight / (height / 100.0) ** 2end
24
練習
1. 平面上の 2 点 (x, y) と (u, v) の距離を求めるdistance(x,y,u,v).
2. f フィートi インチをセンチメートルに変換するfeet_to_cm(f,i). ただし、1 フィート = 12 インチ = 30.48 cm である。
解答def distance(x, y, u, v)
sqrt((x-u)*(x-u) + (y-v)*(y-v))end # sqrt((x-u)**2+(y-v)**2)
def feet_to_cm(f, i)30.48*f + 30.48/12*I # (f + i/12.0)*30.48
end
ファイルに保存した関数定義―ファイルからの読み込み
# BMI of a person with height (cm) and weight (kg)def bmi(height , weight )
weight / ( height / 100.0) ** 2end
irb(main):003:0> load("./bmi.rb")=> true
irb(main):005:0> bmi(188.0, 104.0)=> 29.4250792213671
bmi.rb
#以下行末までコメント
ホームディレクトリへ保存せよ!Emacsを使おう
一度irbを終了し再起動してから…
新しくファイルを作る 「E」アイコンをクリック メニュー「File」→「Visit New File」 出てきたウィンドウに「bmi.rb」 (場所:ホームディレクト
リ) 関数定義を入力 メニュー「File」→「Save」 前に作ったファイルの編集 ファイルを「E」アイコンへドラッグ&ドロップ
速修Emacs
# BMI of a person with height (cm) and weight (kg)def bmi(height , weight )
weight / ( height /100.0) ** 2end
課題の提出
ITC-LMSで提出すること
提出様式 問題ごとに、(学籍番号)q○.txt のように名前を付ける
(例. 12-345678q1.txt) Rubyプログラムファイルの場合は .rb 一つの問題で複数のファイルの提出が必要な場合、
(学籍番号)q○.zip のように一つのzipファイルにまとめて提出
〆切は次回の講義開始まで(10月6日 8:29)
29
本日の課題(問題1) 東京大学と米 Stanford University の学部学生
(undergraduate student) の年間授業料 (tuition) を調べ、irbを使って金額の大小を比較せよ。(電卓として使えばよい)解答にあたっては、それぞれの金額(東大は日本円、Stanford 大は米ドル)を示し、また換算に用いた円ドル為替レートも示せ。さらに、換算のためにirb に入力したコマンドも示せ。プログラム(関数)になっている必要はない。
30
本日の課題(問題2) 2次方程式 ax^2 + bx + c = 0 の解をひとつ計算する関
数 quadratic(a,b,c) を定義するプログラムを書け。ただし、aがゼロの場合や、解が存在しない場合は考えなくてよい。(x^2はxの二乗を意味する。)
31
注意
かけ算記号は省略できない a*c は ac とは書けない。”ac”という別の変数の意味に
なる。 2a という変数は定義できない(Rubyのルール)
include(Math)を忘れずに プログラムを実行する前に読み込んでおくことが必要
(irbを再起動すると忘れてしまう) あるいは、ファイルの先頭に書いておく
32