動的計画法(1) ナップサック問題

1月 22nd, 2009 admin

あと2問で終わりとなった「アルゴリズムとデータ構造シリーズ」です。今回は第11章「動的計画法」のナップサック問題です。

動的計画法

深さ優先探索や幅優先探索などの分割統治法(トップダウン的問題解決法)では指数的に計算量が増えてしまうような問題というのがあります。(本書では例として「43ペンスのお釣りを出すときに考えられる小銭の組合せ」という問題があげられていました)そのような問題を解決するひとつの方法としてあるのが動的計画法というもので、

全体をいくつかの小問題に分割して、先に一括して小問題の解をすべて得て、最終的にそれらを組み合わせて問題の解決に役立てる。

だそうです。いつもは自分の言葉で説明するのですが、このアルゴリズムは説明しにくい。理解してないということかもしれません・・・

コード

ナップサック問題というのを解く問題です

RUBY:
  1. class Product
  2.   attr_accessor :size, :value
  3.  
  4.   def initialize(size,value)
  5.     @size = size
  6.     @value = value
  7.   end
  8. end
  9.  
  10. products = [
  11.             Product.new(2,2),
  12.             Product.new(3,4),
  13.             Product.new(5,7),
  14.             Product.new(6,10),
  15.             Product.new(9,14)
  16.            ]
  17.  
  18. NAP_SIZE = 16
  19. NAP_SIZE_RANGE = 1..NAP_SIZE
  20. nap_value = Array.new.fill(0,0..NAP_SIZE)
  21.  
  22. printf("nap size            ");
  23. NAP_SIZE_RANGE.each do |j|
  24.   printf(" %2d",j)
  25. end
  26. puts "\n"
  27.  
  28. 0..products.size.times do |i|
  29.   NAP_SIZE_RANGE.each do |j|
  30.  
  31.     if j - products[i].size>= 0
  32.       new_value = (nap_value[j - products[i].size] || 0) + products[i].value
  33.     else
  34.       new_value = 0
  35.     end
  36.  
  37.     nap_value[j] = new_value if new_value> nap_value[j]
  38.   end
  39.  
  40.   printf("use product until #%d ", i+1);
  41.   NAP_SIZE_RANGE.each do |j|
  42.     printf("%2d ",nap_value[j])
  43.   end
  44.   puts "\n"
  45. end

まとめ

これを使うべきときに思い出せるかどうか不安。

※このシリーズは私がRubyでアルゴリズムとデータ構造を基礎から学ぶ記録です。全体の目次はこちらへ。

充実の一冊 読書感想「細雪」

1月 21st, 2009 admin

細雪 (中公文庫)
細雪 (中公文庫)
posted with amazlet at 09.01.21
谷崎 潤一郎
中央公論新社
売り上げランキング: 14381

「多分あなたは好きでないが・・・」
という前置きで勧めてもらった本。いくら好きでないといっても文庫本なら読みきれると思ってamazonで買ってみると900ページを超える大作で驚きました。今になって商品ページを見てみると確かに厚さ4cmと書いてあります。しかしながら、次からamazonで本を買うときは厚さに注意しようなんて思わせない素晴らしい一冊でした。

話の面白さはもちろんなのですが、物語の中心となる美人四姉妹を通じて昭和初期の生活や、行事、風俗を学ぶことができるのがお得です。結婚はもちろん、花見、旅行、蛍狩、外国旅行などの描写から現代の僕等には想像もできないような常識や考え方を体験することができました。
特に僕が興味を惹かれたのは登場人物同士で交換される手紙でした。電話や自動車があたりまえでない時代なので、登場人物らは大事なことがあると大体手紙を書くのであるが、これが皆とてもうまい(あたりまえだが)。相手を尊重し、手前を謙遜し、かといって卑下しすぎることなく自分の本心の本心を相手に文章で伝えるという技術の素晴らしさに僕は何度も読み返してしまいました。

感想(以下ネタばれあり)

まず、妙子がゆるせん。雪子の縁談がやっと、やっと、やっと決まりそうになったというのに「妊娠した」なんて言い出して!こいつはいつまで雪子や幸子、そして貞之助に迷惑をかけるんだと!現代なら妹ができちゃった結婚してるぐらいのことはどうってことはないが、物語も後半ですっかり良家育ち気分になっていた僕は雪子が結婚できずに終わるかとほんとうに焦った。しかし妙子は物語を通して大病だの恋人の死だの水害で死にそうになるだので最後は自業自得とはいえ有馬送りにさえるなどして本当に大変だったなと思う。

