スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
【--/--/-- --:-- 】
| スポンサー広告 | コメント(-) | トラックバック(-) |
展開形ゲームの作図に使える jPicEdt
LaTeX で作る展開形ゲームの作成に jPicEdt とやらを使ってみた.昨年いろいろ試して落ち着いた Osborne の egameps.sty とちがって画面を見ながら作図できる.描画用ウインドウ内上部で設定できるグリッドシステムを使えば,枝が微妙にずれることもなく楽に正確に描画できる.

あと,ソースファイルで展開形ゲームの利得だけを直接編集したいときは,egameps.sty 用のソースの方が分かりやすくて手を入れやすい.もっとも jPicEdt で開いて編集してもそれほど手間はかからない.ソース中の利得部分になんらかのマークをつけておく方法もある.

最低限の使用法しかためしてないが,こんな感じだった.絵を描き,PSTricks (.pst) その他で保存し,LaTeX ソースファイルの適当な場所に貼付ける.(出版社など他人に渡すとき複数ファイルになるのを気にしなければ .pst ファイルを \input で読み込ませてもいいはず.もとのファイルは再編集のために保存しておくといいだろう.) その際 LaTeX ファイル (filename.tex と呼ぼう) のプリアンブルに \usepackage{pstricks, ...} は必須.また,図の周りの余白は \begin{pspicture}(0,0)(77.14,40.00) という感じのサイズ変更用らしきコマンドの数値をいじることで消せるようだ.

ファイルが出来たら,通常の LaTeX タイプセットのあと,ターミナルで
dvips -Ppdf -z filename
その後
ps2pdf13 filename.ps
とやれば pdf ファイルが出来上がり.

jPicEdt を使い始めるときは Edit メニューから Preferences を選び,General タブで Default formatter を PSTricks に変更しておくといい.そうしないとたとえばゲームツリーの枝の先と根元のマーク (矢印とか黒丸など) が自由に選べなくなる.(昨日はこれに気づかずにだいぶ時間を使ってしまった.)

追記・修正 (7/11/2010)

以下の記述を削除した:「ただしその方法では枝が微妙にずれたりして手作業って感じが残る.でも egameps.sty を使っても文字の位置などは試行錯誤がいるから,大差はないかもしれない.」グリッドシステムを使えば目分量による微妙な位置調整は不要になる.

ソースで利得部分になんらかのマークをつけて識別する方法を追加.

いうまでもなく LaTeX のソースファイルに .pst のなが~いコメント部分をぜんぶ貼付ける必要はない.自分のばあいは,最初2行の生成情報および
%PSTricks content-type (pstricks.sty package needed)
以降だけを貼付けている.

ちなみに jPicEdt は以前このブログで触れた WinTpic からの乗り換えにおすすめらしい.後者が使えなかった Mac ユーザーには朗報である.
スポンサーサイト
【2010/07/09 03:33 】
| プログラミング | コメント(0) | トラックバック(0) |
応用情報技術者試験の受験対策

応用情報技術者試験に合格した.通常こういう国家試験に合格すれば「なんとか技術士」のような国家資格を得られそうなものだが,この試験に合格して得られる資格名をじつは知らない.べつに「応用情報技術者」という資格があるわけでもなさそうだし,あえて名乗るとすれば「応用情報技術者試験合格者」とでもなるのだろうか.「なんとか試験合格者」なんていうのはなんとなく情けない呼び名なので,積極的に使いたい気がしない.IT 業界とほとんど関係のないボクのような人間にはそもそもメリットを感じられない資格であり,なかなかやる気がおきなかったが,初めての受験でなんとか合格できたので合格体験記でも書いてみよう.

この秋に受験した高松の英明高等学校会場では,IT パスポート試験,基本情報技術者試験,応用情報技術者試験,各種高度試験が行われており,応用情報技術者試験だけでもいくつか試験室があった.(香川ではこのとき応用情報技術者試験に253人応募し,175人が受験, 34 人が合格だったそうである.) 試験当日は「こんな地方都市でいったいだれが何のために受けているんだろう」と思ったものだ.そういう自分自身も何のために受けたのかはっきりしないところがあったが,あえて言えば,高校時代にコンピュータの科学者かエンジニアになりたいと思っていた期間が長かったことが挙げられる.実現できなかった「夢」に多少は近づきたいという思いだ.だがこういう試験のための勉強では,当然ながらエンジニアの面白さが分かるわけもなかった.べつの動機としては,図書館・情報機構に所属するボク以外の教員がすべてソフトウエア技術系の専門であるという事情があった.この試験のための勉強で得られる知識が,彼らとの意思疎通を改善するために役立つかもしれないという思いだ.

