minizinc 中的内积
inner product in minizinc
在两个向量 V1(x11, x12) και V2(x21,x22) 中,我们可以将它们的内积计算为 V1 • V2.= (x11* x21 + x12 * x22 ).
我尝试将最小内积计算为 (x1ix2j|i-j|, i.j V1, V2 处的坐标位置。
每个cooedinate在求和条件中使用一次。
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;
----------
==========
恐怕我不明白你的模型的含义,但它确实包含一些应该很容易修复的约束错误:
- 如果数组由
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
之外,您还期待其他结果吗?
在两个向量 V1(x11, x12) και V2(x21,x22) 中,我们可以将它们的内积计算为 V1 • V2.= (x11* x21 + x12 * x22 ).
我尝试将最小内积计算为 (x1ix2j|i-j|, i.j V1, V2 处的坐标位置。 每个cooedinate在求和条件中使用一次。
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;
----------
==========
恐怕我不明白你的模型的含义,但它确实包含一些应该很容易修复的约束错误:
- 如果数组由
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
之外,您还期待其他结果吗?