У меня есть некоторый код на Python для вычисления максимальной полной сетки в графе.Каждый узел графа может иметь различный вес (веса каждого узла задаются массивом).Я хочу получить максимальный размер взвешенной клики на графике, учитывая ребра, которых нет.Для этого я написал некоторый код на Python, который работает следующим образом:
- Я начну с полностью связного графа, в котором присутствуют все ребра.
- Если ребро сломано в полностьюсвязного графа, он разбит его на два полностью связанных графа (метод split_full_meshes ниже).
- Наконец, я суммирую веса по всем возможным кликам и получаю клику с максимальным весом.
Код приведен ниже (maximal_full_mesh вычисляет максимальную взвешенную клику, а split_full_meshes - помощник для разделения кликов).Проблема в том, что это мучительно медленно.Я должен быть в состоянии запустить это в цикле из 2 миллионов (все возможные графики с семью узлами), но это займет целых 10 минут.Я ищу предложения о том, как я могу сделать это быстрее.
def split_full_meshes(meshes=[[0,1,2],[0,1,3]], broken_edge=[0,1]):
"""
A full mesh is defined as a series of nodes that
are all interconnected with each other. When we break an edge,
any full-mesh that has both nodes corresponding to that edge will be
broken up
into two smaller full-meshes.
args:
meshes: A jagged array, each entry is an array of indices of nodes
that are full-mesh connected.
broken_edge: The edge that was not earlier broken but is now going
to be broken.
"""
nu_meshes = []
for mesh in meshes:
if broken_edge[0] in mesh and broken_edge[1] in mesh:
for node in broken_edge:
nu_meshes.append([i for i in mesh if i!= node])
else:
nu_meshes.append(np.copy(mesh))
return nu_meshes
def maximal_full_mesh(a=np.array([2,2,3,4]), \
broken_edges=np.array([[0,1],[2,3]])):
"""
The largest weighted full-mesh available in the graph.
(set of nodes with perfect interconnectivity with each other).
args:
a: The weights of each node in the graph.
broken_edges: The edges between nodes that are broken.
"""
meshes = [np.arange(len(a))]
for ed in broken_edges:
meshes_tmp = np.copy(meshes)
meshes = split_full_meshes(meshes_tmp, ed)
max_mesh = 0
for mesh in meshes:
max_mesh = max(max_mesh, sum(a[np.array(mesh)]))
return max_mesh