Frank Vega
Information Physics Institute, 840 W 67th St, Hialeah, FL 33012, USA
[email protected]

Introduction to the Minimum Dominating Set Problem

The Minimum Dominating Set (MDS) problem is a classic challenge in graph theory and computer science. Given an undirected graph G=(V,E)G = (V, E) , the goal is to find a subset of vertices SVS \subseteq V of minimum size such that every vertex in VV is either in SS or adjacent to at least one vertex in SS . This subset SS is called a dominating set, and the MDS seeks the smallest possible such set.

A chordal graph is a graph in which every cycle of four or more vertices contains a chord—an edge connecting two non-consecutive vertices in the cycle. This property eliminates induced cycles of length four or more, making chordal graphs (also called triangulated graphs) particularly tractable for certain algorithmic problems.

This Markdown document provides a detailed overview of two algorithms for computing dominating sets in undirected graphs: one tailored for chordal graphs (approximate_dominating_set_chordal) and another for general graphs (find_dominating_set). For each algorithm, we include a description, implementation code, proof of correctness, a 2-approximation ratio proof, runtime analysis, and the broader impact of these results.


1. Algorithm for Chordal Graphs: approximate_dominating_set_chordal

Description

The approximate_dominating_set_chordal algorithm computes a dominating set for a chordal graph by utilizing its perfect elimination ordering (PEO). A chordal graph is one where every cycle of length greater than 3 has a chord (an edge connecting non-adjacent vertices in the cycle). The algorithm processes vertices in reverse PEO, greedily selecting vertices that maximize the coverage of undominated nodes in the graph.

Code

import networkx as nx

def approximate_dominating_set_chordal(G):
    """
    Computes a 2-approximation dominating set for a chordal graph G.

    Args:
        G (nx.Graph): A chordal graph.

    Returns:
        set: A dominating set for G.
    """
    if not nx.is_chordal(G):
        raise ValueError("Input graph is not chordal")

    # Get the perfect elimination ordering (PEO)
    _, peo = nx.chordal_graph_cliques(G)
    reverse_peo = list(reversed(peo))

    dominating_set = set()
    dominated = {v: False for v in G.nodes()}

    for v in reverse_peo:
        if not dominated[v]:
            # Find the vertex in N[v] that dominates the most undominated vertices
            best_vertex = v
            best_undominated_count = -1
            for neighbor in list(G.neighbors(v)) + [v]:
                undominated_neighbors_count = 0
                for u in list(G.neighbors(neighbor)) + [neighbor]:
                    if not dominated[u]:
                        undominated_neighbors_count += 1
                if undominated_neighbors_count > best_undominated_count:
                    best_undominated_count = undominated_neighbors_count
                    best_vertex = neighbor
            # Add the best vertex to the dominating set
            dominating_set.add(best_vertex)
            # Mark it and its neighbors as dominated
            dominated[best_vertex] = True
            for neighbor in G.neighbors(best_vertex):
                dominated[neighbor] = True

    return dominating_set

Correctness

The algorithm guarantees a valid dominating set:

  • Dominating Set Property: For every vertex vv , if it is not yet dominated, the algorithm selects a vertex ww from N[v]N[v] (the closed neighborhood of vv , i.e., vv and its neighbors) to include in the dominating set. This ensures vv is either in the dominating set or adjacent to a vertex in it.
  • Chordal Property Utilization: The reverse PEO ensures that when processing a vertex vv , its neighbors in the subgraph induced by the remaining vertices form a clique. This property simplifies the greedy selection process, ensuring coverage without missing vertices.

Proof of 2-Approximation

The algorithm achieves a 2-approximation, meaning the size of the dominating set D|D| is at most twice the size of an optimal dominating set OPT|OPT| :

  • Greedy Choice: When a vertex vv is undominated, the algorithm picks a vertex wN[v]w \in N[v] that maximizes the number of newly dominated vertices.
  • Charging Argument: For each ww added to DD , associate it with a vertex uOPTu \in OPT that dominates the triggering vertex vv . Since OPTOPT is a dominating set, such a uu exists in N[v]N[v] . The greedy choice ensures ww covers at least as many undominated vertices as uu could at that step.
  • Disjoint Coverage: The sets of newly dominated vertices by each ww are disjoint, and each uOPTu \in OPT can be charged at most twice due to the structure of the graph and the greedy selection.
  • Conclusion: Thus, D2OPT|D| \leq 2 \cdot |OPT| .