リマーク.試験対策の勉強というのは,学術書を読むのに比べると格段につまらなかった.ところが,よく勉強する大学生の多くが,じつは大学の科目の勉強ではなくて公務員試験や資格試験の対策をしているというのが現実だろう.それらと応用情報技術者試験などの情報処理技術者試験とは,準備のための勉強のつまらなさにかけては大差ないと思う.要するにたいていの資格というのは学問体系に沿っていないため,試験対策書も出題されやすい項目を羅列したようなものになる.これでは体系的な知識は得られないし,それぞれのテーマの分析も中途半端で疑問を解決できない.そういう勉強ばかりしていたらバカになるのは目に見えている.通常の大学の科目を勉強した方がはるかにおもしろいし,ためになるはずだ.ところが資格試験対策を重視すべきという大学教員がけっこういる.あまりいい傾向ではない.なかには元同僚の Y のように,自ら受験し (て落ち) た勇気あるひともいたけれど…….

それにしても試験会場はうるさかった.午前は (一部試験を免除されたひとたちの) 廊下を歩く足音がたくさん聞こえて集中できなかった.午後は耳栓をしていたけど,石清尾八幡宮の祭りの神輿が近くまで来ていたらしく,太鼓の音とかかけ声が聞こえていた.午後は問題が長文なので集中できないことの影響は大きく,できるはずの問題でつまらないミスをぼろぼろとやってしまった.

午前問題は計算問題が予想以上に少なかった.計算問題なのに用語が分からないのが3題はあって,うち2題は意味を推測しながら答えたがけっこう時間がかかった.それでも結果は80題中65題正解で,81.25点だった (ストラテジ系 25点中21.25点 [85.0%],マネジメント系13.75点中7.50点 [54.5%],テクノロジ系61.25点中52.50点 [85.7%],合格点は60点).80点で受験者の上位 1.47 パーセントくらいだから,後述の勉強法で通用するだろう.

午後問題は成績照会でも各問ごとの点数は表示されない (6問選択で,じっさいには問 2, 4, 5, 6, 9 の 5問に答えた; 分野はそれぞれ,プログラミング,システムアーキテクチャ,ネットワーク,データベース,情報セキュリティ).できは悪かったと言える.上述の騒音のせいが大きいと思うが,準備不足もあった.そもそも自信を持って薦められるような受験勉強法は見いだせなかった.(IT 業界での実地経験なしに受験すること自体あまり効率的でないという思いが消せなかったため,今回落ちたら諦めるつもりだった.) ボクが午後試験対策をした本 (アイテック『午後問題の重点対策』) に載っていた問題は問題文中に必要な知識が埋め込まれており,時間さえかければどうにかなるものがほとんどだった.しかし今回は知識問題が多かった気がする.じっさいアイテック (iTEC) のサイトの本試験講評に「[午後試験の] 問 3~問12の選択問題は,個々の問題テーマの内容に関してある程度の知識を理解していないと解答が難しい設問がいくつかありました」とある.そういうわけで以下の準備法は今後行われる午後問題には通用しないかもしれない.

それではボクの体験から抽出した応用情報技術者試験準備法をまとめておこう.午後についてはこれでいいのか疑問が残るが,午前にたいしてはじゅうぶん効果的な対策ができると思うものだ. じっさいの受験勉強はこの準備法よりは若干非効率で,8月上旬から10月18日の試験前日まで週5日ていど, (「平均」という割にはだいぶ幅があるけど) 一日平均4から8時間くらいやっていた.特に午前対策は身が入らなくてだらだらとやっていた.

1. あるていどのトピックのまとまり (「データベース」「ネットワーク」など) ごとに:

  • 『栢木先生の基本情報技術者教室』 (技術評論社) を読む.[各自が基本情報技術者試験対策でもちいた解説書でいいと思うが,栢木はイメージをつかみやすくて応用情報の準備にも意外と役立つ.]
  • 『応用情報技術者試験精選午前予想600題試験問題集』(東京電機大学出版局; 最新版は『応用情報技術者試験 午前 平成22年度版 精選予想500題+最新160題 試験問題集』) の該当章を読む.この際,必要に応じて大滝みや子,岡嶋裕史『応用情報技術者合格教本』 (技術評論社) の第 I 部 (知識のまとめ) の該当章を読む.[自分は大滝,岡嶋を最初に通読したが,ひじょうに時間がかかった.せめて柏木を先に読むのが賢いだろう.]
  • 『応用情報技術者 午後問題の重点対策』 (アイテック) の該当章を読む.[自分は試験場で選択した分野に対応する5章分しか読めなかった.]

