最適化セミナーのご案内

4.2.2 モデル兼ドライバのコール(UNIX)

 次はSIMPLEの記述を含む手続きMIPsolveをコールするメイン関数です.

#include <stdio.h>
#include "simple.h"

// 宣言(必須)
extern "C" {
  extern void secini();
}
// SIMPLEで書かれた最適化手続き
int MIPsolve(int narg,double* aarg,double barg,double* carg
        ,double* xarg,double* farg);

int readData(FILE* fp,char* filename); // データを読む

int main()
{
  //
  // 以下は必須(初期化)
  //
  secini();
  SimpleInitialize();


  int narg = 5;
  double aarg[5] = {4,2,3,6,7};
  double carg[5] = {6,8,4,3,4};
  double xarg[5];
  double barg = 20;
  double farg;

  int errCode;

  //
  // bargを変化させながらNumerical Optimizerを
  // 繰り返しコールする
  //
  int ib;
  for ( ib = 1 ; ib <= 30; ++ib ) {
    barg = (double) ib;
    //
    // システムの定義と求解.
    //
    errCode = MIPsolve(narg,aarg,barg,carg,xarg,&farg);
    printf("errCode=%d b=%g obj=%g ",errCode,barg,farg);
    printf(" x= ");
    int i;
    for ( i = 0 ; i < narg ; ++i ) {
      printf("%1.0f ",xarg[i]);
    }
    printf("\n");
  }

  //
  // SIMPLEが保持しているstaticバッファのクリア
  //
  SimpleClearBuffer();

  return 0;
}

 SIMPLEを記述した手続きを呼ぶ場合には,secini()SimpleInitialize()を呼ぶ必要があります.ここでは,データファイルを読み込まずにC++の配列にデータを設定してMIPsolveを直接呼んでいますが,以下のようにしてデータファイルを読み込んでおくこともできます.

char* filename = "c:\\temp\\data.dat";
FILE* fp = fopen(filename,"r"); // ファイルを開く
readData(fp, filename); // データ
fclose(fp);

 こうすると,データの名前と内容がバッファに蓄えられます.蓄えられたデータはSIMPLEオブジェクトで同じ名前(name)を持つオブジェクトと対応し,宣言時に読み込まれます.

 例えばデータファイル内に

param = 2;

という記述があると,以降

Parameter a(name="param");

という宣言によってaに2が代入されます.同じものが複数回現れた場合には,そのすべてにデータの内容が代入されます.例えば,

Variable v(name="param");

という宣言があれば,vにも2が代入されます.最後のSimpleClearBuffer()はSIMPLEが保持しているスタティックバッファのクリアを行う命令です.このコールを行った後は,コールを行う前に定義したいかなるSIMPLEオブジェクトの内容も参照することはできなくなる代わりに,プロセスの占有メモリ領域を減らすことができます.


 

 

上に戻る