Running Time

  • PEO Computation: Using NetworkX, computing the PEO takes O(n+m)O(n + m) , where nn is the number of vertices and mm is the number of edges.
  • Main Loop: For each of the nn vertices, if undominated, the algorithm evaluates each wN[v]w \in N[v] , counting undominated neighbors. This takes O(wN[v]dw)O(\sum_{w \in N[v]} d_w) per vertex vv , where dwd_w is the degree of ww . Over all selections, this sums to O(nm)O(nm) in the worst case (e.g., a dense graph).
  • Total Complexity: O(n+m)+O(nm)=O(nm)O(n + m) + O(nm) = O(nm) .

2. Algorithm for General Graphs: find_dominating_set

Description

The find_dominating_set algorithm extends the chordal graph approach to general undirected graphs. It processes each connected component separately, transforming it into a chordal graph, applies the chordal algorithm, and maps the result back to the original graph to form a dominating set.

Code

import networkx as nx

def find_dominating_set(graph):
    """
    Computes a 2-approximation dominating set for a general undirected graph.

    Args:
        graph (nx.Graph): An undirected graph.

    Returns:
        set: A dominating set for the graph.
    """
    if not isinstance(graph, nx.Graph):
        raise ValueError("Input must be an undirected NetworkX Graph.")

    if graph.number_of_nodes() == 0 or graph.number_of_edges() == 0:
        return set()

    # Handle isolated nodes
    optimal_dominating_set = set(nx.isolates(graph))
    graph.remove_nodes_from(optimal_dominating_set)

    if graph.number_of_nodes() == 0:
        return optimal_dominating_set

    for component in nx.connected_components(graph):
        subgraph = graph.subgraph(component)
        chordal_graph = nx.Graph()

        # Transform to chordal graph
        for i in subgraph.nodes():
            chordal_graph.add_edge((i, 0), (i, 1))
            for j in subgraph.neighbors(i):
                chordal_graph.add_edge((i, 0), (j, 1))

        # Add clique edges among (i, 0) nodes
        for i in subgraph.nodes():
            for j in subgraph.nodes():
                if i < j:
                    chordal_graph.add_edge((i, 0), (j, 0))

        # Compute dominating set in chordal graph
        tuple_nodes = approximate_dominating_set_chordal(chordal_graph)

        # Map back to original nodes
        optimal_dominating_set.update({tuple_node[0] for tuple_node in tuple_nodes})

    return optimal_dominating_set

Correctness

The algorithm ensures a valid dominating set for any undirected graph:

  • Isolated Nodes: These are trivially added to the dominating set, as each requires its own vertex.
  • Transformation: For each connected component, the algorithm constructs a chordal graph where each original vertex ii is split into (i,0)(i, 0) and (i,1)(i, 1) , with edges reflecting the original adjacencies and a clique among all (i,0)(i, 0) nodes.
  • Dominating Property: The dominating set in the chordal graph, when mapped back by taking the first coordinate (i.e., ii from (i,k)(i, k) ), ensures every original vertex is either in the set or adjacent to a vertex in it, due to the edge structure.

Proof of 2-Approximation

The algorithm provides a 2-approximation for general graphs:

  • Chordal Approximation: The approximate_dominating_set_chordal function yields a dominating set DchordalD_{\text{chordal}} for the transformed chordal graph, where Dchordal2OPTchordal|D_{\text{chordal}}| \leq 2 \cdot |OPT_{\text{chordal}}| , with OPTchordalOPT_{\text{chordal}} being the optimal dominating set size in the chordal graph.
  • Mapping: The final set S={i(i,k)Dchordal}S = \{ i \mid (i, k) \in D_{\text{chordal}} \} satisfies SDchordal|S| \leq |D_{\text{chordal}}| , as multiple tuples (i,k)(i, k) map to the same ii .
  • Optimal Relation: The optimal dominating set in the original graph OPTOPT can be transformed into a dominating set in the chordal graph (e.g., {(i,0)iOPT}\{ (i, 0) \mid i \in OPT \} ), so OPTchordalOPT|OPT_{\text{chordal}}| \leq |OPT| .
  • Conclusion: Combining these, SDchordal2OPTchordal2OPT|S| \leq |D_{\text{chordal}}| \leq 2 \cdot |OPT_{\text{chordal}}| \leq 2 \cdot |OPT| .

