2025年8月21日木曜日

sqrt(a^2+b^2) の計算の大変さ

ノルムを計算したりするときに sqrt(a^2+b^2) とプログラムを書いてしまうことがあるが、これをちゃんと精度よく計算する方法が

 An Improved Algorithm for hypot(a,b)
https://arxiv.org/pdf/1904.09481

で議論されている。 数値誤差に関しての議論は、こんな基礎のところにもあるんだな、と思ったりする。 

 

2025年8月7日木曜日

AIに国際会議で参加するべきセッションを挙げさせてみた

 7月に行われたICCOPTについて、参加する前の週に発表プログラムの中から自分が聴講するべきセッションについて挙げさせてみた。その感想を書いておく。

  1.  自分で選んだセッションと比較すると1/3から1/2ぐらいのオーバーラップがあったので、今後の性能しだいではセッションを自動的に選べるようになる可能性もあり。
  2. 日程4日間のうち、最初の2日間からしかセッションを選んでくれなかった。プログラムの読み込みが途中までしか行われなかったのかもしれない。 
  3. 「最近ご自身が行っている○○という研究に関するセッションです」と理由付きで挙げられていたセッションもあったが、この研究は今までにやったことが無かった。
  4. セッションのURLを自動的に反映するようにしたが、存在しないURLを指定されるところもあった。ただ、今回のICCOPTはビザの関係なのか分からないけど相当数の発表がキャンセルになったようなので、URLやセッションは過去のデータに実在していた可能性もある。
  5. 自分で選んだときに「あんまり関係ないかな」と思っていたけどAIが選んでいたセッションを聞きに行ってみたら、結構面白い内容のものもあったので、新しい研究テーマを探すのに使えるかもしれない。
  6. 聞きたい2つのセッションが同じ時間で片方しか聞けない場合には、「発表タイトルからどのような発表が行われると考えられるか」というのを聞いてみると「○○という論文をベースに発表を行われる」という回答があるときもある。これについては、その発表を聞いてないので正しいかどうかは分からない。

という感じで、現状としては使える部分もあれば使えない部分もある、というところ。セッションが実際に存在するかどうかは自分で確認する必要がある。

事前に試してみればよかったと思うのは「このセッションは何人ぐらい聴衆が来るか」と予測させること。どういったデータを元に予測するのか、というのは面白そう。

あと、ICCOPT ではプログラムなどがPDFではなくてウェブページにしかない状況だったので、これが一つのPDFとなっていたら情報がより上手く取り込めたのかもしれない。 

 

 

 

2025年2月8日土曜日

Julia の Possible method call error のバグを非表示にする

Julia を VScode で書いている場合、正しいコードにも関わらず、Possible method call error という警告表示がでることがあって、Githubのページを見るとバグとして起きているようです。

例えば、行列A,Bに対して

C = kron(A,B) 

とすると、kron に Possible method call error が付きます。

この場合、

# eslint-disable-next-line no-undef

C = kron(A,B) 

とすると、警告が消えます。no-undef は種類によって変更が必要かもしれません。


2024年11月26日火曜日

台湾オペレーションズ・リサーチ学会に参加をしてきた

11月23-24日に開催された台湾オペレーションズ・リサーチ学会(&国際学会)に参加をしてきた。

今回は、台南にある国立成功大学 (National Cheng-Kung University) での開催で、23日はレジストレーションとバンケット。

レジストレーションでは、国立成功大学に在籍中という日本人学生さんがサポートしてくれたので、言葉には全然問題なし。(国際学会を兼ねるのは今回が初めてで日本からの参加も多かったので、日本人学生さんもサポートをしてくれているらしい。)ちなみに、建物の中で道が分からないときに、他のサポート学生さんに英語で聞いてもちゃんとすぐに答えてくれるので、たぶんどの学生も英語は相当にできるのではないかと思う。レジストレーションではカバンをもらった。台湾OR学会の研究発表会は年に1回の開催だけど、カバンは毎年配っているらしい。

バンケットの会場は Shangli-la ホテルという台南駅すぐ隣で台南市内でもかなり高層階(38階)の建物で、今回はフルコースだった。東坡肉は日本の5倍ぐらいあるし(聞いた話では台湾でも東坡肉の大きさは店によって大きく変わるので、ここのレストランのコックが大盤振る舞いしたのかもしれない)、魚は種類までは良く分からなかったけど、あっさりとした味付けがおいしかった。かなり美味しかったので、最後に出てきた白いドラゴンフルーツなどはお持ち帰りしたかった。あと、お茶が柚子茶と書いてはあったけど、韓国の柚子茶とはまた違った印象で、これも美味しい。

