Minizinc - 在算法中计算成本

问题描述

在我的模型中,我有 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,Access node2: 0.0,0.4,Access node3: 0.0,Compute node2: 
Access node1: 0.0,Compute node3: 
Access node1: 0.0,1.0,0.1,

问题:我想计算 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] 和 { {1}}。在第 3 列中,我在计算节点 1 和 2 上有 0.5 和 0.5 - 现在我需要从 compute_nodes_relation[1,3] 添加到 COST 值。第 4 列 - 没有分成几部分,所以我什么都不添加

解决方法

var float: transmission_cost_compute_nodes = sum( req in 1..num_request)(sum(m,m_2 in 1..num_compute_nodes where ((sum(m in 1.. num_compute_nodes)(assignment[m,request_loc[req],req])=10) /\ (sum(m_2 in 1.. num_compute_nodes)(assignment[m_2,req])=10) /\ (assignment[m,req] != 10) /\ (assignment[m_2,req] !=10) /\ (assignment[m,req] != 0) /\ (assignment[m_2,req] !=0) /\ (m != m_2)))(compute_nodes_relation_link[m,m_2]))/2;

我认为这就是我的问题的答案。