description of the graph bisection program
the program bisect.f finds both a good equipartition of
a given graph and a bound of the optimum value of this partition.
the program consists of two files: bisect.f subs.f
in bisect.f you will find the main program + a bunch of subroutines
that were written by J. Falkner and F. Rendl.
the second file subs.f contains software from third parties that we
use essentially as black boxes. specifically it includes the
BT code plus the necessary subroutines and DNLASO plus the necessary
subroutines. we have slightly modified these codes to allow
some communication between the different subroutines.
we also include a third file trnsform.f which you may find useful.
it takes the adjacency list of a graph (contained in some file) and
transforms it into a format suitable for the bisection routine.
the bisection routine asks for a filename that contains the graph
in the correct format, and then uses an automatic parameter setup
tostart the calculations.
here is a description of the correct format for the input.
first comes:
n nzl nzs
(these are three integers with the following meaning:
n ... number of nodes
nzl ... number of the last row where there is a nonzero entry in the
upper triangle of the adjacency matrix. this will at the same
time be the dimension of the following vector icol. so, if you
set nzl to n-1, you have to fill up the vector icol with
sufficiently many zeros.
nzs ... number of nonzeros in the upper triangle of the adjacency matrix
i.e. number of edges)
next comes an integer vector of size nzl:
icol(1),... icol(nzl)
(icol(j) indicates the number of nonzero entries in row j of the
upper triangle of the adjacency matrix. icol(j)=0 is possible.)
finally comes the list of the actual edges: this is a list of length
nzs, where in each line is of the form
columnindex weight
(the edges are read in a rowwise fashion, only the upper triangle.
the array icol tells us how many edges we will find in the row,
the columnindex tells me in which column the entry must lie. the weight
is arbitrary (double precision).
this may be nonstandard, but it is the most economical way we could think
of storing the graph. tho order in which the nonzeros appear in a fixed row
is not important. so the columnindex need not be sorted within a row.
After successful execution the program just displays the
value value of the bound and the best bisection found. if you want to
actually store the cut vector, you have to include this in the
program. if you check the code, you will see that we have included a final
write, but it is silenced out.
If you are lazy, and your graph has just weights one (i.e. is unweighted)
then you can just use the routine trnsform.f. it sets the adjacency list
into the right format and writes it onto a file.
now some final comments regarding the performance.
we have set the dimensions as follows:
max number of nodes = 5000
max number of edges = 30000
if you need more, you have to hack the code. we indicated the places,
where the parameter changes have to be made. (only in bisect.f, it is
on 5 or 6 spots.)
max number of bt - iterations = 15
if you need more set the variable MAXIT in the main program appropriately.
finally the parameter FACTR in the main program plays a crucial role
in setting up the initial parameters for bt. we have set the choice of
FACTR automatic. this should work for a large variety of problems. Here
is some bit of adcice. if your graph is very sparse, FACTR should be very
close to 1, i.e. FACTR = .95 or even .99 setting it to exactly 1 may be
not so good, if the graph is only weakly connected. on the other hand,
if the graph is not supersparse, ie, if the number of edges is say larger
than 5n, FACTR should be chosen smaller, e.g. FACTR = .7.
for dense graphs, (edges > 10n) we would propose to set FACTR less than .5
The output that you see on the screen from the bt code includes the bound
the current best cut, the gap, the last two coluumns are the norm of an
epsilon -subgradient found at the current iteration, and the radius of the
current trust region.
If your initial subgradient norm is quite large, you probably should
chose FACTR differently, either smaller or larger, depending on where you
are.
Finally, we give this code away for free, so we do not take any
liability or other reponsibility.
If you have comments or problems, let us know.
Waterloo, July 26, 1994 franz rendl