GraphUtilities`
GraphUtilities`

MinimumBandwidthOrdering

As of Version 10, all the functionality of the GraphUtilities package is built into the Wolfram System. >>

MinimumBandwidthOrdering[g]

attempts to find a vertex ordering that minimizes the bandwidth of the undirected graph g.

MinimumBandwidthOrdering[m]

attempts to find row and column permutations that minimize the bandwidth of the matrix m.

Details

  • To use MinimumBandwidthOrdering, you first need to load the Graph Utilities Package using Needs["GraphUtilities`"].
  • For a graph {V,E} with vertex ordering f, the bandwidth of the graph is defined as Max{u, v}E |f[u]-f[v]|.
  • For a matrix m=(aij), the bandwidth is defined as Maxaij0 |i-j|.
  • For a symmetric matrix, the envelope size is defined as i Max(0,Maxaij0i-j), which is the sum of the distance from the first element in each row to the diagonal position.
  • MinimumBandwidthOrdering treats input graphs as undirected.
  • The following options can be given:
  • MethodAutomaticmethod to use
    RefinementMethodAutomaticmethod used to improve ordering
    RecursionMethodNonerecursion method to use

Examples

open allclose all

Basic Examples  (2)

This defines a small graph:

This numbers the vertices using ordering from VertexList:

This finds the bandwidth of the graph with the given ordering:

This finds a vertex ordering that attempts to minimize the bandwidth:

This renumbers the vertices using the minimum bandwidth ordering:

This finds the bandwidth using the vertex ordering given by MinimumBandwidthOrdering:

This defines a rectangular matrix:

This finds the row and column ordering that attempts to minimize the bandwidth of the matrix:

Plots of the matrix before and after the ordering show a decrease in bandwidth:

Options  (1)

Method  (1)

This finds orderings of a matrix using the methods "RCMD" and "Sloan":

The maximum bandwidth given by "RCMD" is smaller; envelope size given by "Sloan" is smaller:

Applications  (1)

One of the applications of minimum bandwidth ordering is in optimizing cache performance of numerical calculations. For example, in multiplying a sparse matrix with a vector, if the matrix is preordered to minimize the bandwidth, then elements of the vector will not be accessed randomly, thus improving cache performance. Because ordering itself takes time, this improvement in cache performance would be beneficial only if the matrix-vector product operation is to be performed repeatedly many times.

This generates a banded matrix, and then randomly permutes it:

This performs a matrix-vector product 50 times:

This permutes the matrix to minimize the bandwidth and permutes the vector correspondingly:

This shows that the matrix-vector product now takes less time:

This checks that the answer is the same, subject to a permutation: