2016年1月14日木曜日

論文レフリーをやってみて思うこと

いくつかの論文をレフリーして思うのは、何回かの改訂を経て、最終的に

「この論文、ついに accept できるなぁ」

というタイミングがあって、なんかちょっとホッコリとした気分になったりもする。

もちろん、それまでに「証明のここが間違っている」とか厳しいことも書かないといけない場面もあったりして、「これがうまく行けばいいのに」と凹んだりもするわけだけど、最終的にそれらがクリアされてくると、「おぉ!」とか思ったりもするし。

そんなこんなで、新しい論文が出来上がっていく過程では、著者とレフリーは直接会うことはないわけだけど(実際に会う機会があっても、「自分がレフリーやってます」とは言えないわけだけど)、いろいろとあるもんだなぁ、としみじみしたりもする。

2016年1月13日水曜日

DIMACS のクリークのデータを Matlab 用に変換する

DIMACS のクリーク用データは、
https://turing.cs.hbg.psu.edu/txn131/clique.html
のサイトから入手できるが、バイナリ形式であるので、これを Matlab で扱いやすいように変換をする。

実際のファイルは、
https://turing.cs.hbg.psu.edu/txn131/file_instances/clique/DIMACS_cliques.tar.gz
にある。

これを展開して、 ascii ファイルに一度変換する。
変換ファイルは、
https://turing.cs.hbg.psu.edu/txn131/file_instances/converter.tar.gz
にあって、make でコンパイルした後に、
$ ./bin2asc DIMACS_cliques/MANN_a9.clq.b
とすると ascii ファイルで MANN_a9.clq が出来上がる。
一括変換なら
$ for i in DIMACS/*.clq.b; do ./bin2asc $i; done
である。

これを Matlab で処理して、一括変換する。
ただし、枝の数が 10 万を超えるものは、大きいので変換はスキップする。
以下のスクリプトを使っている。


TOO_LARGE = 100000;
dirs = dir('*.clq');
for index = 1:length(dirs)
    filename = dirs(index).name;
    fprintf('index = %d, filename = %s... ', index, filename);

    fp = fopen(filename, 'r');
    m = 0;
    n = 0;
    comments = {};
    while 1
        line1 = fgets(fp);
        if length(line1) == 1
            % end of file
            break;
        end
        if line1(1) == 'c'
            comments{length(comments)+1} = line1;
        end
        if line1(1) == 'p'
            strings = strsplit(line1);
            n = str2double(strings(3));
            m = str2double(strings(4));
            fprintf('node = %d, edge = %d\n', n, m);
            if m > TOO_LARGE
                break;
            end
            I = zeros(m, 1);
            J = zeros(m, 1);
            count = 1;
        end
        if line1(1) == 'e'
            strings = strsplit(line1);
            I(count) = str2double(strings(2));
            J(count) = str2double(strings(3));
            % fprintf('e[%d] = %d, %d\n', count, I(count), J(count));
            count = count + 1;
            if rem(count, 5000) == 0
                fprintf('e[%d]... ', count);
            end
        end
    end % end of while
        if m > TOO_LARGE
            fprintf(' : SKIP too large \n');
            continue; % to next file
        end
       
        A = sparse(I,J,ones(m,1),n,n);
        A = A+A';

    savefile = strrep(filename, '.clq', '.mat');
    save(savefile, 'A', 'comments');

    for i = 1:length(comments); fprintf('%s', comments{i}); end

end



出来上がったファイルは、
load MANN_a9
などで読み込むことができて、
for i = 1:length(comments); fprintf('%s', comments{i}); end
でコメントも表示できる。


2016年1月7日木曜日

Matlab でのエディタとコマンド入力の間のキーボードショートカット

Matlab の IDE でエディタとコマンド入力のところを行ったり来たりするのにマウスでクリックするのがめんどくさいと思っていたが、キーボードショートカットを調べてみたら、

Ctrl + Tab

で移動できることが判明。これで、さらに便利になった。

欲しいキーボードショートカットとしては、エディタで編集している時に一つ前の履歴のコマンドを実行するショートカットがあればいいとは思う。
たとえば、function [x,y] = test01(a, b, c) などがあるときに、F5 を押しただけでは a,b,c を入力できないけど、a,b,c を変更せずにソースを修正しながら何回も実行してテストするときなどには、こういった機能があったりすると便利だ。
今の状態だと、「Ctrl + Tab => 上 => Enter => Ctrl + Tab」 とすればできるけど、これがF4 なり、F8 などで、一回でできると便利かとは思う。



2016年1月5日火曜日

20年後の数理最適化はどうなっているか?

今からざっと20年前は内点法がある程度できあがってきた頃。
年初めということで、現在から20年たったら数理最適化の研究はどうなっているかを考えてみるのも一興かとも思う。

大まかな予想としては(一部に、「そうできたらいいなぁ」という願望も含む)、

1.純粋数学に近い研究と実用に近い研究へと、大きく2極化する

たとえば、Math Prog などに掲載されるようなものは、パッとすぐには実用化には結びつかないような、むしろ純粋数学に近いようなところが多くなるかと思う。これはこれで基礎理論として純粋に理論を追究していくタイプになって面白そう。

逆に実用に近いところでは、メタヒューリスティクスのように厳密な最適解ではないが、実用的な計算時間で妥当な近似解を出すようなところが増えるのではないかと思う。これはこれで、実社会への応用が着実に行われて面白いと思う。

2.リアルタイム最適化が行えるようになる

たとえば、分枝限定法などは長時間の計算になるので、計算している途中で変数を追加したり削除したりを行いたくなってくる。
途中のノードの計算結果を見たときに変数と制約の追加や削除を自由に行えるようなアルゴリズムを作れたら、非常に面白い。
これができれば、小さいデータでテストをしながらも、順調に進めば大きなデータにアルゴリズムをリスタートすることなく移行することができるようになる。
たとえば、データの変化を追いかけたい金融のポートフォリオの計算などに使えるかと思う。

3.クラウドソーシングで研究機関が個人からも研究を受注できるようになる

数理最適化分野だけに限る必要はないが、クラウドソーシングを利用することによって、企業のような大組織だけでなく個人からも研究を受注できるようになる。
クラウドソーシングを使うと、もっと気軽に「こういった研究が欲しい」という声を聴ける可能性もあり、今までは把握できなかった研究テーマなどが発掘でできるようになるだけでなく、研究成果をよりダイレクトに還元することができるようになる。
数理最適化や確率・統計などの一部を含むオペレーションズ・リサーチは、「問題解決学」という側面ももっているので、非常に面白そう。


まずは思いつくのはこんなところ。
3については技術的には既に可能なので、20年とかからずとも不思議ではない。

数理最適化に関係するいろんな人が「20年後に数理最適化はどうなっているか」を予測し始めたら、それも見てみたかったりもする。


2015年12月17日木曜日

疫病の広がり方と研究資産

金曜日に参加した制御関係のワークショップで、疫病の広がり方についてエージェントベースのシミュレーションを用いている研究があり、非常に勉強になった。

ところで、この話を聞いて思い出したが、疫病の広がりを抑えるために、人的ネットワークのどこに医療予算をどのように配分するべきか、ということを半正定値計画問題で計算している、という論文があった。
この結果をシミュレーションのパラメータなどに利用したら、有効活用できるかと思われる。


ところで、疫病の場合は広がりを抑えることが計算目的となるが、同じような計算ステップを用いれば、研究分野でどの研究を普及させるためには誰に研究予算をつけるべきか、ということも計算できる。
たとえば、ドイツの「インダストリー4.0」などはキーワードとしてよく聞くようになっているが、研究をブランドとして確立していくためにも数理最適化のアプローチを使えるかと考えられる。
ネットワークデータをどのように入手すべきか、という課題があるが、計算手順としては開発可能なアプローチかと考えられる。

2015年12月7日月曜日

Julia の git 版をコンパイルしてみる

Debian で Julia を apt-get でインストールすると 0.3.2 というバージョンがインストールされ、少し古いバージョンである。

ということで、最新版を素っ飛ばして、git 版をインストールしてみる。
Julia はバージョンごとにファイルが整理されているので、複数のバージョンが共存しやすい。

まずは、
$ git clone https://github.com/JuliaLang/julia.git
としてソースを clone する。
そのあとは、

$ cd julia
$ make

として、数時間放っておくだけでコンパイルが終わる。
(apt-get で Julia をインストールしてあるので、コンパイルに必要なファイルなどは既にそろっているのではないかと推測している。)

実行するには
$ ./julia
とすればよく、Pkg.add などでパッケージもインストールできる。
(ただし、Version 0.4 とは別にインストールされるので、パッケージを一通りインストールしなおす必要がある。)

ちなみに、Version を表示してみると、
$ ./julia --version
julia version 0.5.0-dev
と表示される。

今日の作業内容:ワークショップ準備 2h + 樹木園計算 2h
明日の予測作業時間:3h

2015年12月2日水曜日

離散凸を勉強中

手元で最適化しようとしている関数が離散凸関数であるかどうかを判断するために、離散凸について、もう少し勉強中。

連続関数なら、ヘッセ行列が半正定値なら凸関数になることが分かるけど、離散凸では様子が違う、ということが下の資料に書いてある。
http://www3.grips.ac.jp/~tsuchiya/PSD/slides/murota140114.pdf

つまり、離散凸の場合の実行可能解である各点でヘッセ行列が半正定値でも離散凸関数とは限らないようだ。

このあたりをふまえて、もう少し調べてみることにする。

今日の作業内容:ワークショップ準備 1h, 離散凸を下調べ 2h
明日の予測作業時間:1h