Skip to content

[Rule] Vertex Cover to Ensemble Computation #204

@isPANN

Description

@isPANN

Source: VERTEX COVER
Target: ENSEMBLE COMPUTATION
Motivation: Establishes NP-completeness of ENSEMBLE COMPUTATION by encoding vertex-cover selection as a sequence of disjoint-union operations, where each "a₀-augmented" vertex z_i = {a₀} ∪ {v} corresponds to including vertex v in the cover and each edge subset is built by combining the appropriate cover vertex with its non-cover neighbor.

Reference: Garey & Johnson, Computers and Intractability, Appendix Problem PO9

Reduction Algorithm

ENSEMBLE COMPUTATION
INSTANCE: A collection C of subsets of a finite set A and a positive integer J.
QUESTION: Is there a sequence

< z_1 = x_1 ∪ y_1, z_2 = x_2 ∪ y_2, . . . , z_j = x_j ∪ y_j >

of j ≤ J union operations, where each x_i and y_i is either {a} for some a ∈ A or z_k for some k < i, such that x_i and y_i are disjoint for 1 ≤ i ≤ j and such that for every subset c ∈ C there is some z_i, 1 ≤ i ≤ j, that is identical to c ?

ENSEMBLE COMPUTATION is NP-complete. (Appendix PO9)
Proof: We transform VERTEX COVER to ENSEMBLE COMPUTATION. Let the graph G = (V,E) and the positive integer K ≤ |V| constitute an arbitrary instance of VC.

The basic units of the instance of VC are the edges of G. Let a_0 be some new element not in V. The local replacement just substitutes for each edge {u,v} ∈ E the subset {a_0,u,v} ∈ C. The instance of ENSEMBLE COMPUTATION is completely specified by:

A = V ∪ {a_0}
C = {{a_0,u,v}: {u,v} ∈ E}
J = K + |E|

It is easy to see that this instance can be constructed in polynomial time. We claim that G has a vertex cover of size K or less if and only if the desired sequence of j ≤ J operations exists for C.

First, suppose V' is a vertex cover for G of size K or less. Since we can add additional vertices to V' and it will remain a vertex cover, there is no loss of generality in assuming that |V'| = K. Label the elements of V' as v_1,v_2, . . . , v_K and label the edges in E as e_1,e_2, . . . , e_m, where m = |E|. Since V' is a vertex cover, each edge e_j contains at least one element from V'. Thus we can write each e_j as e_j = {u_j,v_{r[j]}}, where r[j] is an integer satisfying 1 ≤ r[j] ≤ K. The following sequence of K + |E| = J operations is easily seen to have all the required properties:

< z_1 = {a_0} ∪ {v_1}, z_2 = {a_0} ∪ {v_2}, . . . , z_k = {a_0} ∪ {v_K},
  z_{K+1} = {u_1} ∪ z_{r[1]}, z_{K+2} = {u_2} ∪ z_{r[2]}, . . . , z_J = {u_m} ∪ z_{r[m]} >

Conversely, suppose S = < z_1 = x_1 ∪ y_1, . . . , z_j = x_j ∪ y_j > is the desired sequence of j ≤ J operations for the ENSEMBLE COMPUTATION instance. Furthermore, let us assume that S is the shortest such sequence for this instance and that, among all such minimum sequences, S contains the fewest possible operations of the form z_i = {u} ∪ {v} for u, v ∈ V. Our first claim is that S can contain no operations of this latter form. For suppose that z_i = {u} ∪ {v} with u,v ∈ V is included. Since {u,v} is not in C and since S has minimum length, we must have {u,v} ∈ E, and {a_0,u,v} = {a_0} ∪ z_i (or z_i ∪ {a_0}) must occur later in S. However, since {u,v} is a subset of only one member of C, z_i cannot be used in any other operation in this minimum length sequence. It follows that we can replace the two operations

z_i = {u} ∪ {v}  and  {a_0,u,v} = {a_0} ∪ z_i

by

z_i = {a_0} ∪ {u}  and  {a_0,u,v} = {v} ∪ z_i

thereby reducing the number of proscribed operations without lengthening the overall sequence, a contradiction to the choice of S. Hence S consists only of operations having one of the two forms, z_i = {a_0} ∪ {u} for u ∈ V or {a_0,u,v} = {v} ∪ z_i for {u,v} ∈ E (where we disregard the relative order of the two operands in each case). Because |C| = |E| and because every member of C contains three elements, S must contain exactly |E| operations of the latter form and exactly j−|E| ≤ J−|E| = K of the former. Therefore the set

V' = {u ∈ V: z_i = {a_0} ∪ {u} is an operation in S}

contains at most K vertices from V and, as can be verified easily from the construction of C, must be a vertex cover for G. ∎

Summary:
Given a MinimumVertexCover instance with graph G = (V, E), construct an EnsembleComputation instance as follows:

  1. Universe construction: Let a₀ be a fresh element not in V. Set A = V ∪ {a₀}. The universe has |V| + 1 elements.
  2. Collection construction: For each edge {u, v} ∈ E, add the 3-element subset {a₀, u, v} to C. Each edge becomes exactly one required subset. The collection has |C| = |E| subsets.
  3. Objective relationship: In the optimization framing, EnsembleComputation minimizes the number of union operations J. The minimum J equals K* + |E|, where K* is the minimum vertex cover size. The K* operations build "cover-vertex" sets z_i = {a₀} ∪ {v_i} (one per cover vertex), and the |E| operations build the required edge subsets by combining each non-cover neighbor {u_j} with the appropriate z_{r[j]}.
  4. Solution extraction: Given an optimal sequence of J* operations, the cover vertices are exactly those vertices u ∈ V such that z_i = {a₀} ∪ {u} appears in the sequence. There are exactly K* = J* − |E| such operations, giving the minimum vertex cover.

