2

行列の値を識別するために変数を使用する必要があります。私がやりたかったのは、次のような変数を定義することです:

var a in A; # to say that the variable takes value from index A

そして、私はそれを次のようなものとして使いたかった:

M1[a] >= 10;
M2[a] <= 100;

ただし、AMPL は次のように不満を述べています。

インデックス式の変数

変数を使用して、配列または行列の要素を指すにはどうすればよいですか? ありがとう

4

1 に答える 1

3

AMPL では、添字に変数を使用することはまだ許可されていません。ただし、それらをエミュレートする方法があります。たとえば、M1[a] >= 10次のようにエミュレートできます。

   s.t. c: exists{i in A} (M1[i] >= 10 and i = a);

これはあまり効率的ではありませんが、小さな問題では問題なく機能するはずです。上記の制約 (または追加された添字内の変数) を含む問題を解決するには、ilogcpgecodeなどの制約プログラミング ソルバーが必要であることに注意してください。詳細については、ロジックおよび制約プログラミングの拡張機能を参照してください。

AMPL 用の ilogcp ドライバーの新しいバージョンでは、次のelementような制約がサポートされています。

include cp.ampl;
var x{i in 0..2} >= i integer;
var y in 0..2 integer;
minimize o: element({i in 0..2} x[i], y);
option solver ilogcp;
solve;

whereelement({i in 0..2} x[i], y)は と同等であり、制約x[y]に変換されます。IloElement

于 2013-07-26T18:06:46.613 に答える