2. アルゴリズム問題が苦手なばあい『ソフトウエア開発技術者 大滝みや子先生のアルゴリズム教科書』 (リックテレコム) を読む.[計画には入れていたが,自分は時間不足で省略.この本自体はすらすらと進められるはず.]

3. 必要に応じて『精選予想600題』を繰り返し [自分のばあい,二回目をできたのは1, 2 と 3章半分くらい],『午後問題の重点対策』を繰り返す.[ほかの問題集もやった方がいいかも.]

【2009/12/22 03:04 】
| プログラミング | コメント(0) | トラックバック(0) |
野口悠紀雄よりも先を行くクラウドコンピューティング

クラウドコンピューティングの実例として,野口悠紀雄が Gmail の下書き機能をフル活用した画期的な情報整理術に気づいたようだ.一昔前までボクがよくやっていたやり方だ.これだけでも USB フラッシュメモリを使う場面が激減するなどの効果はあった.(せっかく自分で設けた暗号化領域も使う機会が減ってしまった.)

ただしこれをやると,失敗して「下書き」を削除する可能性が高まるので注意が必要だ.じっさいボクはその経験を二度くらいしたことがある.どうして消してしまったのかは,はっきり思い出せない.gmail でメッセージを作成するとき,(ほかのメールを参照しやすいように) メール作成用の小さな別窓を開くことが原因かもしれない.ときどき同じ作成中メールを複数窓で開いてしまうので,要らない窓を消すために「破棄」ボタンを押すのだ.それであとで残った別窓を閉じるときに保存し忘れたのかもしれない.

しかしボクが下書き機能を利用することが少なくなった主な理由は,Google ドキュメントとか Google サイトなどの,べつのクラウドコンピューティングを実践しているからだ.(野口はどうも Google ドキュメントの愛用者ではない感じだ.「[Gmail] アドレスを共有することによって、本の共同執筆などの共同作業のプラットフォームとして使うこともできるだろう」とか書いているので.どうでもいいが,G ドキュメントと G サイトの棲み分けはむずかしい.どちらも pdf ファイルをふくむ文書ファイルを保存しておけるし.)

たとえば (うちの大学サイトでは学外からのアクセスでは注文できないため),研究費で本を注文するためは,「注文予定と注文済み」という文書を G docs に用意しておき,大学に行ったときにそれを参照する.そういう作業があるのを忘れないように,個人用ホームサイトの iGoogle の「付箋」には,「次に大学に行ったときにやるべきことリスト」が常に載っている.あるいは年度末には,予算をうまく使い切るための戦略を練るのに G docs の表計算文書 (スプレッドシート) を使う.こういうのは家でも大学でもすぐ参照できないと意味がないのはあきらかだろう.自分の大学では全文 pdf を入手できない欲しい論文一覧を文書にまとめておいて,他大学に遊びに行ったときにそれを参照するという使い方もできるだろう.G sites のほうは,共同研究者とファイルの受け渡しなどに使っている.

ついでなのでGoogle ドキュメントについて改善してもらいたいと思っていることを列挙しておこう.

  • 文書,プレゼンテーション,スプレッドシートで仕様がばらばら.そのちがいが分かりにくい.たしか制限ページへの閲覧権を得るために,スプレッドシートならグーグルアカウントが要らないが,文書なら要ったのでは.アカウントのないひとにも一様にアクセス権を与えられると助かる.
  • 「文書」のほかに純粋なエディタというか「テキスト書類」もあったらいい.ほかの文書からコピーしたのをペーストするたびに,いちいち「書式をクリア」するのもアホらしい.
  • エディタとしての機能を充実できないか.プログラミング環境他いくつかの専用モードを用意できないか.必要なコマンドがすぐに選択できるように.

    • html エディタくらいあってもいいんでは.(ちなみにこの文書は mi というエディタのカスタマイズされた html モードで書いている.)
    • LaTeX や TeX エディタと実行環境があればかなり使える.TeX のインストールはけっこう面倒だから.
    • 各種プログラミング言語のエディタとか,実行環境ができないか.(無理だろうなあ.) たとえば教育用に Ruby でもちょっと使いたいと思っても,(Mac とちがい) Windows には Ruby がプリインストールされていない.学生にはインストールからはじめてもらうことになり,大変だ.