Key invariant: Every vertex cover of size K in G yields a valid ensemble sequence of exactly K + |E| operations; conversely, every minimum-length valid sequence (normalized to avoid {u} ∪ {v} form) encodes a minimum vertex cover. Thus J* = K* + |E|.

Size Overhead

Symbols:

  • n = num_vertices of source graph G
  • m = num_edges of source graph G
Target metric (code name) Polynomial (using symbols above)
universe_size num_vertices + 1
num_subsets num_edges

Derivation:

  • Universe A = V ∪ {a₀}: one element per vertex plus the fresh element a₀ → |A| = n + 1
  • Collection C: one 3-element subset per edge in G → |C| = m
  • Optimization objective: J (number of union operations) is the optimization objective of EnsembleComputation, not a structural field. The relationship J* = K* + |E| connects the optimal values of source and target.

Validation Method

  • Closed-loop test: reduce a MinimumVertexCover instance to EnsembleComputation, solve the target with BruteForce, verify the optimal number of union operations J* satisfies J* = K* + |E| where K* is the minimum vertex cover size
  • Check universe_size = |V| + 1 and num_subsets = |E| for the constructed instance
  • For larger instances: if ReduceTo<ILP<bool>> is implemented for EnsembleComputation, use ILPSolver::solve_reduced() to handle instances beyond BruteForce's reach (target BF complexity grows as ~J*^|A|)
  • Test with the C₅ example below (5V, 5E, K*=3, J*=8) — BF-tractable with ~260K target configs
  • Edge case: empty graph (no edges) → K* = 0, C = ∅, J* = 0 (no operations needed)

Example

Source instance (MinimumVertexCover):
Graph G = C₅ (5-cycle) with 5 vertices {0, 1, 2, 3, 4} and 5 edges:

  • Edges: {0,1}, {1,2}, {2,3}, {3,4}, {4,0}
  • Minimum vertex cover: K* = 3 (odd cycle: ⌈n/2⌉ = 3; any 2-vertex cover fails)
  • Example cover: V' = {0, 1, 3} covers:
    • {0,1} by 0 ✓, {1,2} by 1 ✓, {2,3} by 3 ✓, {3,4} by 3 ✓, {4,0} by 0 ✓
  • Suboptimal cover V'' = {0,1,2,3} (K=4) is valid but not minimum

Constructed target instance (EnsembleComputation):

  • Fresh element: a₀ (index 5)
  • Universe A = {0, 1, 2, 3, 4, 5} (where 5 = a₀), |A| = 6
  • Collection C = {{5,0,1}, {5,1,2}, {5,2,3}, {5,3,4}, {5,0,4}} (|C| = 5 subsets, one per edge)
  • Optimal J* = K* + |E| = 3 + 5 = 8

Constructed sequence (from cover V' = {0, 1, 3}):

Label cover vertices v₁ = 0, v₂ = 1, v₃ = 3. For each edge, assign the cover vertex that covers it:

  • e₁ = {0,1}: cover vertex 0, non-cover operand 1
  • e₂ = {1,2}: cover vertex 1, non-cover operand 2
  • e₃ = {2,3}: cover vertex 3, non-cover operand 2
  • e₄ = {3,4}: cover vertex 3, non-cover operand 4
  • e₅ = {4,0}: cover vertex 0, non-cover operand 4

Phase 1 — cover-vertex augmentations (K* = 3 operations):

  • z₁ = {a₀} ∪ {0} = {5, 0}
  • z₂ = {a₀} ∪ {1} = {5, 1}
  • z₃ = {a₀} ∪ {3} = {5, 3}

Phase 2 — edge-subset constructions (|E| = 5 operations):

  • z₄ = {1} ∪ z₁ = {1} ∪ {5,0} = {5,0,1} = c₁ ✓ — edge {0,1}
  • z₅ = {2} ∪ z₂ = {2} ∪ {5,1} = {5,1,2} = c₂ ✓ — edge {1,2}
  • z₆ = {2} ∪ z₃ = {2} ∪ {5,3} = {5,2,3} = c₃ ✓ — edge {2,3}
  • z₇ = {4} ∪ z₃ = {4} ∪ {5,3} = {5,3,4} = c₄ ✓ — edge {3,4}
  • z₈ = {4} ∪ z₁ = {4} ∪ {5,0} = {5,0,4} = c₅ ✓ — edge {4,0}

All 5 subsets in C appear as some z_i ✓, j = 8 = J* ✓, all unions involve disjoint operands ✓

Reuse pattern: z₁ reused 2× (edges {0,1} and {4,0}), z₂ reused 1× (edge {1,2}), z₃ reused 2× (edges {2,3} and {3,4}). Non-cover vertices {2, 4} appear only as singleton operands.

Solution extraction:
The operations of the form z_i = {a₀} ∪ {u} are z₁ (u=0), z₂ (u=1), z₃ (u=3). Thus V' = {0, 1, 3} is the extracted vertex cover, |V'| = 3 = K* ✓

Metadata

Metadata

Assignees

No one assigned

    Labels

    GoodAn issue passed all checks.ruleA new reduction rule to be added.

    Type

    No type

    Projects

    Status

    Ready

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions