1

AMPL で小さな問題を解決していて、小さな問題に直面しました。私は 4 セットABC、およびD dimen 3と 1 つの変数x{A,B} binaryおよびy{B,C} binaryを持っています。

Dのサブセットの要素はすべてAからのものです。

A の各要素には、 Bからの要素を割り当てる必要があります。【この部分はできています】

Bの割り当てられた値からのすべての要素には、Cからの要素を割り当てる必要があります。【ここが問題】

このため、AからBに要素をマップする新しい変数map{A}を定義する必要がありました(これは、x[a,b] = 1 の場合、map[a] = b を意味します)。

私はこのようなものを書きたい: y[ map[a],c]where {a in A, c in C} A の a の B のマップされた b を意味する cplexは私にエラーを与える."continuous variable in index expression"

とにかくそうすることがありますか?前もって感謝します。あなたの助けに感謝します。

さらなる説明:

次のコードを想定します。

set A;
set B;
set C;
set D dimen 3; #elements are from A

var x{A,B} binary;
var y{B,C} binary;
var map{A};

forall{a in A} sum {b in B} x[a,b] = 1; #every element from A must have a mapping to B
forall{b in B} sum {c in C} y[b,c] <= 1; #for each element from B, there can be max of 1 mapping to C

subject to mapAtoB{a in A, b in B}: x[a,b] = 1 ==> map[a] = b;
subject to constr{ (i,j,k) in D, c in C }: y[ map[i],c ] + y[ map[j],c ] + y[ map[k],c] = 2; #here is the problem .. I want to be able to say map[i] which is supposed to be equal to some element in B which was assigned to A

data;
set A:= 1 2 3 4;
set B:= a b c;
set C:= i ii iii;
set D: 1 2 3:= (1,2,3) (1,2,4);
4

1 に答える 1

1

変数を変数でインデックス付けしようとしています。これは、より制約プログラミングのスタイルです。B の要素が A の要素に割り当てられたかどうかを示す変数を追加することで、AMPL と cplex で試していることを実行できます。

var active{B} binary;
forall {A in A} sum {b in B} x[a,b] = 1
forall {b in B, a in A} x[a,b] <= active[b]
forall {b in B} sum {c in C} y[b,c] = active[b]

したがって、 A の要素が に割り当てられていないb場合、bは C の要素に割り当てられません。

于 2014-08-08T15:22:15.150 に答える