2017年9月29日金曜日

Julia の now()

Julia の計算時間を測るには、@elapsed マクロが準備されているわけだけど、これだと begin-end でくくらないといけないので、Matlab のコードを tic, toc を移植したりするのが面倒だった。

調べてみたら、Julia には Julia で now() っていうナウい関数がちゃんとあった。例えば、
julia> start_time = now();
julia> X = rand(8,8);
julia> end_time = now()
julia> elapsed_time = end_time - start_time
10704 milliseconds
のようにできるので、Matlab の tic, toc を置き換えるのも比較的簡単に行うことができる。

(ちなみに、最初の now() だけは LLVM でのコンパイルがあるので時間が少しかかる)

2017年9月21日木曜日

論文読み:白血病治療に関する最適化

Optimization of Combined Leukemia Therapy by Finite-Dimensional Optimal Control Modeling

https://link.springer.com/article/10.1007/s10957-017-1161-9
Journal of Optimization Theory and Applications,
First Online: 15 September 2017

白血病治療に関する最適化の論文が出てきていた。
基本的には制御理論の計算手法を適用しているようで、細かいところは専門用語のために追い切れていないが、こういった使い方も最適化としてできる、という点が面白いと思う。

あと、感覚的にはこういった治療とかに関しての論文は、イスラエルの研究者も多いような気がする。どこかにそういったのをカウントしているデータとかあったりするのだろうか?


2017年9月20日水曜日

ソウルに行ってきた

先週のほとんどの時間を使って、ソウル滞在をしてきた。

日本から見ると、北朝鮮のミサイル問題などでソウルに行くのは危ない、と思うかもしれないが、実際にソウルに行ってみるとそれほど大騒ぎをしていなかった。日本のテレビのようにミサイルの発射画面を繰り返して写したりするわけでもないし、避難訓練とかの案内もまったくなかった。
むしろ、着実に生活水準を上げてきているソウルと、デフレ問題などで生活水準がジリ貧で下がってきている東京の差を、きちんと注視するべきだとは思う。なんだかんだ言っても、自分が頑張る場所は東京なわけだし。



ソウルでは、たまたまスケジュールが重なったドイツからの研究者の Max clique に関するSDP緩和の話を聞くことができて面白かった。自分が普段やってないことを聞くというのは、新しい視点ができていいものだと思う。

自分のほうは、SDP 緩和を SOCP で解く方法などを考えてみたりして、普段の環境とは違うと集中力なども違うので、いい転換になったかと思う。


2017年9月8日金曜日

DSDP という良くできたソフトウェア

数理最適化のコアとなる問題は LP であるが、LP に対する数値解法は SDP などに簡単に拡張できるので、LP に対する新しい論文が出てくると「SDP とかsymmetric optimization に使いました」っていう論文は良く出てくる。
面白いと思うのは、symmetric optimization に拡張したからといって、たいていの場合は内点法の時のように新しい知見が得られるわけではない、というところ。

これと同じように full NT direction についての論文も SDP に拡張されたりなど、いろいろと類似の論文がある。
これについては、
A New Full Nesterov–Todd Step Primal–Dual Path-Following Interior-Point Algorithm for Symmetric Optimization
という、簡単に拡張できるところは基本的にカバーしている内容があったりして、参考になる。(つまり、full NT direction でSDPの論文をさらに書くのは新規性の点で難しいってこと。)


ところで、SDP の探索方向には、NT, AHO, HKM といろいろとあるわけだけど、個人的には DSDP が使っている探索方向がベストな探索方向ではないかと思っている。
数理最適化問題の物理的構造を計算に取り込む、という点で非常にうまくできている。実装する時間が見つかれば SDPA/SDPARA に採用したいぐらいだ。これは10年後か20年後の研究に必ず役に立つと思う。





2017年9月4日月曜日

逆行列求めるって、難しいよね、っていう話。

例えば、sqrt(5)*I [ただし、Iは単位行列] の逆行列は、当然ながら (1/sqrt(5))*I である。
ところが、行列のサイズが n = 1000 ぐらいになると、数値計算ではうまく行かないことがある。余因子行列を用いる方法だと行列式が必要であるが、sqrt(5)*I の行列式が Inf になってしまうのである。Matlab なら


>> n = 1000; A = speye(n)*sqrt(5); det(A)
ans =
   Inf

となってしまう。

これが単純に逆行列ならば (1/sqrt(5))*I で処理すればいいので特に問題ないが、主双対内点法で解きたいような問題にこういった構造があったりすると、数値的不安定になったりして、話が非常にヤヤコシイ。