Running Time

  • Preprocessing: Identifying isolates and connected components takes O(n+m)O(n + m) .
  • Per Component (with nin_i nodes in component ii ):
    • Transformation: Adding clique edges among (i,0)(i, 0) nodes takes O(ni2)O(n_i^2) . The chordal graph has 2ni2n_i vertices and O(ni2)O(n_i^2) edges.
    • Chordal Algorithm: Running approximate_dominating_set_chordal takes O((2ni)(ni2))=O(ni3)O((2n_i) \cdot (n_i^2)) = O(n_i^3) , as the number of edges is O(ni2)O(n_i^2) .
  • Total:
    • Summing over all components, the worst case is a single component with nn nodes, yielding O(n3)O(n^3) .

Illustrative examples

The find_dominating_set algorithm is a general method for finding a dominating set in any graph. It works by transforming the original graph into a chordal graph, applying an approximate dominating set algorithm designed for chordal graphs (approximate_dominating_set_chordal), and then mapping the result back to the original graph. A key feature of the transformation is that for every edge (i,j)(i, j) in the original graph, the chordal graph includes the edges (i,0)(j,1)(i, 0)-(j, 1) and (j,0)(i,1)(j, 0)-(i, 1) , along with additional edges to ensure chordality.

Below, we illustrate this process with examples on three different types of graphs: a path graph ( P3P_3 ), a cycle graph ( C4C_4 ), and a complete graph ( K3K_3 ). These examples show how the algorithm behaves across various graph structures.

Example 1: Path Graph P3P_3

  • Original Graph:
    • Vertices: V={1,2,3}V = \{1, 2, 3\}
    • Edges: E={(1,2),(2,3)}E = \{(1, 2), (2, 3)\}
  • Description: A simple path with three vertices, which is already chordal (contains no induced cycles of length 4 or more).

Step 1: Transformation to Chordal Graph

  • Nodes: Each vertex ii is split into two nodes: (i,0)(i, 0) and (i,1)(i, 1) . Thus, the node set is:
    • (1,0),(1,1),(2,0),(2,1),(3,0),(3,1)(1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1)
  • Edges:
    • Connect each pair: (1,0)(1,1)(1, 0)-(1, 1) , (2,0)(2,1)(2, 0)-(2, 1) , (3,0)(3,1)(3, 0)-(3, 1)
    • For edge (1,2)(1, 2) : Add (1,0)(2,1)(1, 0)-(2, 1) and (2,0)(1,1)(2, 0)-(1, 1)
    • For edge (2,3)(2, 3) : Add (2,0)(3,1)(2, 0)-(3, 1) and (3,0)(2,1)(3, 0)-(2, 1)
    • Add a clique on all (i,0)(i, 0) nodes: (1,0)(2,0)(1, 0)-(2, 0) , (1,0)(3,0)(1, 0)-(3, 0) , (2,0)(3,0)(2, 0)-(3, 0)

Step 2: Applying the Chordal Algorithm

  • The approximate_dominating_set_chordal algorithm selects a set of nodes in the chordal graph. For example:
    • Select (2,0)(2, 0) , which dominates:
    • (2,0)(2, 0) itself
    • (1,0),(3,0)(1, 0), (3, 0) (via the clique)
    • (2,1)(2, 1) (via (2,0)(2,1)(2, 0)-(2, 1) )
    • (1,1)(1, 1) (via (2,0)(1,1)(2, 0)-(1, 1) )
    • (3,1)(3, 1) (via (2,0)(3,1)(2, 0)-(3, 1) )
    • This single node may suffice to dominate the entire chordal graph, depending on the algorithm’s specifics.

Step 3: Mapping Back

  • From (2,0)(2, 0) , take the original vertex 22 .
  • Dominating Set: {2}\{2\}
  • Verification: In P3P_3 , vertex 22 is adjacent to 11 and 33 , thus dominating all vertices ( 1,2,31, 2, 3 ).

Result

  • Dominating Set: {2}\{2\}
  • Size: 1, which is optimal for P3P_3 .

Example 2: Cycle Graph C4C_4

  • Original Graph:
    • Vertices: V={1,2,3,4}V = \{1, 2, 3, 4\}
    • Edges: E={(1,2),(2,3),(3,4),(4,1)}E = \{(1, 2), (2, 3), (3, 4), (4, 1)\}
  • Description: A cycle with four vertices, which is not chordal due to the 4-cycle.