【2008/11/08 05:12 】
| プログラミング | コメント(4) | トラックバック(0) |
ハノイの塔とか Leopard とか

怒りに取り憑かれていた.なにかを書くことは沈静化に少しは役立つ.しかしゴールデンウイークはまともな研究はできなかった.

けれど Revise before review になっている論文をどう改訂するかという方針はできた.少し安心.締め切りをちゃんと調べてみた.メールには書いてなかったけど,投稿システムには 6 月はじめとあった.そういうことなんだろう.

仕事が進まないので,アルゴリズムの解説書なんかを読んだ.ハノイの塔の問題を解く Ruby プログラムを動かしてみた.たった10行ちょっとだけど,ちゃんと動いた.

小波秀雄の「アルゴリズムとデータ構造」のテキスト『プログラミング入門 』にハノイの塔の解説とプログラムが載っている.このテキストはかなり分かりやすい.クイックソートの説明なんか秀逸.ただし現状ではタイポが少なくない.

再帰,すごいじゃないか! しかしこんなことで感動してよいのか? 素人のボクは感動してよいだろう.だってプロの浅野哲夫が『アルゴリズム・サイエンス:入口からの超入門』(2006) の「再帰の威力」で以下のように独白しているから (148ページ):

「ハノイの塔の問題については,今まで著者も再帰の例題としては適切だとは思っていたが,実際にプログラムのレベルまで考えたことはなかった.本書を書くにあたって,実際にプログラムをつくってみて,改めて再帰の威力を感じた次第である.」

Mac OS X Leopard の最新機能は意外と便利.

  • Spaces. デスクトップが切り替えられる.いや,デスクトップ自体はそのままで「スペース」を複数作り,それぞれのスペースにいくつかのウインドウを割り当てられる.複数書類が開いているとき,これまでは当面使わないものをドックにいちいちしまう方法があった.しかしそれはいったん書類を引き出しにしまうようなもの.スペースを切り替えると以前の状態が維持されたまま現れるのは,まさにデスクを複数持つ感じ.LaTeX 入出力と辞書用のスペース,参照するペーパーの pdf ファイル用のスペース,Google で英語表現や関連情報を検索するためのブラウザ用のスペースというふうに分けて,論文執筆に利用中.外部モニタを使う場面がますますなくなりそう.
  • Cover Flow とクイックルック.ファインダから直接文書の中身を確認できる.連休前に提出した書類をざっと確認.本をめくる感じに近い.多くの写真から知り合いに送るやつを選ぶときもにも便利だった.
  • Spotlight. ブーリアン検索ほか,Google 同様 " を使って完全一致語句の検索ができるようになった.特定の英語表現をふくむファイルをすべて表示したりできる.論文書きに使える.

追記 (5/14/08). Spaces の説明を修正.

【2008/05/10 11:17 】
| プログラミング | コメント(0) | トラックバック(0) |
最短路問題,グラフ描画,家系図

追加キーワード: グラフ理論,ネットワーク最適化,展開形ゲーム,ゲームツリー,可視化,ヴィジュアル,グラフィックス.

前回記事にある「油分け問題」に続き,今回は最短路問題を解くダイクストラ法 (Dijkstra 法) の Ruby プログラミングを担当科目の課題にした.こちらはアルゴリズム自体はその疑似コードとともに授業で学んだので,あとは Ruby で表現する問題だ (受講生によればそこがむずかしい).たとえば Wikipedia にある疑似コードを下敷きにしていいと受講生には伝えた.

自分でもプログラムを書いてみた.路線探索プログラムの本質的な部分が初心者にも書けたということであり,なかなか素晴らしい.(ちなみに路線探索では2番目以降に表示する経路をどうするかがむずかしいらしい.←こちらのサイトにはダイクストラ法の図解もある.)

だが,なにかもの足りない.いや,将来「もの足りない」と言う学生が出てきそうな気がする.そう,なにもかも文字として処理されるのだ! つまり重み付き枝たち (たとえば距離あるいは重み 10 の枝 (s, 1) を [:s,1,10] と書く) を要素とする配列と出発点 (たとえば :s と書く) を持つインスタンス problem を作れば,あとは problem.shortest_path_to(v) とやることで任意の点 v への最短路とその距離が配列として返って来る.図がどこにも現れないのである.

