数理システム 最適化メールマガジン

バックナンバー ( 2012 Vol.1 ) 2012 年 1 月 19 日 発行

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  数理システム NUOPT メールマガジン  http://www.msi.co.jp/nuopt/
                           2012 Vol.1 ( 2012 年  1 月 19 日 発行 )
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

数理システム NUOPT メールマガジンでは,数理計画法パッケージ NUOPT 
に関する様々な情報やご案内を提供していきます.

++++ [目次] ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ■ <トピック> トータルソリューションと最適化
 ■ <トピック> NUOPT FAQ 更新
 ■ <トピック> 数理計画問題の豆知識(第 9 回)
 ■ <セミナー> NUOPT セミナーのご案内
 ■ <  tips  > SIMPLE 記述のテクニック(第 5 回)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

******************************************************************
■ <トピック>  トータルソリューションと最適化
******************************************************************

皆様,2012 年も当社の製品をよろしくお願いします.今回リリースする
V14 は,NUOPT も VAP(Visual Analytics Platform)上で動作する形式に
なっています.

VAP については,昨年のメールマガジンでの新年のご挨拶でも紹介させて
頂きましたが,弊社の「数理計画,データマイニング,テキストマイニン
グ,シミュレーションなどの数理科学による意思決定ツール」が連携して
動くプラットフォームです.これらのツールの連携によって,ある意味で
のトータルソリューションを提供するという事が目的で,得られたソリュー
ションを WEB 展開することが可能になるという機能が目玉となっています.

NUOPT 本体の最適化機能の更なる充実・発展も今まで同様に努めてまいり
ますが,今後はこの VAP の上で具体的な成果を出すべく技術開発を行なっ
て行きたいと思います.ユーザーの皆様の具体的ニーズを喚起する,イン
スピレーションを刺激するようなプロダクトを提供したいと思っています.
今年は,VAP 上の WEB アプリケーションの背後で NUOPT が動いている実
例をお見せ出来ると考えています.

近年,ビジネス分野でのビッグデータの利用が大きな注目を集めています
が,当社でも VAP におけるビッグデータ対応の開発を開始しました.まず
は,ストレージ上のビッグデータとストリームデータへの対応を目指して
います.その後,Hadoop などの分散処理環境でのライブラリの開発という
方向へ進んで行きたいと考えています.

上記開発は,マイニング機能,機械学習機能をメインとしていますが,こ
れに対応して,数理計画プロパーの分野でも超巨大データ,超巨大規模問
題への専用アルゴリズムの開発を目論んでいます.まだ,いつ提供できる
か明言は出来ませんが,将来の夢として提示させて頂きました.今後も
NUOPT と弊社の製品のご愛顧をお願いします.

                                                 (山下 浩)

******************************************************************
■ <トピック>  NUOPT FAQ 更新
******************************************************************

大好評の NUOPT FAQ 今回もお客様から寄せられる質問を追加しています!

  http://www.msi.co.jp/nuopt/user/faq/index.html

ご意見,ご要望等ございましたら,お気軽に NUOPT 担当
  nuopt-info@ml.msi.co.jp
までご連絡ください.

NUOPT でお困りの方も,そうでない方もご一読いただければ幸いです.

                                                 (村山 昇)

******************************************************************
■ <トピック>  数理計画問題の豆知識(第 9 回)
******************************************************************

突然ですが問題です.

---- [ 問題 ] ----------------------------------------------------
以下の条件を満足するよう太郎,花子,健太,浩二の 5 日間のスケジュー
ルを作成しなさい.

条件:
  1. それぞれ毎日「日勤」「夜勤」「休み」のいずれか一つを行う.
  2. 全日を通して,「日勤」を行う人が 2 人以上,「夜勤」を行う人が
     1 人いる.
  3. それぞれ全日を通して 1 回以上「休み」を行う.
------------------------------------------------------------------

このように,ある条件を満たすよう人に仕事を割り当てる問題を,シフト
スケジューリングといいます.今回は,このシフトスケジューリングにつ
いて取り上げます.

さて,このシフトスケジューリングというものは,冒頭のような小規模な
問題であっても,扱いが非常に難しい問題です.それはひとえに「対象が
生身の人間である」ことによります.

冒頭の問題に対して,次のようなスケジュールを立てたとしましょう.

---- [ 回答例 1 ] ------------------------------------------------
       1 日 2 日 3 日 4 日 5 日
  太郎 日勤 日勤 休み 夜勤 日勤
  花子 休み 日勤 日勤 日勤 休み
  健太 夜勤 夜勤 夜勤 休み 日勤
  浩二 日勤 休み 日勤 日勤 夜勤
------------------------------------------------------------------

「すべての条件を満足しているので大丈夫」
といいたいところですが,特に健太の気分になると,おだやかではないで
すね.不平等な待遇になっていることは明らかです.このような状態は一
般に職場のモチベーションを削ぎ,生産性に少なからず影響します.スケ
ジュール作成の担当者が日夜腐心しているこの重要事実を数理計画の言葉
で記すのは,使えるスケジュールへの第一歩です.