学会自体は24日が本番で、9:30に開始で最初は会長の挨拶。そのあと、受賞会。受賞会は中国語だったので正確なところは分からないけど、最初のあたりが大きい賞で、そのあとに若手研究者の賞、学生の賞、と順番になっているようだった。

10:00ぐらいから keynote が2件あって、約1時間ずつ。keynote の2件目は NVIDIA の OpenUSDや Omniverse の話があって、講演者は国立成功大学の出身で今はNVIDIAで勤務。Ominiverse のフレームワークで作った Digital Twin の動画などがあって面白かった。このあたりの動画の作り方などからすると、学生とかに興味を持って分野にどんどん参入してもらいたい、というのがこのkeynoteの話の構成だったのかもしれない。個人的には「Digital Twin がコンピュータ上の単なるシミュレーションではない」ということが分かって良かった。

12:00ぐらいからお昼ご飯で、参加者にお弁当が出ていた。お弁当はルーローハンや魚介類つみれのスープ、台南名物の海老巻き揚げ。あとはおかず類。これだけのボリュームだとちょっと足りないかな、というところに最後で豆花が追加されていた。しかも、ちゃんと台南名物の安平豆花。バンケットといいお弁当といい、食事が楽しくてしょうがない。この食事をチョイスした人にあと3食ぐらいチョイスしてほしい。

午後はパラレルセッションの時間枠が2つ。つまり、1時間半の枠が2個あって、その間に Tea Break。

パラレルセッションは10個あるけど(つまり、合計で20セッション)、今回は国際学会を兼ねているので10個のうちの2個のセッションが英語でのセッション。

一つ目のセッション(13:30-15:00)では、配送計画問題で複数のトラックの配送分担を決めるときに最適化ギロチンカットを用いる手法や、暗号資産の VaR などをけいさんするのに SVCJ (Stochastic Volatility  with Correlated Jumps) が使われていたり、 stochastic PERT に対して追加資材無しで最適化する手法もあった。他にも SDGs についての話があったり、飛行機の表面の加工に関して Taguchi method や ANOVA を使っている話もあった。

Tea Break (15:00-15:30) では、マレーシアからきた発表者と話をすることができた。マレーシアでは日本もそれなりに学生の進学先として人気があるけど、最近では地理的な近さから台湾も人気があるし、オーストラリアも人気、とのこと(自分の英語があっているなら)。日本人は日本からの距離で各国の位置を把握するけど、マレーシア人もマレーシアからの距離で考えるようなので、自分の中心がどこにあるかで見方が変わるのも面白いなぁ、と思ったりした。

二つ目のセッション(15:30-17:00) は、せっかくの機会だったので中国語のみのセッションに参加をしてみた。こちらのセッションはさっきのセッションと異なって学生の発表が多かった。学生が多いのが、中国語で発表できるからなのか、それとも二つ目のセッションの時間帯は学生が多くなるようにスケジューリングされているのか、そのあたりはちょっと分からなかった(誰かに聞いてみても良かったと思う)。内容としては最適化やロジスティクス関係の話で、NP-hardな定式化に対して VNS などのヒューリスティクスを適用していて、それらの調整方法などを話しているものや、RMFS (Robotics Mobile Fulfillment System) に関するGAの性能向上や Permanent Magnetic Clamping Blocks の利益最大化、他にも生産過程に対する2目的最適化にNSGA-IIを使って信頼性の最大化とコストの最小化を同時に行うようなもの、多目的最適化に対する Deep Reinforcement Learning, Job Shop Scheduling Problem に対する cloud + edge computing で Reinforcement Learning などしているものなどがあった。

このセッションでは、スライドは中国語で書かれていて発表も中国語で行われているわけだけど、スライドの漢字と数式を見ているとおおよその意味合いは推測がつくことが多い。(例えば、「最適化」は「最佳化」。)一方で、今回の学会は発表件数が多いからなのか発表一件当たりの時間は発表12分+質疑3分と短めで、言語の壁よりも時間の壁の方が意外にもきつい感じだった。

