Непрерывная переменная AMPL в индексном выражении

Я решаю небольшую проблему в AMPL и столкнулся с небольшой проблемой. У меня есть 4 набора A, B, C и D размер 3 и 1 переменная x { A, B} двоичный и y {B, C} двоичный.

Все элементы подмножеств D взяты из A.

Каждому элементу A ДОЛЖЕН быть назначен элемент из B. [эта часть сделана]

Каждому элементу из присвоенных значений B ДОЛЖЕН быть назначен элемент из C. [Вот в чем проблема]

По этой причине мне пришлось определить новую переменную map {A}, которая отображает элементы из A в B (это означает, что если x [ a, b] = 1, тогда map [a] = b).

Я хочу написать что-то вроде этого: y[ map[a],c] где {a в A, c в C}, что означает, что b отображается в B из a в A, но 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);

person user3787524    schedule 08.08.2014    source источник


Ответы (1)


Вы пытаетесь проиндексировать переменную с помощью переменной. Это больше стиль программирования с ограничениями. Вы можете делать то, что пытаетесь в AMPL и cplex, добавляя переменные, которые указывают, был ли элемент B присвоен элемент A.

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.

person David Nehme    schedule 08.08.2014
comment
спасибо, сэр, за быстрый ответ, но я не думаю, что это сработает. Я редактировал вопрос, можете проверить? Спасибо - person user3787524; 08.08.2014
comment
Поскольку, сэр, как я сказал в своем вопросе, я хочу адресовать b из a, используя подмножества D subject to constr{ (i,j,k) in D, c in C }: y[ map[i],c ] + y[ map[j],c ] + y[ map[k],c] = 2; по-вашему, я не могу выполнить это добавление, так как я не знаю, какое b было назначено a. Ваш путь покажет, какой b был использован, но не кому он был назначен. Спасибо - person user3787524; 08.08.2014
comment
В вашем вопросе вы ничего не говорите о «D», кроме того, что все элементы подмножеств D взяты из A. Конкретный вопрос, который вы задали, был: «Каждому элементу из присвоенных значений B ДОЛЖЕН быть назначен элемент из C. [ Вот в чем проблема] ». Ответ, который я дал, решает эту проблему. - person David Nehme; 08.08.2014
comment
Мне жаль, что я плохо. То, что вы предложили, я уже сделал. У вас есть ответ на мои правки? - person user3787524; 08.08.2014