【问题标题】:Minizinc - calculate Cost in algorithmMinizinc - 在算法中计算成本
【发布时间】: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


【解决方案1】:

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,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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多