数理最適化セミナーのご案内

5.2 genClassのコール

 前節のモデルはこのままではC++で利用できる形ではありませんが.genClassというコマンドを用いて変換すると,対応するクラス宣言(knapsack.h)とクラスの実装(knapsack.cc)が自動生成されます.

 次のページに関連するファイルの関係を図示します.ユーザはまず,モデリング言語C++SIMPLEを用いてモデル記述を行い,genClassによってクラスの実装注1を自動生成し,ユーザプログラムからそれを使います.モデルを利用する場合には,こうして生成されたクラス宣言(同knapsack.h)をインクルードして,クラスオブジェクトを宣言します.このクラスオブジェクトのメンバを通じて,ユーザは自分のC++プログラム(同knapsackSolve())からこのモデルにデータや解を入出力(print()dump())する操作が可能になります.

 実行形式の生成の際には,先ほど自動生成されたクラス実装をコンパイル,リンクします.こうして生成されたC++SIMPLEのクラスは何個でも,また何回でも利用することができます.ただしC++SIMPLEのクラスを利用するに先立って,ユーザのプログラムから処理前にSimpleInitialize(),処理後にSimpleClearBuffer()なる関数を呼び出す必要があります(これらはC++SIMPLEが独自に利用する記憶領域の確保と解放に必要となります).

 genClassの起動はDOSウインドウのプロンプトから

> genClass knapsack.smp

とします.genClassはNuorium Optimizerが提供するユーティリティーで,この実行のためには別途設定が必要となります.NUOPT設定ツールの「環境設定」の「NUOPTへのパスを環境変数PATHへ追加する。」の右側の「追加」ボタンをクリックし,Windowsを再起動してください.詳細についてはNuorium Optimizerインストールガイドを参照してください.以下がknapsack.smpに対するgenClassの実行例です.

C:\app>genClass knapsack.smp
genClass.bat Ver *.*.* for Nuorium Optimizer
Copyright (C) 1991 NTT DATA Mathematical Systems Inc.
Build with Microsoft Visual Studio 2017(64bit) on 64bit Windows.
Output: knapsack.cc knapsack.h knapsackControl.cc knapsackCheck.cc knapsack_json.cc
genClass: Success.

 この操作でこの数理最適化モデルに対応するクラス定義と実装がgenClassを起動したフォルダに作成されます.

knapsack.h knapsack.smpに対応するクラスの定義
knapsack.cc 同クラスの実装
knapsackControl.cc 利用方法サンプル

 

 クラスの定義(knapsack.h)は,この数理最適化問題に対して操作を行うコントロール手続き(C++のコード)の中で操作を行う前に必ずインクルードする必要があります.クラスの実装(knapsack.cc)の内容は通常ユーザが意識する必要はありませんが,実行形式を作成する際にユーザのプログラムにコンパイル・リンクする必要があります.

 ソリューションnuoptvcappのプロジェクト

loadmodule

がこのインタフェースを用いてナップサック問題を解くプログラム例ですが,genClassで生成された実装(knapsack.cc)とクラスの定義(knapsack.h)を追加しています.

 knapsackControl.ccknapsack.smpで定義したクラスの利用方法のサンプルが記載されています.このコードは一度最適化実行を行うというものです.入力オブジェクトがあるクラスの場合には受け渡し用オブジェクトの宣言が書かれていますので,クラスの利用のコード作成時には参考になります.

#include "knapsack.h"
void simpleControl()
{
    Set S;
    Element i(set = S);
    Parameter c(name = "c", index = i);
    Parameter a(name = "a", index = i);
    Parameter b(name = "b");
    System_knapsack s1(c, a, b);
}

注1)このクラスの実装の内容をユーザは直接意識する必要はありません.


 

 

上に戻る