[ 回答例 1 ] の欠点は以下でしょうか.

  一. 「日勤」が朝->夜の仕事,「夜勤」が夜->翌朝の仕事である場合,
      「夜勤」->「日勤」は 24 時間連続で仕事をすることとなり,問題
      がある.
  二. 健太は「夜勤」を 3 回も行うのに,花子は 1 回も行わないのは不
      公平である.
  三. 健太が「夜勤」のような大変な仕事を 3 回連続で行うことは問題が
      ある.

「夜勤」の意味を理解している人にとっては「書くまでも無いこと」と考
えられがちなことばかり.じつは人間ならば暗黙の了解としていることは
思ったよりもずっと多いことに気づかされます.

上記のような欠点がある回答を防ぐには,おそらく次のような条件を追加
する必要があるでしょう.

追加する条件:
  4. 「夜勤」->「日勤」は禁止
  5. 「夜勤」->「夜勤」は禁止
  6. 「夜勤」の取得回数を均等にする

それでは,これらの条件を加えて冒頭の問題をもう一度考えてみましょう.

さて,答えは出たでしょうか.

出ませんね.
残念ながら 1 - 6 の条件すべてを満足するスケジュールは存在しません.
条件 1, 2 と 6 が同時に成立できないのです.シフトスケジューリングで
は,このように両立しない条件が共存してしまうことが頻繁にあります.

この場合どうするかというと,両立しない条件の重要性を比較し重要でな
い方の表現を和らげる,という方法をとります.例えば,条件 6 を次のよ
うに修正します.

修正した条件:
  6'. 「夜勤」の取得回数を なるべく 均等にする

さて,条件 1 - 5, 6' を満足する答えは見つかったでしょうか.
おそらく次のようなスケジュールができたのではないでしょうか.

---- [ 回答例 2 ] ------------------------------------------------
       1 日 2 日 3 日 4 日 5 日
  太郎 日勤 日勤 夜勤 休み 日勤
  花子 休み 日勤 日勤 夜勤 休み
  健太 夜勤 休み 日勤 日勤 夜勤
  浩二 日勤 夜勤 休み 日勤 日勤
------------------------------------------------------------------

四人の仕事量が同程度になっていますね.

この [ 回答例 1 ] から [ 回答例 2 ] に進む流れは,私たちが受託案件
でシフトスケジューリングを取り扱う場合,プロジェクトがどのように進
行するかを簡単にまとめたものとなっています.

ユーザ様と対話する機会を数多く設け,多種多様な要望に叶う柔軟なスケ
ジューラの設計を目指しております.

                                                  (中野 雄介)

******************************************************************
■ <セミナー>  NUOPT セミナーのご案内
******************************************************************

---- [ 数理システム 新製品新バージョン発表会 2012 ] --------------
株式会社数理システムのマイニング・最適化ソリューションのためのパッ
ケージ製品が魅力的にバージョンアップいたします.詳細のご紹介を行う
『新製品新バージョン発表会』を開催いたします.

日時:
  1 月 25 日(水)13:30 ~ 16:30

スケジュール:
  13:30~13:40 ごあいさつ 
  13:40~14:15 VAP(Visual Analytics Platform) 1.0 
  14:15~14:40 Text Mining Studio 4.1 
  14:45~15:10 Visual Mining Studio 7.1 
  15:10~15:35 S-PLUS V8.2J 
  15:40~16:05 NUOPT V14 
  16:05~16:30 S3 Simulation System Ver.3.0 

会場:
  (株)数理システム・セミナールーム
    (東京都新宿区新宿二丁目 3 番 10 号新宿御苑ビル 4 階)

お申し込み先:
  (株)数理システム 営業部 < sales@ml.msi.co.jp >

セミナーの詳細:
  下記 URL をご参照ください.
    http://www.msi.co.jp/packages/newversion2011.html
------------------------------------------------------------------

---- [ NUOPT セミナー開催日程 ] ----------------------------------
  ・ 2 月 15 日 (水) 13:30 ~ 16:30  最適化入門セミナー
  ・ 2 月 21 日 (火) 13:30 ~ 17:30  NUOPT 金融工学セミナー

会場:
  (株)数理システム・セミナールーム
    (東京都新宿区新宿二丁目 3 番 10 号新宿御苑ビル 4 階)

お申し込み先:
  (株)数理システム << NUOPT >> 担当  < nuopt-info@ml.msi.co.jp >

セミナーの詳細:
  下記 URL をご参照ください.
    http://www.msi.co.jp/nuopt/seminar/index.html
------------------------------------------------------------------

毎年恒例となりました新製品新バージョン発表会を今年も開催致します.
途中入退場は自由です.ご興味のある製品だけご覧いただけますので,
お気軽にお申し込みください.

                                                 (佐藤 誠)

******************************************************************
■ <  tips  >  SIMPLE 記述のテクニック(第 5 回)
******************************************************************