ちなみに、発表のアブストラクトについては印刷版はなく、インターネット上から自分でダウンロードしてくる形式なので、アブストラクトは誰でも読むことができる。そのうちに検索サイトのロボットが情報収集に来れば、検索サイトの検索対象にもなるのかと思う。

セッションは17:00に終わって、最後にクロージングのコメントが台湾OR学会会長兼実行委員長からあって、それで解散、という感じだった。最後の解散の時点でもオープニングの半分以上の参加者が残っていたかと思う。

今回の学会で他のところと違うなぁ、と感じたのは2点で、一つはどこでも写真を多く撮っているところ。受賞者が記念品をもらうときに写真を撮るのはよく見かけるけど、今回はセッション終わったところで発表者だけでなく聴講者も並んでの撮影があったりした。もう一つは、それぞれの発表が終わって質疑応答が時間ギリギリまでならなくても次の発表に移ってくこと。だから2つのセッションとも90分の時間のところ80分ぐらいで終わったかと思う。これらは今回だけなのか、それとも台湾の慣習なのか。

 

ということで、今回は台湾オペレーションズ・リサーチ学会に参加をしてきた。研究内容については自分がまだ知らない手法なども多く、とても勉強になったし、とても刺激になったし、もっと研究をしたくなったりした。あと、ごはん、美味しい。

2022年3月30日水曜日

Google Colab ってパッケージ開発者にとっていい環境かもしれない

Python プログラムの勉強をするときに Google Colab って便利だなぁ、と思ったりしている。

いろんなパッケージなどが入っていることもそうだけど、やはり一番の理由は「環境構築が必要ない」というところ。pipenv や venv あるいは conda と pip などの「複数ある手法のうちのどれを使えばいいの?」ということがないのが、かなり良いのではないかと思う。

特にパッケージ開発者の場合は「Google Colab でテストして問題ありませんでした」だけにできれば、pipenv, venv, conda などの複数の環境でテストする必要もなくて、効率的にはなりそう。

ちなみに、Julia の場合は Google Colab を使ってもいいけど、Julia の環境構築は簡単なのでローカルにインストールするのも大変ではないかな、と思う。

2022年2月18日金曜日

Julia のベクトル計算高速化

 Julia についての本ということで「1から始める Julia プログラミング」を読んでみた。タイトルから見ると初心者向けのようにも見えるけど、Julia で基本的なプログラミングができる段階から読んでみると多くの勉強になるかと思う。

 例えば、ベクトル x = [5; 3] に対して, a = 7, b = 4 のスカラーのときに
a*x .+ b
とすれば、数式で言うa*x+b*[1; 1] が計算できるわけだけど、これは
a.*x .+b あるいは @.(a*x+b)
の方が良い。

これがなぜ良いのか、という理由が分かりやすく書いてある。上の例だと小規模なのであまり影響が出ないが、最急降下法などで反復回数が増えるとパフォーマンスに違いが出そうにも思う。(この違いをコンパイラが最適化で吸収すると、パフォーマンスの違いはなくなるかもしれないけど。)

他にも、コードを関数の中に入れるだけで Julia は高速化されやすくなるのか、など、高速化の理由が書いてあり勉強になる。

あと、パッケージ管理や仮想環境などについても触れていたりなどなど、勉強になる点が多い。

2021年12月24日金曜日

Python が難しすぎる

数理最適化のアルゴリズムを実装するにあたって、たまに Python を使うことがあるが、だいぶ Julia に慣れてしまうと Python は難易度が高いように感じる。

個人的に難しいと思うのは主に3点で

1. conda と pip が混ざると環境が壊れることがある

2. python のバージョンが上がったときに対応できないライブラリがあって、複数の python を維持しないといけない

3. インデントでループ範囲を特定するため、コピー&ペーストが簡単にできない

 

2番については Julia でも他のライブラリで同じことは起きるので本質的な解決はできないことは同じだが、Pythonのほうがバージョン管理をきちんと行わないといけないような印象がある。

3番については、どこか別のプログラムで書いた一部分をコピー&ペーストしたときに、ループ範囲のインデントのスペース数が異なるとややこしいことになってしまう。このあたりは、for~end などで特定できると整形はエディタにお任せできるので、だいぶ楽ではある。


ただ、Julia が完璧かというとそういうわけでもなくて、例えば using の遅さなどはそのうちに改善されていくのではないかと思っている。Python もパッケージ管理や仮想環境管理は、もっといいものが出てくるのではないかと思っている。