そういう学生には,「心配はいらない.こういうグラフをテキストデータから描いてくれるプログラムは存在するはずだ」と答えるつもりだった.グラフというのは点と点のむすびつきの情報だけで決まるものであり,画像としての表現はその本質ではないからだ.把握のしやすさや見栄えを別にすれば,データを画像としてではなくテキストデータとして保持するのが本質的なやり方と言える.たぶん Mathematica あたりもそんな描画機能を備えているだろう.そんなところにたまたま飛び込んで来たのが,こちらの解説記事「ITpro【特選フリーソフト】テキストをグラフに変換 Graphviz」だ.ふむふむ,Graphviz ってのがあるんだね.ということで,Mac OS X edition of Graphviz を試してみた.

読者は「平面グラフ (点の位置をうまく選べば,辺が交差しないように平面上に描けるグラフ) をじっさいに辺が交差しないように描いてくれるんだろうか?」などの興味を持つかもしれない.平面グラフかどうかは理論的にはクラトウスキーの定理で判定できるが,このソフトがその判定機能を備えているかどうかは知らない.デモンストレーションを一見したところ,交差する枝が少ない気はするので,それに近い機能を利用しているんじゃないかとは思うが.

個人的には,これが家系図に使えるかどうかに関心がある.(ちょっと試したところ,残念ながら日本語が文字化けしたけど.) じっさい,同じ疑問をもったひとはいたようで,その返答として Graphviz で家系図を描いた例はあった.ポイントは親子関係を有向枝で表し,男性のノードを長方形で女性のノードを楕円で表すことにより区別することだろう.ノードを形で区別することは (ノードにノード名と異なるラベルをつける,あるいはノード名の付け方に規則を導入するという意味で多少)《グラフ》の定義を逸脱しているが (追記参照),こうすることで「父・母・子」の3項関係を表すことはできる.ただし,このままでは兄弟の順番は (ラベルなしでは) 表現できないし,父母と兄弟の間の枝を交差させず直線で描こうとすれば (リマーク 1),たぶん (先祖を子孫より位置的に上に描くといった) 階層構造は崩れる.じっさい,さっきの例のコードを描画してみたところ,根っこ以外のどのノードも出次数が 1,つまり子供がひとりだけということになっていた.すなわちこの家系図はある個人の直系尊属のみを記録したものであり,兄弟や傍系の存在に起因する複雑さを回避したものだった.

リマーク 1.

読者は「そもそも親子間の枝をつねに交差なしの直線で描くことは無理では」と思うかもしれない.だが,できるのだ.一組の夫婦とその子だけからなるグラフに関する限りできる.そのグラフが平面グラフであることは描いてみればすぐ確かめられる.そして,たぶん驚くべきことにファーリの定理によれば,すべての平面グラフはどの辺もまっすぐになるように描けるのだ!……いや,そんな定理を持ち出すまでもなく,子を横一列にならべて,親をその列の上下に配置すればできる.よき教育者は,イメージを喚起しやすいように教育的配慮をするものだ.これはどうか? 時間軸の両側に男女がいて,ある時点 t におけるセックスでできた子供を,時間軸上の点 t に配置する感じだ.(ちなみに一組の夫婦とその n 人の子からなる親子関係グラフは完全2部グラフ K2,n という.)

なお,夫婦 1 組子供 5人を表現する dot ファイルを作って Graphviz の 4 つのレイアウトをちょっと試したところ,いずれの描画も枝が交差するものだった.「平面グラフを辺が交差しないように描いてくれるんだろうか?」という疑問には,いまのところポジティブな答を得ていない.

というわけで,Graphviz で家系図を作るとすれば,親子間の枝が複雑に交差するのは許す一方で,階層構造の表現を優先するのがよさそうだ.ここまでできるのだから,一組の夫婦にかんする親子関係の枝をまとめる方法 (つまり完全2部グラフ K2,n のすっきりした描き方) を提供してくれてもいい気はするけどね.[追記 2 参照]

追記 1 (1/26/2008).

リマーク 1 などに若干手を入れた.

