最適化セミナーのご案内

5.1.2 genClassのコール(VC++)

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

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

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

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

> genClass knapsack.smp

とします.genClassはNumerical Optimizerが提供するユーティリティーで,この実行のためには別途設定が必要となります.詳細についてはNumerical Optimizer/SIMPLEマニュアルを参照してください.以下がknapsack.smpに対するgenClassの実行例です.

C:\Program Files\Mathematical Systems Inc\NUOPT\SAMPLES\app>genClass knapsack.smp
genClass.bat Ver *.*.* for MSI Numerical Optimizer
Copyright (C) 1991 NTT Data Mathematical Systems Inc.
Build with Microsoft Visual Studio 2010 Express on 64bit

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

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

 

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

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

loadmodule

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

 ここで一点注意があります.生成されたknapsack.ccはプロジェクトに追加する前にknapsack.cppと拡張子を変更してください.こうすることにより,VC++のGUIの規約により,このファイルがC++のコードであると認識されるようになります.

 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)このクラスの実装の内容をユーザは直接意識する必要はありません.


 

 

上に戻る