Kernel: Python 3 (ipykernel)
In [67]:
Постановка задачи:
Задан граф G=(V,E).
Найти клику в G, т.е. подмножество вершин V'⊆V, такое что любая пара вершин в V' соединены ребром из E.
Максимизировать размер клики, т.е. |V'|.
In [68]:
In [69]:
Реализация в Pyomo:
In [70]:
In [71]:
In [72]:
# ==========================================================
# = Solver Results =
# ==========================================================
# ----------------------------------------------------------
# Problem Information
# ----------------------------------------------------------
Problem:
- Name: unknown
Lower bound: 5.0
Upper bound: 5.0
Number of objectives: 1
Number of constraints: 13
Number of variables: 10
Number of binary variables: 10
Number of integer variables: 10
Number of nonzeros: 10
Sense: maximize
# ----------------------------------------------------------
# Solver Information
# ----------------------------------------------------------
Solver:
- Status: ok
User time: -1.0
System time: 0.0
Wallclock time: 0.01
Termination condition: optimal
Termination message: Model was solved to optimality (subject to tolerances), and an optimal solution is available.
Statistics:
Branch and bound:
Number of bounded subproblems: 0
Number of created subproblems: 0
Black box:
Number of iterations: 0
Error rc: 0
Time: 0.05103349685668945
# ----------------------------------------------------------
# Solution Information
# ----------------------------------------------------------
Solution:
- number of solutions: 0
number of solutions displayed: 0
x[0] 0.0
x[1] 1.0
x[2] 0.0
x[3] 0.0
x[4] 1.0
x[5] 0.0
x[6] 1.0
x[7] 0.0
x[8] 1.0
x[9] 1.0
In [73]:
Сведение 3-SAT к задаче:
Пусть дана формула из трехбуквенных выражений.
In [74]:
[(2, 1, 3), (-1, 2, -3), (2, -1, 3), (2, -1, 3), (3, -1, 2)]
Построим граф из кластеров с не более чем вершинами в каждом кластере.
Каждый кластер соответствует скобке в формуле .
Ребро ставится между всеми парами вершин в разных кластерах, кроме пар вида .
Рёбер между вершинами из одного кластера в графе нет.
Тогда граф содержит клику размера не менее тогда и только тогда, когда формула разрешима.
In [75]:
In [76]:
In [77]:
In [78]:
In [79]:
True
In [80]:
In [81]:
True
In [82]:
Генерация тестов:
In [83]:
In [86]:
In [87]:
23 8 True True
15 5 True True
24 9 True True
24 8 True True
15 5 True True
12 4 True True
15 5 True True
24 8 True True
9 3 True True
20 8 True True
28 10 True True
20 7 True True
9 3 True True
6 2 True True
26 9 True True
27 9 True True
9 3 True True
16 7 True True
17 6 True True
12 4 True True
9 3 True True
12 4 True True
12 4 True True
28 10 True True
12 6 True True
18 7 True True
3 1 True True
29 10 True True
28 10 True True
21 7 True True
2 9 False False
2 10 False False
1 3 False False
1 10 False False
2 5 False False
1 7 False False
2 8 False False
2 8 False False
2 10 False False
1 5 False False
1 8 False False
2 10 False False
1 7 False False
1 10 False False
1 9 False False
2 6 False False
1 3 False False
2 8 False False
2 10 False False
1 9 False False
2 8 False False
2 9 False False
1 2 False False
1 4 False False
1 10 False False
1 10 False False
2 6 False False
2 7 False False
1 10 False False
2 8 False False
OK