このコーナーでは,SIMPLE のモデルファイルの記述に際して,知っておく
と得をするテクニックや,マニュアルでは紹介していない便利な機能など
について,日々 SIMPLE を使用し開発している立場から紹介させて頂けれ
ばと思います.

今回は,Parameter から実数値(double),文字列値(char*)を取り出す
方法をご紹介します.今回ご紹介する方法をマスターすれば,出力ファイ
ルや求解設定を入力ファイルからコントロールすることができるようにな
ります.

モデルファイル model.smp(実行形式 model.exe)があり,このモデルに
A_in.dat, B_in.dat, C_in.dat, ... を次々に入力として与え,それぞれ,
A_out.txt, B_out.txt, C_out.txt, ... へ結果を自動的に出力するにはど
うすればよいでしょうか.
すなわち,X を A,B,C, ... とするとき
  model.exe X_in.dat  
と実行すると,各 X に応じて X_out.txt へ結果を出力するようにしたい
のです.

上記を行うには,まず入力ファイル X_in.dat に以下の出力先のファイル
名を指定するための追記を行います.

---- [X_in.dat] --------------------------------------------------
OutFileName = "X_out.txt";  // 出力したいファイルの名前
------------------------------------------------------------------

ここでは,OutFileName としていますが,任意の名前で構いません.
ついで,モデルに下記の記述を加えます.

---- [model.smp (1)] ---------------------------------------------
Parameter OutFileName(name="OutFileName"); 
char *filename;
OutFileName.val.asChar(filename); // パラメータから文字列値の取り出し
------------------------------------------------------------------

上記によって,model.smp をコンパイルして出来た model.exe をコマンド
プロンプト等から
  model.exe X_in.dat
と起動すると,OutFileName を介して,char* filename に X_out.txt を
設定する事が出来ます.ですので,後は simple_fprintf() などを使って,

---- [model.smp (2)] ---------------------------------------------
FILE* fp = fopen(filename, "w");
simple_fprintf(fp, ..........);
simple_fprintf(fp, ..........);
 ......
fclose(fp);
delete [] filename;
------------------------------------------------------------------

などとすれば,filename = X_out.txt へ結果を出力する事が出来ます.

上記では,.val.asChar() によって Parameter から文字列値を取得しまし
たが,.val.asDouble() を使えば,下記のようにして double 値を得るこ
とができます..val.asChar()とは若干記法が違うので,ご注意ください.

------------------------------------------------------------------
Parameter P; 
P=1.5;
double x = P.val.asDouble(); // x は 1.5 になる.
------------------------------------------------------------------

この方法を使えば,例えば,入力データファイルに NUOPT の求解設定値
(wcspTryCount など)を定義し,入力ファイルに応じて,求解設定を動的
に切り換えることができます.以下は,wcspTryCount を入力ファイルから
設定する例です(なお,一部の求解設定は,NUOPT の設定ファイル 
nuopt.prm からも切り換えることができます.詳しくはマニュアルをご覧
ください).

---- [入力ファイル] ----------------------------------------------
Param_wcspTryCount=5;
------------------------------------------------------------------

---- [モデルファイル] --------------------------------------------
Parameter Param_wcspTryCount(name="Param_wcspTryCount");
options.wcspTryCount = (int)Param_wcspTryCount.val.asDouble();
------------------------------------------------------------------

いかがだったでしょうか..val.asChar(), .val.asDouble() うまく使うこ
とで一つのモデルの挙動を外部から柔軟に切り換える事が出来ます.

それでは,次回以降もどうぞよろしくお願いいたします.

                                                  (白川 達也)

==================================================================
※ このメールは,展示会・セミナー等で名刺交換をされた方,過去に
    NUOPT に関するお問い合わせを頂いたことのある方,および本メール
   マガジンの配信を希望された方にお送りしています.
※ バックナンバーはこちらから御覧頂けます.
     http://www.msi.co.jp/nuopt/mailmagazine/index.html
※ 本メールマガジンは等幅フォントでお読みになることを推奨します.
※ 今後このメールマガジンが不要な方は,誠にお手数ですが,「メール
   マガジン配信停止」という件名のメールを nuopt-ms@ml.msi.co.jp
   にお送りください.

発行:株式会社 数理システム << NUOPT >> 担当
        東京都新宿区新宿二丁目 4 番 3 号 フォーシーズンビル 10 階
                                   tel : 03-3358-6681
                                e-mail : nuopt-info@ml.msi.co.jp
==================================================================

<< 記事の訂正のお知らせ >>

「SIMPLE 記述のテクニック(第 5 回)」の記事内のモデルの記述例
につきまして、以下の誤りがございました。
訂正させていただきますとともに、お詫び申し上げます。

< [model.smp (1)] の部分 >
  (誤)char filename[1024]; // 十分長い文字列配列
  (正)char *filename;

< [model.smp (2)] の部分 >
  最後に filename の領域を解放するための以下の記述を追加。
  delete [] filename; 

なお、本ページ内の該当箇所につきましては訂正を行なっております。