2011年1月31日月曜日

更新弱化中とその原因そしてその解決策

さて,今月のブログエントリ数が約1年振りに1桁となりましたが,その原因は一体何かと言いますと,即ち卒業研究なわけです.

高専では,最高学年である5年において,丸々1年間を使い指導教員の下卒業研究に取り組みます(多分).昨年は,色々と手を出し過ぎた事に加え,長期間に渡り体調を崩してしまったため,随分と遅れを取ってしまった事を記憶しています.現在は,どうにか最終発表を無事に終え,あとは卒業論文と学会発表が控えているというわけです.卒業論文と学会の要旨原稿の締切がこれまた,2/10と非常に迫っており,そのため暫くの間ブログの更新は無理そうです.つまるところ,2/10以降には,少しく時間が出来るというわけです.

ちなみに,私が取り組んでいるテーマをひとことで言うと,「家庭用ロボットの効率的な振舞を強化学習によって獲得する」です.

多くの家庭用ロボットにはヒューリスティクスが組み込まれており,それに従って掃除を行っています(ちなみに,業務用掃除ロボットは,高精度センサ使用可能+室内形状が既知という条件から,経路計画さえ済んでしまえば,その経路をロボットがたどるだけで終わります).そのため結構効率が悪いです.というわけで,効率向上を目的としてロボットに振舞を学習させるわけです,自動で.実環境への適用は滅茶苦茶難しいので,現時点では,実環境を模擬したシミュレーション上での実験を行っています.ある程度の制約はつきますが,それでもいくらかは効率化可能なようです.

余談ですが,競技プログラミングに関わっていたお陰か,随分とシミューレションの高速化が出来ました.どこが一番時間を食っていてどこをどう変えれば高速化するか,というのが直感的に分かるわけです.最終的には,最初のプログラムに比べ100倍近く高速化出来ました.

2011年1月14日金曜日

2011年の目標

というわけで今年の目標を制定します(途中で変更するかも).

■プログラミング関係
・ICPC
国内予選10位以内
アジア地区予選10位以内
・Aizu Online Judge
10位以内(Solved)
・TopCoder
YellowCoder(1500以上)
・Project Euler
Level 5
・コンパイラ制作
何か一つ,自分専用言語を作ってみたいですね.

達成出来そうで出来なかった目標達です.

■その他
・体調管理
昨年は,半年近くに渡って体調を崩してしまい,多くの方に迷惑をかけてしまいました.
今年は,限度を超えて無理をすることが無いようにスケジュールを組んでいきたいと思います.
・筋トレ
上の達成に貢献できそうなものとして.
・専門書消化
昨年と同様,まだまだ読み終えていない本が沢山有ります.

あまり多過ぎると手付かずのまま時間だけが過ぎ去ってしまうので,この位に止めておきましょう.

2011年1月2日日曜日

2010の目標の達成状況

さて,2010年もあっという間に終わってしまい,2011年に突入しました.昨年を振り返るため,2010年の目標の達成状況を考察してみます.

http://mainly-coding.blogspot.com/2010/01/blog-post.html
↑これ.

■プログラミング関係
・TopCoderでYellowCoderになる
Maxで1463まで行った(+37pでYellow)のですが駄目でした….
・Project EulerでLevel4になる
この目標を書いた時点で31問,12月入った時点で100問程度でしたが,怒涛の勢いで問題を解いていき,ぎりぎりLevel 4(150問)に到達しました.
・PKU Judge Online,anarchy golfへの参加
anarchy golfは幾つか参加し,POJは現在88問です.むしろAOJへの参加の方が多いでしょう.
・新しい言語を一つ以上習得する
Prolog(論理プログラミング言語)を始めました.習得は出来ていませんが,今も尚,勉強は続けています.

■その他
・溜まった専門書の消化
何冊か読みましたが,それ以上に買った冊数が多い気がします.
・数学,物理,英語の勉強(編入試験勉強を兼ねて)
数学はそこそこ復習しましたが,他は….
・趣味の充実
ICPCへの参加により充実度やモチベーションが非常に高くなったと思います.

多くの目標は達成できたとは言えませんが,目標が全く無いよりはモチベーションが高くなりますし,また達成感という物が生まれると思います.

後日,今年の目標を書こうと思います.

2011年1月1日土曜日

Project Euler

■088
長さnの数列(ak)を作る.
但し,任意のkについて,
2≦ak<ak+1
この時,
Σ=Σk ak
Π=Πk ak
と置き,
1+…+1+Σ=1*…*1*Π
が成り立つとすれば,1の個数mは
m=Π-Σ
となる.
よって,総和(総積)がΠであり長さがn+mの数列が出来たことになる.
Σ,Πは再帰で生成するが,再帰回数nは12000程度で十分である(と思う,それ以上の長さを生成しても意味が無いから).
min[len]=条件を満たす長さlenの数列の総和(総積)の最小値
として,minを更新していく.

■098
それぞれの文字列をASCIIでソート.ソートした後の文字列群で等しいものがアナグラム対となる.アナグラム対(s, t)に対して,桁数がsの長さである自乗数を全て生成する.sとある自乗数mを対応させ,アルファベット->数字のマッピングを作る.条件を満たさない(違うアルファベットに同じ数字が割り当てられる等)マッピングになるときはそこで終了する.マッピングを用いてtに対応する数値nを生成.nが自乗数ならすべての条件を満たしたことになる.
これらを満たすもののうち,最大のものを見つければ良い.

■151
[仕事の回数][A1の枚数][A2の枚数][A3の枚数][A4の枚数][A5の枚数]=その組み合わせが起こる確率
でDP.
考えられる組み合わせ全てについて,
dp[k][b1][b2][b3][b4][b5]+=dp[k-1][a1][a2][a3][a4][a5]*ak/(a1+a2+a3+a4+a5)
で更新.akを引いたとし,その後のそれぞれの紙の枚数をb1,b2,b3,b4,b5とする.
例えば,a3を引いたとしたら,
b1=a1
b2=a2
b3=a3-1
b4=a4+1
b5=a5+1
となる.

これで,ついに150問に到達し,Level 4となりました.