Представление:
У вас есть 24 элемента, я назову эти элементы от A до X (24 первых буквы).
Каждый из этих элементов будет иметь место на одном из 4 графиков. Я назначу число 24 узлам 4 графиков от 1 до 24.
Я буду обозначать позицию A с помощью 24-uple = (xA1, xA2 ..., xA24), и если я хочу назначить A для узла номер 8 для примера, я напишу (xa1, Xa2. .xa24) = (0,0,0,0,0,0,0,1,0,0 ... 0), где 1 находится на позиции 8.
Можно сказать, что A = (xa1, ... xa24)
e1 ... e24 - единичные векторы (от 1,0 ... 0) до (0,0 ... 1)
примечание об операторе '.':
- A.e1 = xa1
- ...
- X.e24 = Xx24
Существуют некоторые ограничения для A, ... X с этими обозначениями:
Xii находится в {0,1}
и
Сумма (Xai) = 1 ... Сумма (Xxi) = 1
Сумма (Xa1, xb1, ... Xx1) = 1 ... Сумма (Xa24, Xb24, ... Xx24) = 1
Поскольку один элемент может быть назначен только одному узлу.
Я определю граф, определив отношение соседей каждого узла, допустим, что у узла 8 есть соседний узел 7 и узел 10
, чтобы проверить, что A и B являются соседями на узле 8 для примера I nedd:
A.e8 = 1 и B.e7 или B.e10 = 1, тогда мне просто нужно A.e8 * (B.e7 + B.e10) == 1
в функции isNeighborInGraphs (A, B) я проверяю это для каждого узла и получаю один или ноль в зависимости от окрестности.
нотации:
- 4 графика из 6 узлов, положение каждого элемента определяется целым числом от 1 до 24.
(От 1 до 6 для первого графика и т. Д.)
- e1 ... e24 - единичные векторы (от 1,0,0 ... 0) до (0,0 ... 1)
- Пусть A, B ... X - N элементов.
A = (0,0 ..., 1, ..., 0) = (xa1, xa2 ... xa24)
B = ...
...
X = (0,0, ..., 1, ..., 0)
IsNeigborInGraphs (A, B) = A.e1 * B.e2 + ...
// если 1 и 2 являются соседями в одном графе
для примера
L (A) = [B, B, C, E, G ...] // список
соседки А (могут повторяться)
actualise(L(A)):
for element in [B,X]
if IsNeigbotInGraphs(A,Element)
L(A).append(Element)
endIf
endfor
N (A) = len (L (A)) + Sum (IsneigborInGraph (A, i), i в L (A))
...
N (X) = ...
Описание алгоритма
- начать с начальной позиции
A = e1 ... X = e24
- Актуализировать L (A), L (B) ... L (X)
- Решите это (с решателем, усиление для
пример будет работать, я думаю, так как это
нелинейная оптимизация
проблема):
Целевая функция
мин (сумма (N (Z), Z = от А до Х)
Ограничения:
Сумма (Xai) = 1 ... Сумма (Xxi) = 1
Сумма (Xa1, xb1, ... Xx1) = 1 ...
Сумма (Xa24, Xb24, ... Xx24) = 1
Вы получите лучшее решение
4. Повторите шаги 2 и 3, еще 3 раза.