Minizinc模型中如何基于节点关系计算请求拆分产生的COST成本
MiniZinc COST计算逻辑实现
核心实现思路
你需要先计算每个计算节点对应单个请求的总分配量,再对每个请求遍历所有两两计算节点组合,只要两个节点都分配了当前请求,就累加对应compute_nodes_relation的值到总成本中。
完整代码实现
版本1:浮点版(和你的业务逻辑完全对齐)
% 辅助变量:计算每个计算节点c 对请求r的总分配占比 array[1..num_compute_nodes, 1..num_request] of var float: node_request_alloc = array2d(1..num_compute_nodes, 1..num_request, [sum(assignment[c,a,r] | a in 1..num_access_nodes) / 10.0 | c in 1..num_compute_nodes, r in 1..num_request]); % COST计算逻辑 var float: COST = sum( r in 1..num_request, c1 in 1..num_compute_nodes, c2 in c1+1..num_compute_nodes ) ( % 只要两个计算节点都分配了当前请求,就累加对应关系值 if node_request_alloc[c1,r] > 0.0 /\ node_request_alloc[c2,r] > 0.0 then compute_nodes_relation[c1, c2] else 0.0 endif );
版本2:整数优化版(避免浮点精度误差,性能更高)
可以直接用原始assignment的整数值做判断,无需提前做除法:
% 辅助变量:计算每个计算节点c 对请求r的总分配整数和 array[1..num_compute_nodes, 1..num_request] of var int: node_request_alloc_int = array2d(1..num_compute_nodes, 1..num_request, [sum(assignment[c,a,r] | a in 1..num_access_nodes) | c in 1..num_compute_nodes, r in 1..num_request]); % COST计算逻辑 var float: COST = sum( r in 1..num_request, c1 in 1..num_compute_nodes, c2 in c1+1..num_compute_nodes ) ( if node_request_alloc_int[c1,r] > 0 /\ node_request_alloc_int[c2,r] > 0 then compute_nodes_relation[c1, c2] else 0.0 endif );
效果验证(和你给出的示例完全匹配)
- 请求2:计算节点1、2、3都有分配,所以
compute_nodes_relation[1,2]、compute_nodes_relation[1,3]、compute_nodes_relation[2,3]都会被累加 - 请求3:只有计算节点1、2有分配,仅累加
compute_nodes_relation[1,2] - 请求4:只有计算节点3有分配,没有符合条件的两两组合,不计入成本
内容的提问来源于stack exchange,提问作者badej60
相关产品推荐
相关产品推荐

