通常、モデル、パラメーター、およびコマンドは独立して変化する可能性があるため、それらを分離する必要があります。次に例を示します。
これをモデルファイルのexp.modに入れます
var x1 >= 0;
var x2 >= 0;
param c;
maximize z:
x1 + x2;
s.t.
constraint_1:
x1 + x2 <= c;
パラメータの実際の値を別のデータ ファイルexpamp.datに入れます。
data;
param c := 1;
すべてのコマンドを別のファイルexp.runに入れます
#option solver "enter your solve name here and remove the #";
solve;
display x1, x2;
これは、次のようにコマンド ラインから実行できます (オペレーティング システムと設定によって異なります)。
ampl 試験.mod 試験.dat 試験.実行
これは印刷します
LP_SOLVE 4.0.1.0: optimal, objective 1
1 simplex iterations
x1 = 0
x2 = 1
私のマシンで。
私が間違っていなければ、拡張子 .mod、.dat、および .run は必要ありません。.txt を使用することもできます。
さらに質問がある場合は、AMPL 開発者から直接、無料でダウンロードできる AMPL ブックをお勧めします。
http://www.ampl.com/BOOK/download.html
特に、1.4 AMPL の線形計画法モデル を参照してください。これらは、モデルをデータから分離する方法を示しています。
更新 質問を正しく理解しているかどうか、まだ100%確信が持てません。いくつかのシナリオに応じて、制約を有効/無効にしたいと思います。
以下の例では、単一のモデルがあり、ソルバーに渡される最終モデルに含まれる実際の制約をデータが決定します。この例では、有効にしていますconstraint_a
が除外してconstraint_b
います。それに応じてモデルを作成する必要があるため、モデルを読み書きするのは不快です。
コマンドを使用して、生成されたモデルを調べることができますsolexpand _scon;
。有効にする必要があるその他のオプションも参照してください。
var x1 >= 0;
var x2 >= 0;
param is_a_enabled;
param is_b_enabled;
maximize z:
x1 + x2;
s.t.
constraint_a:
is_a_enabled*(x1+x2-3) <= 0; # x1+x2<=3 if enabled, 0<=0 otherwise
constraint_b:
is_b_enabled*(x1+2*x2-4)<=0; # x1+2*x2<=4 if enabled, 0<=0 otherwise
# you can put everything below into a separate file
data;
param is_a_enabled := 1;
param is_b_enabled := 0;
option presolve 10;
option substout 1;
option show_stats 1;
solve;
print "Constraints finally passed to the solver are:";
solexpand _scon;
print "Solution:";
display x1, x2;
これにより、次の出力が生成されました
Presolve eliminates 1 constraint.
Adjusted problem:
2 variables, all linear
1 constraint, all linear; 2 nonzeros
1 inequality constraint
1 linear objective; 2 nonzeros.
LP_SOLVE 4.0.1.0: optimal, objective 3
1 simplex iterations
Constraints finally passed to the solver are:
subject to constraint_a:
x1 + x2 <= 3;
Solution:
x1 = 0
x2 = 3