んで一番好きなのは賢く、大きな愛で三姉妹を見守る貞之助。雪子はもっと彼を尊重しろ!あともっと評価されていいのは「お春どん」。不潔なところもあるけれど、蒔岡家の女中として女中以上の働きをした彼女のお見合いの成功を祈りたい。

まとめ

特に大事件が起こったりする話ではないので上巻の真ん中までは退屈だったけど、そこからは一気に全員に感情移入してしまい読む手が止まらなくなってしまった。さっそく他の谷崎作品に手を伸ばしてみたいと思う。

★★★★★(満点)

第10回コンパイラを作ろうに行ってきた。

1月 19th, 2009 admin

毎度おなじみCSnagoyaのコンパイラを作ろうに参加してきました。
年末年始をはさんだので一ヶ月ぶりに会う人も多いため楽しみにして行ってみたら、開始予定時間から30分間誰もこなかったので危うくストレスで舌を噛み切りそうになりました。30分を過ぎるとパタパタと人が集まりだし、総勢6名が集合。いつも休まない人達が何人か休んだために、普段とはちょっと違う雰囲気、違う会話がとても新鮮でした。

今何をやっているのか

1ヶ月も休んでいたのですっかり忘れていました。コンパイラを構成する要素を大きく3つに
・スキャナ
・パーサ
・コードジェネレータ
として分けるなら、いまはスキャナとパーサが終わり、最後のコードジェネレータの部分をやっています。
あと1回か2回あれば終わりそうな感じなので、そうすれば遂にPrimitive言語という言語からマクロアセンブラを吐き出すコンパイラのできあがりです

まとめと今後について

コンパイラを作ろうシリーズもそろそろ終わりそうな感じです。
そろそろ春からのテーマを考えなくてはいけません。
例えば
Google Android完全解説 (アスキームック)
アンドロイド(開発者用の実機を見せてもらったら、とてもうらやましくなった)や

ゲームプログラマになる前に覚えておきたい技術
で学ぶゲーム開発の基礎だとか

集合知プログラミング
のデータマイニング的なこととかも面白そうだなーとか思いながらも、ちょっとCSNagoyaとは違うかなと思ったりして、CSNagoya「らしさ」でいうなら

30日でできる! OS自作入門
は避けて通れないんですが、気持ち的にしんどいので、今のところの本命は

Googleを支える技術 ‾巨大システムの内側の世界 (WEB+DB PRESSプラスシリーズ)
これ。Y口さんが提案くれたBigtableの実装ってのが面白そうだなーと思っています。Bigtable云々のまえに僕の場合は普通のリレーショナルデータベースも実装したことがないので、まずは普通のデータベースの実装からですが...

村上春樹の老い - 読書感想「走ることについて語るときに僕の語ること」

1月 13th, 2009 admin

走ることについて語るときに僕の語ること
村上 春樹
文藝春秋
売り上げランキング: 1818

村上春樹は毎日10kmを走り、フルマラソンやトライアスロンにも真剣に取り組むような人だった。それを知ったとき、市民ランナーの一人である僕は村上春樹が好きでないからこそこの本を即買いしていた。
読み終えた結果として、序文の途中で僕は村上春樹が好きになり、本を閉じたときには新しいランニングシューズを買いにいっていました。
すべての村上春樹嫌いのランナーにお薦めしたい一冊です。

タイトルからして嫌い

最初にこのタイトルを見たときは
「だから僕は村上春樹が嫌いなんだよ」と思った。
ストレートにものを表現しない感じが大嫌いなのだ。そんなことは大人には許されないことだと思っている。
だけどこの本は本当に走ることについて語るときに語ることが書いてあった。すみません。

ランナーの心理表現が気持ちいい

走るってのは変なスポーツで、1年以上走りつづけている僕にも何が楽しいのかよくわからない。
心の底からスポーツの楽しみを味わっているような気もするし、
単にサウナと水風呂に交互にはいって
「あー気持ちい!」と感じているだけな気もする。
それに走っている最中でも退屈であったり、最高にハイだったり、全力で何かを呪ったりといろんな感情が波のように押し寄せるので楽しいんだか苦痛なのかもよくわからない。
そこを村上春樹はプロの技術でうまく表現してくれるので、僕みたいなランナーは
「あーうんうんうんうんうんうんうんうんうんそうそうそうそうそうそうそうそうそうそうそうそうそうそうそうそう、わかる!わかるよ!うんうんうんうん。そうそうそう思うよね!絶対。うんうんうんうんうんうんうんうんうんうん」
って感じになりっぱなしになる。

まとめ

・本当は走ることでは無く、50代を向かえた村上春樹の老いに対する姿勢と、彼流の付き合いかたの本
・村上春樹大好き
・今年はもっと真剣にマラソンに取り組むことにした

★★★★★(満点 ランナーなら)