Step 1: Transformation to Chordal Graph

  • Nodes:
    • (1,0),(1,1),(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)(1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1), (4, 0), (4, 1)
  • Edges:
    • Connect each pair: (i,0)(i,1)(i, 0)-(i, 1) for i=1,2,3,4i = 1, 2, 3, 4
    • For (1,2)(1, 2) : (1,0)(2,1)(1, 0)-(2, 1) , (2,0)(1,1)(2, 0)-(1, 1)
    • For (2,3)(2, 3) : (2,0)(3,1)(2, 0)-(3, 1) , (3,0)(2,1)(3, 0)-(2, 1)
    • For (3,4)(3, 4) : (3,0)(4,1)(3, 0)-(4, 1) , (4,0)(3,1)(4, 0)-(3, 1)
    • For (4,1)(4, 1) : (4,0)(1,1)(4, 0)-(1, 1) , (1,0)(4,1)(1, 0)-(4, 1)
    • Clique on (1,0),(2,0),(3,0),(4,0)(1, 0), (2, 0), (3, 0), (4, 0) : All pairwise edges.

Step 2: Applying the Chordal Algorithm

  • The algorithm might select:
    • (1,0)(1, 0) , dominating (1,0),(2,0),(3,0),(4,0),(1,1),(4,1)(1, 0), (2, 0), (3, 0), (4, 0), (1, 1), (4, 1)
    • (3,1)(3, 1) , dominating (3,1),(3,0),(2,0),(4,0)(3, 1), (3, 0), (2, 0), (4, 0) (some overlap), and (2,1)(2, 1)
  • However, a minimal set like (1,0),(3,1)(1, 0), (3, 1) could cover all nodes efficiently.
  • Mapping Back: {1,3}\{1, 3\}

Step 3: Verification

  • In C4C_4 :
    • 11 dominates 1,2,41, 2, 4
    • 33 dominates 2,3,42, 3, 4
    • Together, {1,3}\{1, 3\} dominates 1,2,3,41, 2, 3, 4 .

Result

  • Dominating Set: {1,3}\{1, 3\}
  • Size: 2, which is optimal for C4C_4 (minimum dominating set size is 2).

Example 3: Complete Graph K3K_3

  • Original Graph:
    • Vertices: V={1,2,3}V = \{1, 2, 3\}
    • Edges: E={(1,2),(1,3),(2,3)}E = \{(1, 2), (1, 3), (2, 3)\}
  • Description: A triangle, which is chordal.

Step 1: Transformation to Chordal Graph

  • Nodes:
    • (1,0),(1,1),(2,0),(2,1),(3,0),(3,1)(1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1)
  • Edges:
    • (i,0)(i,1)(i, 0)-(i, 1) for i=1,2,3i = 1, 2, 3
    • For (1,2)(1, 2) : (1,0)(2,1)(1, 0)-(2, 1) , (2,0)(1,1)(2, 0)-(1, 1)
    • For (1,3)(1, 3) : (1,0)(3,1)(1, 0)-(3, 1) , (3,0)(1,1)(3, 0)-(1, 1)
    • For (2,3)(2, 3) : (2,0)(3,1)(2, 0)-(3, 1) , (3,0)(2,1)(3, 0)-(2, 1)
    • Clique on (1,0),(2,0),(3,0)(1, 0), (2, 0), (3, 0)

Step 2: Applying the Chordal Algorithm

  • Select (1,0)(1, 0) , which dominates:
    • (1,0),(2,0),(3,0)(1, 0), (2, 0), (3, 0) (via the clique)
    • (1,1)(1, 1) (via (1,0)(1,1)(1, 0)-(1, 1) )
    • (2,1),(3,1)(2, 1), (3, 1) (via (1,0)(2,1)(1, 0)-(2, 1) , (1,0)(3,1)(1, 0)-(3, 1) )
  • This covers all nodes.

Step 3: Mapping Back

  • From (1,0)(1, 0) , take vertex 11 .
  • Dominating Set: {1}\{1\}
  • Verification: In K3K_3 , vertex 11 is adjacent to 22 and 33 , dominating all vertices.

Result

  • Dominating Set: {1}\{1\}
  • Size: 1, which is optimal for K3K_3 .

Summary

These examples show how the find_dominating_set algorithm handles different graph types:

  • Path Graph P3P_3 : Produces a size-1 dominating set.
  • Cycle Graph C4C_4 : Produces a size-2 dominating set.
  • Complete Graph K3K_3 : Produces a size-1 dominating set.

In each case, the transformation respects the edge rule (e.g., (i,j)(i, j) becomes (i,0)(j,1)(i, 0)-(j, 1) and (j,0)(i,1)(j, 0)-(i, 1) ), and the resulting dominating sets are valid and often optimal, demonstrating the algorithm’s effectiveness.