「お前は「父・母・子」の3項関係にこだわり過ぎている.家系図を描く上で重要なのはだれとだれが子供の親であるかであって,そのどちらが父親でどちらが母親かということではない.あくまでも親子関係という2項関係が基本だ.数学でも,2項関係の理論を多項関係のそれに拡張して本質的なちがいがあったか? よき振る舞いをする多項関係は,2項関係に一定の条件を加えたものにすぎないのではないか? お前の専門とする社会選択でも,《選好》という2項関係をもとにした理論と,多数からなにかを選ぶ選択関数という多項関係をもとにした理論とで大きなちがいがあったか?」とのお告げがあった.

アダムとイブの関係を基本にして「生めよ,ふえよ,地に満ちよ」と祝福した神のお告げにしては意外だが,そこは問わないことにする.なるほど,《親子関係》を基本と考えて,それぞれのノードが親をふたつ持つ (入次数が2である) ことだけ要求すれば,たしかにどちらが父でどちらが母かは系図作成上重要ではないかもしれない.親の一方に「男」と,もう一方に「女」とラベルをつけることで満足ならば,3項関係を持ち出すまでもない.このばあい,親子関係のグラフは《グラフ》の定義を逸脱してはいない.

同様のことは「2部グラフ」と呼ばれるグラフでも起こる.2部グラフとはたとえば互いにセックスをしたことのある男女に枝を引くようなグラフであり,もちろん《グラフ》の定義を逸脱していない.ホモセクシャルを考慮外にすれば,男同士あるいは女同士のあいだには枝がない.つまりそれぞれの点に「男」あるいは「女」とラベルをつけられるようなグラフだ.その際,男性である太朗に「女」のラベルをつけたならば,太朗とセックスしたことのある花子には「男」のラベルをつけることになる.グラフへの追加的な構造として「男集合」「女集合」といたラベルのついた集合を導入しないかぎり,性別の逆転はありうる.

追記 2 (2/7/2008).

「Graphviz で家系図を作るとすれば,親子間の枝が複雑に交差するのは許す一方で」と書いたが,もちろん下図のように婚姻関係などを表す点をダミーとして入れれば枝の交差はなくせる.人間を表さない点が導入されるとか,入力ファイルの可読性が下がる (上がる?) といった問題を除けば,現実的な描き方かもしれない.


【2008/01/25 17:39 】
| プログラミング | コメント(0) | トラックバック(1) |
Ruby との悪戦苦闘で明けた新年

年明けには Ruby プログラミングをやった.去年の夏に「プログラミング教育用なんかにもいいかも」と書いたことのある ruby だけど,いま教えているオペレーションズ・リサーチの授業でじっさい ruby プログラミングをやることにした.プログラミングの経験がないという受講生が「プログラミングをやってみるいい機会」と意欲を見せたため,「じゃあ,すぐにマスターできる言語で行こう」と,急遽予定に組み入れた.

といってもボクもほとんど知らない言語だ (というか,プログラミング自体の経験も浅い) .まずはこちらの文献集にあった,まつもとの「rubyユーザガイド」 (ちょっと古い; また,初心者である自分にはあまり分かりやすくなかった) と Chris Pine の「プログラミング入門: Rubyを使って」(大部分は初心者でも読めるだろうけど,9章の後半と10章はむずかしそう) をざっと読んだ.プログラミングをはじめてからは,その文献集の「入門編」の「サイト」にある情報や,「オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル」その他を参照した.

プログラミングに出した課題はこんなタイプの問題だ: 「カップ 0, 1, 2 はそれぞれ 10, 7, 3 の容量を持つ.最初は容量10のカップに水が満杯の状態 [10, 0, 0] である.カップ i から j への水の移し替えを繰り返して,目標である [5, 5, 0]を実現したい.」この例にかんするかぎりは,9段階の移し替えで目標が達成できることが,すべての場合を網羅的に調べることで手作業で確認できる. (上述の科目で少し学ぶ) グラフ理論を知っていれば,この種の問題をプログラムで扱えるように表現するのは簡単だろう.アルゴリズムを考えることもたやすい.

それでもはじめての言語というのはいろいろと戸惑うものだ.ありがちなミスのパタンは,マニュアルと悪戦苦闘したり試行錯誤を繰り返すうちにだいたい分かって来た.で,できあがった最初のプログラムは,9段階の移し替えを実行するだけで 5 時間もかかり,10 段階以上は結果を出せなかった.そんなバカな! 「オブジェクト指向でプログラムを書いたのが悪かったんだろうか?」「再帰で関数を定義したのが悪かったんだろうか?」などと疑った.Mac OS X にはじめからインストールしてあった ruby がたまたま当たりが悪いバージョンなのかもしれないと思って,最新安定版 1.8.6 に入れ替えたり,クリスマスにリリースされたばかりの「高速」不安定版 1.9.0 を (一年近く触れていなかった) Windows PC にインストールしたりもした.だがそれらの対処法はいずれも見当違いだった.

