• トップ > 製品概要 > モデリング言語 SIMPLE

    モデリング言語 SIMPLE

    付属のモデリング言語 SIMPLE の使用により、線形計画/2次計画/混合整数線形,2次計画/一般の非線形計画問題をシームレスにモデリングし、解く環境を提供します。

    モデリング言語 SIMPLE を用いると数式に近い自然な形で問題記述ができるほか、自動微分機能により、大規模で複雑な非線形計画問題に対しても高階の微係数の情報を活かした精度の高いアルゴリズムを適用することが可能です。

    また、概念上モデルとデータが分離されており、大規模問題を簡潔に記述することができます。

    モデリング言語 SIMPLE は C++ のクラスライブラリとして実現されており、制御ループや出力などについては C++ 固有の機能を生かすことができるほか、他の C/C++ プログラムとのリンクも可能です。

    以下で記述例をご紹介しておりますが、より詳しく知りたい方はこちらから Numerical Optimizer/SIMPLE マニュアルや例題集をダウンロードしてください。

    モデリング言語 SIMPLE による問題の記述例

    ナップサック問題(knapsack problem)

    ナップサック問題の数式での記述例
    Set I;
    Element i( set = I );
    IntegerVariable x( index = i, type = binary );
    Parameter v( index = i );
    Parameter w( index = i );
    Parameter W;
    Objective V( type = maximize );
    V = sum( v[i]*x[i], i );
    sum( w[i]*x[i], i ) <= W;
    

    平均・分散モデルによるポートフォリオの構成(portfolio problem)

    ポートフォリオの構成問題の数式での記述例
    Set J;
    Set Term;
    Element j( set = J );
    Element t( set = Term );
    Variable z( index = t );
    Variable x( index = j );
    Parameter T;
    Parameter s( index = ( t , j ) );
    Parameter r( index = j );
    Parameter rho;
    Objective V( type = minimize );
    V = sum( pow(z[t],2), t )/T ;
    - z[t] + sum( s[t,j]*x[j], j )== 0;
    sum( r[j]*x[j], j ) == rho;
    sum( x[j], j ) == 1;
    x[j] >= 0;
    

    ネットワーク最小コスト流問題(minimum cost flow problem)

    ネットワーク最小コスト流問題の数式での記述例
    Set I;
    Set A( dim = 2, superSet = (I,I) );
    Element i( set = I );
    Element j( set = I );
    Variable x( index = A );
    Parameter a( index = A );
    Parameter s( index = i );
    Objective cost( type = minimize );
    cost = sum( a[i,j]*x[i,j],((i,j),(i,j)<A));
    sum( x[i,j],(j,(i,j)<A) ) - sum( x[j,i],(j,(i,j)<A) ) == s[i];
    x[i,j] >= 0, (i,j)<A;
    

    一般非線形計画問題(Hock & Schittkowski No.25)

    一般非線形計画問題の数式での記述例
    Set I = "1 ... 99";
    Element i( set = I );
    Variable x1;
    Variable x2;
    Variable x3;
    Expression u(index=i);
    Expression f(index=i);
    u[i] = 25 + pow( -50*log(0.01*i), 2.0/3.0 );
    f[i] = -0.01*i + exp( -pow( (u[i]-x2), x3 )/x1 );
    Objective F( type = minimize );
    F = sum( f[i]*f[i], i );
    0.1 <= x1 <= 100;
    0 <= x2 <= 25.6;
    0 <= x3 <= 5;
    x1 = 100;
    x2 = 12.5;
    x3 = 3;
    

    JiZzJiZZA