Research Data

A Python implementation, named Capablanca: 2-Approximation Dominating Set Solver (in homage to the legendary World Chess Champion Jose Raul Capablanca), has been developed to solve the Approximate Dominating Set Problem. This implementation is publicly accessible through the Python Package Index (PyPI): https://pypi.org/project/capablanca/. By constructing an approximate solution, the algorithm guarantees an approximation ratio of at most 2 for the Dominating Set Problem.

Table: Code Metadata

Nr. Code metadata description Metadata
C1 Current code version v3.1
C2 Permanent link to code/repository GitHub
C3 Permanent link to Reproducible Capsule PyPI
C4 Legal Code License MIT License
C5 Code versioning system used git
C6 Software code languages, tools, and services used python
C7 Compilation requirements, operating environments & dependencies Python ≥ 3.10

Experimental Results

Methodology and Experimental Setup

In this section, we describe the methodology and experimental framework used to evaluate the performance of our proposed algorithm. To ensure a rigorous assessment, we employ the Medium-Scale Instances from the BHOSLIB benchmark suite The Network Data Repository with Interactive Graph Analytics and Visualization, which are well-established for their computational complexity and hardness.

All experiments were executed on a system with the following specifications:

  • Processor: 11th Gen Intel® Core™ i7-1165G7 (2.80 GHz)
  • Memory: 32 GB RAM
  • OS: Windows 10

We implemented our algorithm using Capablanca: 2-Approximation Dominating Set Solver (v3.1) https://pypi.org/project/capablanca/. For comparison, we used NetworkX's weighted dominating set approximation algorithm Vazirani, Vijay V. 2001. Approximation Algorithms. Vol. 1. Berlin: Springer. doi: 10.1007/978-3-662-04565-7, which guarantees a solution within a logarithmic approximation ratio.

Performance Metrics

To assess our algorithm's effectiveness, we measure the following:

  1. Runtime (seconds): The total computation time required to derive the vertex dominating set.
  2. Approximation Ratio: We define an upper bound for the approximation quality as:
    logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W}

    where:

    • OPTOPT = Optimal dominating set size (unknown, used for theoretical comparison).
    • OPTCOPT_C = Dominating set size obtained by our algorithm (Capablanca).
    • OPTWOPT_W = Dominating set size generated by NetworkX.

Since NetworkX guarantees OPTWlogVOPTOPT_W \leq \log |V| \cdot OPT and our algorithm ensures OPTC2OPTOPT_C \leq 2 \cdot OPT , a value close to 2 indicates near-optimal performance.

The experimental results are presented in Table 1.

Performance Data for Dominating Set Algorithms