ところでMac OS X に ruby 1.8.6 をインストールするのには,MacPorts を使った.これはボクにとっては前進だ.Unix ふうというだけでいままで毛嫌いしてたけど,やってみたらたいしたことはなかった.最初の導入は多少面倒だけど,こいつをいったんインストールしておけば,ほとんどの unix 向けソフトがコマンド 1 行でインストールできるようになる.そういうソフトとしては,pTeX, Octave, Maxima などがある.可能性が一発で広がるわけだ.こちらのサイトも参考になるだろう.MacPorts を使えるようになったのは,失敗から生まれた収穫といえるだろう.

では,なにがプログラムをそんなに遅くしていたのか? どうやら関数の相互参照であるようだ.たとえば history(t) という関数を定義するのに history(t-1) と obtained(t-1) を参照する一方で,obtained(t-1) を定義するのに obtained(t-2) と history(t-1) を参照するようになっていた.数学的には問題はなさそうだが,おそらくプログラム的には問題になるんだろうな.history(t) の定義のなかに使われていた関数 obtained(t-1) を単なるローカル変数に置き換えた.するとそれまで5時間かかってもできなかった計算が,1秒程度でできるようになった! やれやれ.

「関数を変数に置き換えた」とあっさり書いている.「そんなに簡単にできるならはじめから変数で書けばいい」と思うだろう.実際そのとおりなんだろうけど,これは慣れあるいは経験の問題かもしれない.[以下,インデント部分に修正を加えた.追記参照.] たとえば 1 から 10 の整数 i を合計するプログラムでは s = s + i などと書いて,右辺の値の左辺の変数への代入を表すけど,数学ではふつうそうはやらない.添字をつけて si = si-1 + i とするか,関数にして s(i) = s(i-1) + i とやりたくなるわけだ.添字をつけて何段階目の更新かというのをはっきりさせるわけだ.そういう癖にしたがって書いたプログラムが (メモリを浪費せず,かつ素早く) 自然に動いてくれたほうが都合いいと思ってるアマチュアプログラマはけっこういるかもしれない.

ところで数の合計といえば,はじめに s = 0 と設定して(1..10).each do |i| とやるのがただしいが,ボクがはじめのころ書いたプログラムには (1..10).each do |i| と書いたあとに s = 0 とする類いの初歩的なミスがあった.(これだと合計は 55 ではなく 10 になってしまう.) さすがに合計を求めるだけのプログラムではそういうミスはしないだろうけど,ループとか条件が何重かにネストする,より複雑なプログラムだと,意外とおかしてしまうミスかもしれない.

それにしても「おまじない」の類いをほとんど記述せずにプログラムが書けるのは気持ちいい.できたプログラムは普通に書くアルゴリズムよりもむしろ簡単かも.たとえば (?) 上記の水移し問題 (油移し問題) のインスタンスである abura にたいする結果を表示する---より具体的にはその履歴 history(t) を t = 0 から t = 12 まで表示する---には,以下のように書けばいい:

(0..12).each do |t|
p abura.history(t)
end

追記 (1/10/2008). あまりにも単純すぎてポイントが伝わらなかった例を差し替えた.以下は修正前の記述.「プログラムでは x = x + 1 と書いて,右辺の値の左辺の変数への代入を表すけど,数学ではふつうそうはやらない.わざわざ添字をつけて xt = xt-1 + 1 とするか,関数にして x(t) = x(t-1) + 1 とやりたくなるわけだ.(この例は簡単すぎるので説得力ないけど,もっとむずかしくなると添字をつけて何段階目の更新かというのをはっきりさせた方が分かりやすくなる例は少なくないはずだ.)」

【2008/01/08 20:44 】
| プログラミング | コメント(2) | トラックバック(1) |
Ruby いいかも

オブジェクト指向言語 Ruby についてちょっと調べてみた.代表的なオブジェクト指向言語である Java とちがって,コンパイルなしで使えるのが魅力のひとつだ.(もっとも最近は掌田津耶乃の記事「コンパイル不要Javaの時代がやってくる!?」のような展開もあるみたいだけど.)

