アーカイブ: 2008年04月

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[PHP] foreach ($array as &$value)形式が使えたなんて

foreach文で参照が使えるってさっきはじめて気づいた。

<?php
$array = array(array(), array(), array());

foreach ($array as $value) {
	$value[] = 'foo';
}

print_r($array);

foreach ($array as &$value) {
	$value[] = 'bar';
}

print_r($array);

続きを読む

スポンサーサイト

知らなかった

最近livedoor Readerからの読者が増えたなぁと思って、livedoor Readerで何人くらいがこのブログのフィードを登録しているのかが気になった。今までlivedoor IDを持っていなかったからわからなかったけど、今日ID取って見てみたら、60人以上がフィードを登録してくれているんだとか。せいぜい5人くらいかと思っていたから、意外と多くて驚いた。

ってかlivedoor Reader便利そうだな。そろそろはてなRSSから乗り換えようか。

ブックマークもはてなからdel.icio.usに乗り換えちゃったし、最近自分の中ではてな離れが止まらない。

昨日の問題を遺伝的アルゴリズムっぽく

昨日の問題[1][2][3]を、遺伝的アルゴリズムのようなもので解いてみた。解くのに使ったPerlコードは最後に添付。

一応、前々回のエントリで提示したサンプルデータに対しては、10個の実験枠と40人の参加希望者を全て使い切る最適解を一つ見つけることができた。パラメータ変えながら50回くらい繰り返した末にだが。

とはいえ、実験枠数と参加希望者数の関係が変わったりするとまだうまく最適解を推測できないようなので、もう少しチューニングしたほうがよさそう。

続きを読む

前回と前々回のエントリーの問題を総当りで

前々回前回のエントリで書いた問題を、Perlで総当りで解こうとしてみた。使ったコードは最後に添付。

実行開始から7時間半経過したけど未だに終わる気配がない。馬鹿正直に40人の参加希望者と10個の実験枠を組み合わせたら組み合わせは10^40通り。今回のコードでは、参加可能枠の配列を使って解空間を狭めたけれど、それでもやはり9 * 8 * 9 * 6 * 6 * 5 * 4 * 6 * 7 * 9 * 6 * 8 * 9 * 6 * 7 * 5 * 9 * 4 * 4 * 5 * 3 * 8 * 6 * 8 * 6 * 8 * 7 * 3 * 7 * 9 * 5 * 9 * 5 * 6 * 8 * 7 * 8 * 8 * 7 * 5 = 1.4271125147448316e+32通りの解がある。もっと解空間を狭めるアルゴリズムを考えるか、確率的なアルゴリズムを考えるしかないようだ。

ちなみに、7時間半走らせたところ、最適解は最大実験枠が4個で最大参加者数が12人になっている。明らかにまだまだ。

続きを読む

前回のエントリの問題を詳述

前回のエントリで、僕では解けない問題を書いてみたんだが、書き方が曖昧であまり伝っていないみたいなので、少し正確に書いてみることにした。ついでにサンプルデータも用意したから、サンプルデータでイメージしてもらえると助かる。

続きを読む

この問題はどう解けばいいんだ?

最近作ってるシステムで、どうしてもどう解いていいのかがわからなくて行き詰っていた問題があったのでpostしてみる。

作っているのは心理学実験の参加者募集システムで、問題は参加希望者を最適に実験枠に割り振るためのアルゴリズム。

問題の状況を簡単にまとめると図1のような感じ。

続きを読む

XREAでMTOS (Movable Type Open Source)を導入してみた

XREAのサーバーにMovable Typeを導入するというのは何回もやってきたことなのだが、今回はSSHを使ってやってみた。シェルをほとんど使ったことがなかったから苦戦したが、以前よりもかなり早く導入できるようになった。

今までは、シェルを知らなかったから、↓のようなすごく非効率的なことをやっていた。

  1. MTOSのダウンロードページからZIPをダウンロードする。
  2. ZIPを展開
  3. FTPでアップロード (2000ファイル近くある上に、しばしば失敗する)
  4. ちまちまと権限を設定

今回はXREAのサーバーにSSHで接続してやってみた。

続きを読む

[メモ][Java][JavaScript] ユークリッドの互除法

よく使うので、ユークリッドの互除法で二つの整数の最大公約数を求める関数をメモ。

/** Java */
int gcd(int x, int y) {
    int g = Math.max(Math.abs(x), Math.abs(y));
    int l = Math.min(Math.abs(x), Math.abs(y));
    while (l != 0) l = g % (g = l);
    return g;
}
/** JavaScript */
function gcd(x, y) {
    var g = Math.max(Math.abs(x), Math.abs(y));
    var l = Math.min(Math.abs(x), Math.abs(y));
    while (l != 0) l = g % (g = l);
    return g;
}

再帰は使わない。再帰を使っていなければ、関数化しないでインラインで使うこともできて便利。大小関係がはっきりしている正整数が二つある場合、ユークリッドの互除法は本質的にはwhile (l != 0) l = g % (g = l);だけで表現できるんだね。

まずJavaで書いて、それをほぼそのままJavaScriptに移植したから、JavaScript側のコードは引数のチェックをしていない。必要な場合は整数かどうかのチェックをしておいたほうがいいと思う。

続きを読む

Perlを書くようになったなぁと思うとき

リネームツールを探してくる代わりに

rename $_, ++$i . '.jpg' foreach (sort glob '*.jpg');

とか書いて済ませ始めたとき。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。