В моей модели есть 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 - не делить на части, поэтому ничего не добавляю.
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