Ruby を使うと,プログラムが簡単になるとかいろいろいい点はあるようだ (熱烈な支持者が多いようなので,そちらを参照).プログラミング教育用なんかにもいいかも.試しに以前の記事「中学受験問題を無理やり解く」で書いたプログラムを Ruby 用に書き直してみた.(逆引きその他の参考書を引きつつ,文法知識ほぼゼロで作成.Java 用のファイルをもとにしたため,インデントにスペースとタブが混じるなどの不統一は残っている.) コードはアルゴリズムをほとんどそのまま書いた感じだ.

コードから分かるように,型を指定した変数宣言も不要.じつは上述の記事で java コードを書いたとき変数の型に関して問題が起こり,数値型を double にしたり long にしたりして問題を回避する必要があった.今回の ruby では,その種の問題は起きなかった.どうやら数値が大きくなったら,任意の長さの整数を扱える型に自動的に移るようだ.Ruby の紹介ではあまり強調されていないみたいだけど,個人的には重要なメリットと思う.

【2007/08/19 01:05 】
| プログラミング | コメント(0) | トラックバック(0) |
Mac OS X で Octave を利用するもっとも簡単な方法

フリーの数値計算プログラム Octave は Matlab の代表的なクローンだ.Mac OS X で Octave を利用するためのもっとも簡単な方法を紹介する.

蛇足 1. 詳しくは知らないが統計分析にも利用できるらしい.「統計分析」の授業で使わされた SPSS を買えそうもないと思った GSM 学生も導入するといいかも.「微分積分と線形代数」「オペレーションズ・リサーチ」などの授業でも役に立つかもしれない.

蛇足 2. ボク自身は集中的な数値計算をすることはまずない.したがって Matlab も使ったことがない.いざとなれば汎用的な Mathematica を使えばいいと思っている (オープンソースじゃないプログラムは学術的にはちょっと問題があるが).今回 Matlab のクローンに興味を持ったのは,人助けがきっかけだ.線形代数のテキストを執筆している知り合いの数学者が,「計算が面倒でなかなか進まない」と言っていたためだ.「Mathematica でも使えば?」と聞くと,持ってないという.アカデミック版が20万円くらいだから高すぎないと思うなら買えばと伝えた.Maxima というフリーのもあるけど,表示を見やすくするには高度な知識がいるから,おいそれとは薦められないという事情もあった.

代替策もいくつか教えた.Excel のソルバ行列計算ライブラリを使う方法,JavaScript を使用して Web ブラウザで入力と計算をする方法など.特に後者は初心者にはいいんじゃないかと思ったが,なんせやれることが限定されている.(同様の情報は「excel 逆行列 固有値」「ソルバ」「ブラウザ」などのキーワードで検索できる.)

やっぱり行列計算だから Matlab クローンが向いてるだろうということで,Mac OS X にインストールする方法を調べてみた.これが予想通り面倒そう.たとえば FinkCommander を使ってインストールする方法はいけるんじゃないかと思ったが,すでに持っている pTeX や Ghostscript までインストールしようとするので止めた.(Fink のダウンロードMac OS X 10.4(Tiger) インストール覚え書きも参照.) もっともっと簡単な方法はないものか.探索の結果見つけたのがここで紹介する方法だ.これならその数学者にも自信をもって薦められる.

まず,こちらの数値計算プログラムの Mac OS X 用バイナリを置いたサイトからコンパイル済みのプログラムを入手する.画面上部の水色バーの Octave をクリックすれば該当場所に飛ぶ.

Intel Mac のばあい octave-intel-bin.tar.gz をクリックすると,ダウンロードしたファイルは勝手に解凍をはじめる (設定によるが).そのなかから octave-intel-bin.tarをホームフォルダに移して,他に作成されたファイルとフォルダは捨てる.

次に Terminal を起動して上のサイトに書いてある通り (ただしファイル名を修正) に
sudo tar -xvf octave-intel-bin.tar -C /
と入力すればインストールが始まり,1分以内に終了する.この時点で octave-intel-bin.tar は捨ててよい.

行列計算のやり方はたとえばこちらの操作例こちらのコマンド集を見れば十分だろう.さらに詳しくはこういうマニュアルもある.

とっても簡単!

【2007/08/05 05:50 】
| プログラミング | コメント(0) | トラックバック(1) |
| ホーム | 次ページ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。