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

5.10.2 自動代入の禁止 lock()/unlock()

lock();
unlock();

 集合の自動代入は集合のデータを明示的に与える必要が省かれ効率的に記述ができますが,一方で誤ったデータを与えた際,集合に予期せぬ変更が加わる場合があります.

 例えば以下のように,モデルにとって悪影響を与える場合があります.

Set S = "1 2 3";
Element i(set = S);
Parameter c(index = i);
c = "[1] 7.2 [2] 8.2 [5] 1.2"; // 誤って添字 5 を与える
// これにより S の内容は "1 2 3 5" となってしまう

Variable x(index = i);

sum(x[i], i) >= 5; // 和の取られる範囲は "1 2 3" ではなく "1 2 5" となる.

 そのような場合に有効なのが集合に対するlock()という操作です.集合に対してlock()を呼び出すと,以降の自動代入による要素の追加を禁じます.

 例えば上記の例でlock()を記述するとlock()以降で集合に要素が追加されるとエラーとなります.

Set S = "1 2 3";
S.lock(); // 集合をロック
Element i(set = S);
Parameter c(index = i);
c = "[1] 7.2 [2] 8.2 [5] 1.2"; // 誤って添字 5 を与える
// ここで S は "1 2 3 5" となってしまうのでエラーとなる

 上記の様にデータのチェックが容易となるため特にモデル開発時に役立ちます.

 操作lock()の逆操作(自動代入を許す)としてunlock()という操作があります.以下利用例です.

Set S = "1 2 3";
S.lock(); // 集合をロック
Element i(set = S);
Parameter c(index = i);
S.unlock();
c = "[1] 7.2 [2] 8.2 [5] 1.2"; // 誤って添字 5 を与える
// ここで S は "1 2 3 5" となってしまうが unlock() により許容される.

 

 

上に戻る