assert

前提条件を検査するための OPL キーワード。

目的

前提条件を検査するための OPL キーワード。

コンテキスト
モデル・ファイル (.mod)

構文

InModelDeclaration: . LocalVar ';'
                  | . TypeDeclaration ';'
                  | . Objective ';'
                  | . "constraints" '{' Constraints_opt '}'
                  | . ';'
                  | . "assert" Expression ';'
                  | . Scripting

説明

OPL では、アサーションを使用して前提条件を検査できます。アサーションは、最適化モデルが有効であるための条件が遵守されていることを検査する場合によく使用されますが、モデル・データの整合性を検証する場合にも使用されます。 面倒なモデルのデバッグや誤った入力データによる結果の間違いを防ぐためにも、アサーションを使用することを強くお勧めします。

ここでのアサーションは、C 言語の assert 命令に似ています。最も単純な形式のアサーションは true であることを条件とするブール式で、true でない場合は実行エラーが発生します。例えば輸送の問題では、一般に需要が供給に一致している必要があります。

assert ステートメントは、宣言順に処理されます。

アサーションにラベルを付けることができます。assert ステートメントの一部である制約にラベルを付けると、アサーションが失敗した場合に、失敗したアサーションのコンテキストが「出力 (Output)」領域の「問題 (Problems)」タブに表示されます。

以下の宣言では、サプライヤーからの供給総数が顧客の需要総数を満たすようにしています。

{string} Customers={ "Powerplant", "Factory" };

{string} Suppliers={ "BrandA" , "BrandB" };

int demand[Customers] = [ 50,20]; 
int supply[Suppliers]= [60, 10];
 
assert sum(s in Suppliers) supply[s] == sum(c in Customers) demand[c];

このアサーションは、複数の製品に対応するように汎化できます。例えば、以下のコードは、製品ごとに供給総数が需要総数を満たしていることを検証します。

{string} Products={ "Car", "Truck" };

{string} Customers={ "Powerplant", "Factory" };
{string} Suppliers={ "BrandA" , "BrandB" };

int demand[Customers][Products] = [[ 50,20 ] , [ 60,10]]; 
int supply[Suppliers][Products]= [[ 30, 25 ] , [ 80,5]];
 

assert
   forall(p in Products)
      sum(s in Suppliers) supply[s][p] == sum(c in Customers) demand[c][p];