Below is the performance data for various instances, comparing our algorithm (Capablanca) and NetworkX:


  • frb30-15-1.clq

    • OPTC|OPT_C| (runtime): 2 (172.601 s)
    • OPTW|OPT_W| (runtime): 13 (0.03923 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 0.939885
  • frb30-15-2.clq

    • OPTC|OPT_C| (runtime): 2 (175.144 s)
    • OPTW|OPT_W| (runtime): 3 (0.02109 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 4.072832
  • frb30-15-3.clq

    • OPTC|OPT_C| (runtime): 2 (172.829 s)
    • OPTW|OPT_W| (runtime): 4 (0.02107 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 3.054624
  • frb30-15-4.clq

    • OPTC|OPT_C| (runtime): 2 (172.797 s)
    • OPTW|OPT_W| (runtime): 13 (0.04226 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 0.939885
  • frb30-15-5.clq

    • OPTC|OPT_C| (runtime): 2 (176.232 s)
    • OPTW|OPT_W| (runtime): 5 (0.01260 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 2.443700
  • frb35-17-1.clq

    • OPTC|OPT_C| (runtime): 2 (436.805 s)
    • OPTW|OPT_W| (runtime): 3 (0.03484 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 4.259041
  • frb35-17-2.clq

    • OPTC|OPT_C| (runtime): 2 (445.184 s)
    • OPTW|OPT_W| (runtime): 15 (0.08529 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 0.851809
  • frb35-17-3.clq

    • OPTC|OPT_C| (runtime): 2 (442.174 s)
    • OPTW|OPT_W| (runtime): 16 (0.09805 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 0.798571
  • frb35-17-4.clq

    • OPTC|OPT_C| (runtime): 2 (440.771 s)
    • OPTW|OPT_W| (runtime): 17 (0.09352 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 0.751596
  • frb35-17-5.clq

    • OPTC|OPT_C| (runtime): 2 (436.634 s)
    • OPTW|OPT_W| (runtime): 17 (0.1066 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 0.751596
  • frb40-19-1.clq

    • OPTC|OPT_C| (runtime): 2 (939.097 s)
    • OPTW|OPT_W| (runtime): 3 (0.06798 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 4.422213
  • frb40-19-2.clq

    • OPTC|OPT_C| (runtime): 2 (939.556 s)
    • OPTW|OPT_W| (runtime): 19 (0.1901 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 0.698245
  • frb40-19-3.clq

    • OPTC|OPT_C| (runtime): 2 (945.207 s)
    • OPTW|OPT_W| (runtime): 4 (0.08118 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 3.316660
  • frb40-19-4.clq

    • OPTC|OPT_C| (runtime): 2 (942.702 s)
    • OPTW|OPT_W| (runtime): 18 (0.1871 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 0.737036
  • frb40-19-5.clq

    • OPTC|OPT_C| (runtime): 2 (945.289 s)
    • OPTW|OPT_W| (runtime): 3 (0.08082 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 4.422213
  • frb45-21-1.clq

    • OPTC|OPT_C| (runtime): 2 (1881.66 s)
    • OPTW|OPT_W| (runtime): 21 (0.3565 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 0.652494
  • frb45-21-2.clq

    • OPTC|OPT_C| (runtime): 2 (1991.76 s)
    • OPTW|OPT_W| (runtime): 7 (0.01967 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 1.957482
  • frb45-21-3.clq

    • OPTC|OPT_C| (runtime): 2 (2000.79 s)
    • OPTW|OPT_W| (runtime): 4 (0.1450 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 3.425593
  • frb45-21-4.clq

    • OPTC|OPT_C| (runtime): 2 (2006.81 s)
    • OPTW|OPT_W| (runtime): 4 (0.1161 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 3.425593
  • frb45-21-5.clq

    • OPTC|OPT_C| (runtime): 2 (2024.17 s)
    • OPTW|OPT_W| (runtime): 5 (0.01613 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 2.740474
  • frb50-23-1.clq

    • OPTC|OPT_C| (runtime): 2 (4172.48 s)
    • OPTW|OPT_W| (runtime): 23 (0.6836 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 0.612828
  • frb50-23-2.clq

    • OPTC|OPT_C| (runtime): 2 (3756.12 s)
    • OPTW|OPT_W| (runtime): 4 (0.1967 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 3.523759
  • frb50-23-3.clq

    • OPTC|OPT_C| (runtime): 2 (3901.58 s)
    • OPTW|OPT_W| (runtime): 23 (0.6149 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 0.612828
  • frb50-23-4.clq

    • OPTC|OPT_C| (runtime): 2 (3892.11 s)
    • OPTW|OPT_W| (runtime): 23 (0.8230 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 0.612828
  • frb50-23-5.clq

    • OPTC|OPT_C| (runtime): 2 (3837.76 s)
    • OPTW|OPT_W| (runtime): 23 (0.6892 s)
    • logVOPTCOPTW\log |V| \cdot \frac{OPT_C}{OPT_W} : 0.612828

Our experimental evaluation reveals two key findings:

  • Runtime Performance: The proposed algorithm demonstrates higher computational complexity compared to the NetworkX implementation, particularly noticeable on larger graph instances.

  • Approximation Guarantees: Despite the runtime overhead, our algorithm maintains strong approximation quality, with the metric:

    logVOPTCOPTW2 \log |V| \cdot \frac{OPT_C}{OPT_W} \approx 2
    consistently approaching the theoretical 2-approximation bound. This suggests the algorithm provides near-optimal solutions while maintaining its theoretical guarantees.

These results indicate that our method offers a favorable trade-off between solution quality and computational efficiency, making it particularly suitable for applications where approximation accuracy is prioritized. Future research directions include optimizing the implementation for better runtime performance while preserving the approximation guarantees.


Impact of This Result


Conclusion

These algorithms advance the field of approximation algorithms by balancing efficiency and solution quality, offering both theoretical depth and practical relevance. Their argument implies that P=NPP = NP would have far-reaching practical applications, particularly in artificial intelligence, medicine, and industrial sectors. This work is available as a PDF document on ResearchGate at the following link: https://www.researchgate.net/publication/390201106_A_2-Approximation_Algorithm_for_Dominating_Sets.