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, 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) у меня 0,4, 0,5, 0,1 на вычислительных узлах 1,2,3, поэтому мне нужно добавить к COST значения из _5 _, _ 6_ и compute_nodes_relation[1,3]. В столбце 3 у меня есть 0,5 и 0,5 на вычислительном узле 1 и 2 - теперь мне нужно добавить значение COST из compute_nodes_relation[1,2]. Колонка 4 - не делить на части, поэтому ничего не добавляю.


person badej60    schedule 17.06.2021    source источник
comment
Какая у вас лучшая попытка?   -  person Amo Robb    schedule 17.06.2021
comment
@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;, но, конечно, это работает только тогда, когда запрос разделен на 2 части.   -  person badej60    schedule 17.06.2021


Ответы (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;

Думаю, это ответ на мой вопрос.

person badej60    schedule 17.06.2021