見出し画像

No. 3 C++で学ぶ最適化ソフトウェア開発,設定ファイルを読み込む!

※忙しい人はタイトルと太字部分だけ読めば大体OK

No. 3は,ファイルから読んだ値の指示に従って最適化を行わせるための下準備になります.

一度作ったソフトは外からの指示で動くようにしたい!

 プログラミング学習=ソースコードの書き方を勉強することだ!と説明しました.自由自在にコードを書くことができれば,きっと好きな機能をモリモリに搭載した素敵なソフトウェアが完成することでしょう.ですが,実はやることを変更するたびにコードを書き直しコンパイル,という作業はあまりよろしくありません.例えばスマホの電卓アプリを使う時,足し合わせる数字を変えたからといって毎回コードを修正しませんよね?画面に表示されているボタンのAC でクリアし,もう一度10+25+…と打ち直すはずです.これは,コンパイルした後の機械語の実行ファイルに,ボタンからの指示を受け取る機能が付いているからです.ついつい当たり前に使ってしまう機能ですが,あれもアプリを便利にするため,エンジニアが設計し搭載している工夫なのです.ということで,筆者の開発する最適化ソフトウェアにも,コンパイルした後に外から指示を与える機能をつけておこうと思います!図にまとめるとこんな感じでしょうか:

設計でこんなに変わるソフトウェア.毎回コンパイルするのはしんどい・・・

毎回ソースコードを書き直す使用だと,いちいちコンパイルが必要で手間が多いです.それに引き換え,何かしらの入力(今回だとテキストファイル)を読み込む仕様にしておくと,ファイルの値だけ書き換えれば再度のコンパイルは不要で,最初にコンパイルしたファイルを実行し直すだけで良いことになります.また,計算結果を画面に出力するだけでなく,同じようにファイルに書いておくのもかなり有効な工夫ですので頭のすみに置いておいてください.
 お恥ずかしい話,筆者はプログラミングを勉強して論文をバンバン書き出した頃ですら,条件が変わる度に毎回コードを修正しコンパイルし直して計算していました.学術界における数値計算の分野ではそれでも特に支障を感じませんでしたが,今考えればちょっとアホです.その後は外部からの指示を受け付ける仕組みを思いつき(本当は参考書に載っているので思いつく必要は無い),独学で実装して計算がえらく効率化されたのを覚えています.

外部からの複雑な指示はファイルに書いて読ませる

 さて,今回つくるソフトにボタンを搭載するかと言われればもちろんやりません.というのも,仕様が複雑すぎてGUIの設計が大変といかほとんど不可能だからです.ということで,開発するソフトウェアでは最適化計算の指示を書いたファイルを読み込ませることにしました:

最適化問題のセッティングを書いたファイル

こんなファイルを用意しました.色々と書いていますが,最適化計算をどれくらい厳しくやるか,問題の規模をどこまで大きくして良いか,微分した式を自分で用意するか数値的に微分を求めるか・・・みたいなことを指示する内容になっています.ちなみに,各設定パラメータの名称はこちらの参考書に合わせている部分が多いです:

茨城俊秀,福島雅夫,FORTRAN77最適化プログラミング,岩波書店,1991

おそらくこの本はすでに絶版で入手困難,もしくは中古で相当根の春状態になっていると思うのですが,筆者的にはかなりの名著です.筆者も入手には苦労しました.こちらの本をかなり参考にしているので,自ずとパラメータの名称などは似てくると思います.
 なお,この本を買って勉強するのはオススメしません.古い,専門的,めっちゃ難しいの3拍子揃った名著なので,高価な割に入門書には向きません.大学理系レベルの微積分,線形代数の知識があれば読めるかも知れませんけど,プログラミング学習の本質からはやや外れますし.

ということで,実際に書いているコードはこんな状態です:

ファイルから値を読み込む部分の様子

まず,a)の部分でファイルの名称を指定し,その名前のファイルを開きます.そして,ファイルに書いてある内容を一行ずつ読み取っていきます.実は一行を読み飛ばすオリジナルの関数(skipというのがあるでしょ?)を使っていたりします.b)では,読み取った丸々一行を「,」の位置で左右に分割しています.「1.0E-3, EPS1」は「1.0E-3」と「EPS1」に分割されるといった具合です.左側が実際に欲しい値で,右側は説明なので不要になります.これを担うのはsplitという関数で,オンライン上でソースコードが公開されているものを参考に作ったものになります.そして,c)において左側の値を変数に代入しています.変数の説明はしていませんが,プログラムが受け取る値だと思ってもらえれば良いかなと思いますよ.このようなコードで,読み込み部の基本形はだいたい完成しました.このようにファイル名の変更がない基本設定ファイルはプログラム中に直接名前を書いておく予定です.

 次回はもう少し計算の中身について触れられればいいなと思っていますよ!それでは!!

K. HISAKAWA

いいなと思ったら応援しよう!