Внутренний продукт в миницинке

По двум векторам V1(x11, x12) και V2(x21,x22) мы можем вычислить их внутреннее произведение как V1 • V2.= (X11* x21 + x12 * x22).

Я пытаюсь вычислить минимальное внутреннее произведение как (x1ix2j| ij|, ij места координат в V1, V2. Каждый коудинат используется один раз в условии суммы.

 I TRIED THIS:


   int : vlen;
set of int : LEN  = 1..vlen;
set of int : VECS = 1..2;
array[VECS,LEN] of -25..25 : vector;
var -600..700 : sumTotal;

constraint exists(i,j,k,l in LEN where i!=k \/ j!=l)(
exists(v,v2 in VECS)(sumTotal=(vector[v,i] * vector[v2,j] * abs(i-j)+vector[v,k] * vector[v2,l] * abs(k-l)
)));
solve minimize sumTotal;
output ["vector1=["]++[" \(vector[1,j])"|j in LEN]++[" ];\nvector2=["]++[" \(vector[2,j])"|j in LEN]++[" ];\nsumTotal=\(sumTotal);"]

for
vlen = 2;
vector = [|-2,3|-4,5|];

Я жду:

vector1 = [-2, 3];
vector2 = [-4, 5];
sumTotal = -22;
----------
==========

но я беру:

vector1=[ -2 3 ];
vector2=[ -4 5 ];
sumTotal=-40;
----------
==========

1 ответ

Решение

Боюсь, я не понимаю значения вашей модели, но она содержит некоторые ошибки в ограничении, которые легко исправить:

  • Если массив проиндексирован VEC, LENтогда второй индекс всегда должен быть частью этого набора.
  • sum это его собственная циклическая структура; это не нужно forall выражение.

Результирующее ограничение будет:

constraint sumTotal = sum(i,j in LEN)(
    vector[1,i] * vector[2,j] * abs(i,j)
);

Это все еще оставляет довольно странную модель, поэтому вы можете взглянуть на следующее:

  • sumTotal ваша единственная переменная, но она определяется параметрами. Он не может быть оптимизирован, так как имеет только 1 решение.
  • Должен i а также j быть в состоянии принять то же значение? Если нет, то вы должны использовать i,j in LEN where i < j,
  • Ожидаете ли вы каких-либо результатов, кроме sumTotal?
Другие вопросы по тегам