【发布时间】:2021-06-17 09:14:20
【问题描述】:
在我的模型中,我有 array[1..num_compute_nodes,1..num_access_nodes,1..num_request] of var 0..10: assignment; 和 array[1..num_compute_nodes,1..num_compute_nodes] of int: compute_nodes_relation。我提到的第一个(决策)变量在运行模型后可能看起来像这样(它是在将值除以 10 之后):
Compute node1:
Access node1: 0.0, 0.0, 0.5, 0.0,
Access node2: 0.0, 0.4, 0.0, 0.0,
Access node3: 0.0, 0.0, 0.0, 0.0,
Compute node2:
Access node1: 0.0, 0.0, 0.5, 0.0,
Access node2: 0.0, 0.5, 0.0, 0.0,
Access node3: 0.0, 0.0, 0.0, 0.0,
Compute node3:
Access node1: 0.0, 0.0, 0.0, 1.0,
Access node2: 0.0, 0.0, 0.0, 0.0,
Access node3: 0.0, 0.1, 0.0, 0.0,
问题:我想计算var float: COST - 如果分配了某些东西,上面列中的总和应该等于 1,如果没有分配 - 0。当总和等于 1 并且列中的值就像0.4 和 0.1,这意味着请求被部分分配给少数节点。我想计算将请求分成几部分的成本。例如 - 对于请求 2(我的意思是在第 2 列中),我在计算节点 1、2、3 上有 0.4、0.5、0.1,所以我需要添加来自 compute_nodes_relation[1,2]、compute_nodes_relation[2,3] 和 compute_nodes_relation[1,3] 的 COST 值。在第 3 列中,我在计算节点 1 和 2 上有 0.5 和 0.5 - 现在我需要从 compute_nodes_relation[1,2] 添加到 COST 值。第 4 列 - 没有分成几部分,所以我什么都不加。
【问题讨论】:
-
迄今为止你做过的最好的尝试是什么?
-
@AmoRobb 我试图做类似
var float: Cost = (sum(m,m_2 in 1..num_compute_nodes, req in 1..num_request where (((assignment[m,request_loc[req],req] + assignment[m_2,request_loc[req],req])=10) /\ assignment[m,request_loc[req],req] != 10 /\ assignment[m_2,request_loc[req],req] !=10 /\ assignment[m,request_loc[req],req] != 0 /\ assignment[m_2,request_loc[req],req] !=0 /\ m != m_2) )(compute_nodes_relation_link[m, m_2]))/2;的事情,但当然它只在请求分为两部分时才有效。
标签: algorithm constraint-programming minizinc