
\documentstyle{article}
\textwidth=4.5in
\textheight=7.125in

% Macros for PostScript Figures:
\input psfig

\begin{document}
\bibliographystyle{plain}
\renewcommand{\thefootnote}{*}

\large
\begin{center}

{\bf A Parallel Stochastic Optimization Algorithm \\
for Finding Mappings of the Rectilinear \\
Minimal Crossing Problem}

\hspace{12pt}

     John T. Thorpe \footnote{Current Address: AT\&T Global Information
		Solutions, GIS WP\&S, CDT, \newline Liberty, SC  29657, 
	\hspace{0.1in} jthorpe@admin.clemsonSC.NCR.COM}\\
     jtthorpe@cs.clemson.edu\\

\hspace{12pt}

     Frederick C. Harris, Jr.\\
     fredh@cs.clemson.edu\\

\hspace{12pt}

     Department of Computer Science \\
     Clemson University\\
     Clemson, South Carolina 29634-1906

\hspace{6pt}
\end{center}
\normalsize

\small
\begin{quote}
\noindent
	{\bf Abstract:}
	Parallel processing has been a valuable tool for improving the
	performance of many algorithms.  Solving intractable problems
	is an attractive application of parallel processing.
	Traditionally, exhaustive search techniques have been used to
	find solutions to NP-complete problems.  However, the
	performance benefit of parallelization of exhaustive search
	algorithms can only provide linear speedup, which is typically
	of little use as problem complexity increases exponentially with
	problem size.  Genetic algorithms can be useful tools to
	provide satisfactory results to such problems.  This paper
	presents a genetic algorithm that uses parallel processing in a
	cooperative fashion to determine mappings for the rectilinear
	crossing problem. Results from this genetic algorithm are
	presented which contradict a conjecture that has been open for
	over 20 years regarding the minimal crossing number for
	rectilinear graphs.

{\bf keywords:} Rectilinear Minimal Crossing, Parallel Genetic Algorithms
\end{quote}

\normalsize

\parindent=1em

\section{Introduction}
	\label{intro}

	\hspace{1em}Parallel processing has proven to be a valuable
	tool for increasing the performance of various algorithms.
	Intractable problems solved by exhaustive search techniques
	seem to resist the speedup typically brought about by
	parallelization.  Algorithms for these problems, when run in
	parallel, typically only give a speedup directly proportional
	to the number of processors working in concert on the problem.
	This paper presents an alternative to traditional exhaustive
	search methods by using a variation on genetic
	algorithms~\cite{GOLD89,DAVI91}.

	In the early 1970's, John Holland at the University of Michigan
	developed a heuristic search technique known as a genetic
	algorithm~\cite{GOLD89}.  Because they are heuristic
	techniques, genetic algorithms are not guaranteed to find
	optimal solutions but rather to find ``acceptable'' solutions
	when searching complex systems.  An acceptable result is
	defined by the problem at hand, and by how close to the optimal
	solution the user deems satisfactory. It is hoped that
	using genetic algorithms in parallel can produce results in a
	``reasonable'' amount of time as good as or better than
	exhaustive search techniques.

	The problem chosen to demonstrate the viability of using
	genetic algorithms in parallel is the rectilinear crossing
	problem.  The rectilinear crossing problem is an extension of
	the minimal crossing problem as described by Garey and
	Johnson~\cite{GARE82} as the GRAPH GENUS problem.
	Johnson~\cite{JOHN82} places the crossing problem in its own
	category as an NP-complete problem.  In general, crossing
	problems attempt to find some optimal mapping of a graph such
	that the number of edge crossings (intersections) is
	minimized.  First of all, it is necessary to define the
	criteria for a valid graph in order to determine what the
	crossing number of a valid graph is.  Chartrand and
	Lesniak~\cite{CHAR86} state the definition this way:  the {\it
	crossing number} of a graph $G$, denoted $\nu (G)$, is the
	minimum number of crossings (of its edges) among the drawings
	of $G$ in the plane.  Assumptions about the drawings are as
	follows:

	\vspace{10pt}

		(a) adjacent edges never cross -- i.e. edges
		with a common vertex;

		(b) two non-adjacent edges cross at most once; 

		(c) no edge crosses itself; 

		(d) no more than two edges cross at a point of
		the plane; and

		(e) the (open) arc in the plane corresponding
		to an edge of the graph contains no vertex of the graph
		%-- edges do not overlap.

	\vspace{10pt}

	The number of crossings produced by such a mapping gives a
	measure of how non-planar the graph is.  Extending the
	constraints of the minimal crossing problem by requiring that
	edges of the graph must be straight lines creates the
	rectilinear crossing problem.  So the question to be solved
	is:   What is the crossing number of a complete graph $G$ given
	that $G$ is rectilinear and lies in a bounded planar region,
	and what mapping will provide a minimal crossing number for
	that graph?

	For complete graphs that have ten or fewer vertices, the
	crossing numbers are known~\cite{GUY72}.  For larger graphs, no
	minimal crossing number has been verified.  Formulas that
	postulate what the crossing numbers should be and methods to
	produce mappings with that many crossings have been developed
	but not verified for their minimality~\cite{GUY72,BLAZ64}.
	Verification has been difficult mainly due to the sheer number
	of edges and the difficulty of counting the crossings by hand.
	Additionally, isomorphic transformations of the solutions can
	compound the difficulty of identifying unique solutions.

	Once the crossing numbers for complete graphs have been
	determined, the problem can easily be generalized to apply to
	less than complete graphs.  Examples of such graphs are circuit
	diagrams, communication networks, railroad track and highway
	networks, and other interconnection diagrams.  Recent papers by
	Chang~\cite{CHAN87} and Wang, Lee, and Chang~\cite{WANG89} have
	described circuit design in similar terms to the minimal
	crossing problem.  Chang~\cite{CHAN87} proposed an algorithm
	for minimizing {\it vias} in multi-layer circuits, which is a
	transformation of the minimal crossing problem.  

	The purpose of this paper is to demonstrate the effectiveness
	of using genetic algorithms in concert with parallel processing
	in obtaining good solutions for large or intractable problems.
	In Section \ref{prev}, previous work on the minimal crossing
	problem, NP-completeness, and genetic algorithms are
	presented.  Section \ref{method} explains the heuristic used to
	solve the problem, as well as describing the platform that the
	heuristic was implemented on.  Results and analysis of the
	algorithm are presented in Section \ref{results}.  Section
	\ref{conclusions} provides some conclusions and future work is
	presented in Section \ref{future}.

\section{Previous Work}
	\label{prev}

	\subsection*{Minimal Crossing Problem}

		\hspace{1em}Twenty years ago, almost all questions
		about the minimal crossing problem were unanswered.
		Methods for generating mappings to provide graphs with
		conjectured minimal crossing numbers have been
		developed, and formulas that provide the expected
		minimal crossing number have been proposed
		\cite{GUY72,BLAZ64}.  The majority of these formulas
		and methods have been verified by visual inspection for
		a small number of vertices.  As the number of edges and
		vertices in the graphs grow in number, this method of
		verification becomes progressively more difficult.
		Even exhaustive searches by computer programs to find
		and verify mappings become prohibitively time consuming
		with increased problem size.

		For graphs of size 10 and less, a simple formula
		provides the minimal crossing number for complete
		graphs \cite{GUY72,CHAR86}:

		\[ \nu (K_{n}) = \frac{ \lfloor \frac{n}{2} \rfloor  \lfloor 
		\frac{n-1}{2} \rfloor 
		\lfloor \frac{n-2}{2} \rfloor \lfloor \frac{n-3}{2} \rfloor}{4} 		\]

		The minimal crossing number for fully connected
		rectilinear graphs also holds for this formula, with
		the notable exception of graphs with 8 vertices.  For
		$K_{8}$, the crossing number is 18; while for
		rectilinear graphs the crossing number is 19.  As the
		crossing problem increases in size (11 vertices or
		more), a different formula appears to hold true:

		%insert Guy's formula here
		\[ \bar{\nu}(K_{n}) \leq \lfloor \frac{(7n^{4} - 56n^{3} +
		128n^{2} + 48n \lfloor \frac{(n-7)}{3}\rfloor + 108)}
		{432} \rfloor \]

		Guy~\cite{GUY72} proposed this formula in 1972, and has
		conjectured that this formula is actually an equality.
		In private communication however, Guy~\cite{GUY92}
		noted that if equality does not hold for graphs with 12
		vertices, then graphs with more vertices are also
		likely to have smaller crossing numbers than the
		formula suggests.


	\subsection*{NP-Completeness}

		\hspace{1em} NP-complete problems are a class of
		decision problems that are considered to be
		intractable.  In other words, solutions to these
		problems probably will not be found by using a
		polynomial time algorithm.  Although it has not been
		proven whether or not NP-complete problems are truly
		intractable, it would appear that a major breakthrough
		will be necessary to solve them in polynomial time.
		The crossing number problem has been classified as an
		NP-complete problem that is a transformation of the
		OPTIMAL LINEAR ARRANGEMENT problem \cite{GARE82}, and
		Johnson has cited a variant of the crossing problem
		that is related to the GRAPH GENUS problem
		\cite{JOHN82}.  For a more complete overview of
		NP-completeness, see \cite{GARE82}, and for a list of
		known NP-completeness problems see \cite{GARE82}, and
		Johnson's series of {\it NP-Completeness
		Columns}~\cite{JOHN82}.

	\subsection*{Genetic Algorithms}


		\hspace{1em}Genetic algorithms were first developed by
		John Holland at the University of Michigan in the early
		1970's.  Holland was interested in how an algorithm
		could simulate natural selection.  The goals of
		Holland's research included explaining the adaptive
		processes of natural systems and then designing
		artificial systems software which would retain the
		important mechanisms of natural
		selection~\cite{GOLD89}.  Thus, the power of genetic
		algorithms lies in their robustness, or ability to
		adapt, just as in natural systems.

		Genetic algorithms are heuristic search algorithms.
		Thus, the goal of a genetic algorithm is not to
		necessarily find the optimal solution, but to produce a
		``satisfactory'' solution when searching a complex
		system.  Random choice is used as a tool to guide a
		genetic algorithm as it searches.  As a genetic
		algorithm produces new generations, better solutions
		may be discovered.


		The structure of a genetic algorithm is based on
		natural selection.  First, an initial population of
		feasible solutions is randomly generated.  The initial
		population consists of chromosomes representing
		particular encodings of solutions.  Reproduction takes
		place between members of the population, and a child is
		formed from a combination of the parent chromosomes.
		For each new child, an evaluation function is used to
		determine the fitness of that child.  Whether or not
		the child becomes a member of the population depends on
		its fitness value.  Each new child chromosome is
		compared against the worst member of the population,
		and the better one is kept in the population.  By
		producing new generations in this manner, the
		population improves and the best member of the final
		population is the solution which is returned by the
		algorithm.

\section{Method}
	\label{method}

	\hspace{1em}Why use genetic algorithms implemented in parallel
	to find solutions to the rectilinear crossing problem?  An
	initial solution might be to use an exhaustive search method to
	place vertices in a plane, and then evaluate the resulting
	graph.  For large problem sizes(graphs of size 12 or more),
	this approach is obviously time consuming, and is not
	guaranteed to produce a ``good'' result within a reasonable
	amount of time.

	An alternative to exhaustive search is a heuristic such as a
	genetic algorithm.  The premise of the genetic algorithm is
	that by generating a large number of solutions (a population)
	and continually recombining the solutions, a ``good'' result
	will eventually be produced through ``survival of the fittest''
	as good results replace ``worse'' results.  A genetic
	algorithm working on a single processor may produce good
	results, but if multiple versions of the algorithm were to
	operate in parallel in some {\it cooperative fashion}, it is
	likely that the concurrent version would produce even better
	results than the single processor implementation.

	The algorithm used for the rectilinear crossing problem is
	basically a genetic algorithm with some modifications that
	enhance its use on a parallel processing system.  First, eight
	nodes of a parallel processing machine (iPSC/2) are allocated
	to run the genetic algorithms.  Each node generates its own
	initial population, and begins executing the genetic
	algorithm.  Each iteration of the genetic algorithm produces
	two children to evaluate and possibly insert into the node's
	population.  Every so often, a ``mutant'' is
	generated and inserted into the population. Mutation is a
	technique to help prevent stagnation of the population.  Once
	the genetic algorithm meets one of its convergence criteria
	(time limit, number of iterations, difference in the number of
	crossings between the best and the worst solutions), the
	algorithm halts and broadcasts its results to the host
	program.  If all nodes have converged to the same crossing
	number, the host stops and reports the results.

	As previously noted, the algorithm used does not follow the
	traditional approach described by Goldberg~\cite{GOLD89} in
	which the {\it entire} population is replaced at each
	iteration.  Instead, a combination of Davis' and Goldberg's
	approaches were used in which each genetic algorithm uses a
	Davis-like approach, \cite{DAVI91}, to insert a few new members
	into the population.

	There is no strategy involved in creating initial populations.  
	The graph vertices are randomly placed in a rectangular area, and
	the number of crossings for each resulting graph are determined.
	After the initial population is generated, the genetic algorithm
	selects two sets of parent ``chromosomes'' to recombine.  One set is
	chosen via a simple linear bias, the other is chosen from a normal
	distribution of the best ten percent (10\%) of the population.

	Genetic algorithms were designed for use on sequential
	machines.  In order to take advantage of parallel processing, a
	variation on traditional genetic algorithms can prove useful.
	By allowing some sort of cross-pollenation of chromosomes
	between genetic algorithms operating in parallel, information
	can be shared, and it is hoped that the interaction will
	improve performance of the genetic algorithms.  This
	modification is logically consistent and exists in
	``real-world'' genetics.

	A pollenation rate, $P$, is set as a parameter to the program,
	and once every $P$ iterations, each genetic algorithm sends a
	solution to the host program.  The host then chooses the best
	solution and broadcasts it back to all the nodes to use in
	their recombination.  This method of cross-pollenation has
	provided exceptionally better results then simply running eight
	genetic algorithms independently, an observation previously
	made by the authors~\cite{HINE92}.  One additional note:  when
	cross-pollenation occurs too frequently, the populations tend
	to converge very quickly, and rarely do they produce a ``good''
	result.

	The recombination technique used in this work is based on
	uniform order-based crossover presented by
	Davis~\cite{DAVI91}.  According to this recombination, a
	chromosome is a bit string that represents the contribution of
	the parents to a child.  A one in the bit string indicates that
	the vertex corresponding to that bit index will contribute to
	the construction of child 1, and a zero indicates that the
	vertex will contribute to child 2.  This bit string is
	generated randomly for each generation with parent 1 receiving
	the bit string and parent 2 receiving it's complement.  Hence,
	child 1 is composed of vertices marked with ones and child 2 is
	made of vertices marked with zeroes.  This type of chromosome
	recombination is illustrated in Figure \ref{recom}.  These
	children are then evaluated by the cost function and inserted
	into the population if the value returned is better than that
	of the worst member of the population.

	\begin{figure}
		\begin{center}
%		\input{recom}

%\setlength{\unitlength}{0.0125in}%
\setlength{\unitlength}{0.011in}%
\begin{picture}(369,230)(245,590)
\thicklines
\put(291,653){\framebox(12,15){}}
\put(303,653){\framebox(10,15){}}
\put(313,653){\framebox(11,15){}}
\put(324,653){\framebox(12,15){}}
\put(336,653){\framebox(10,15){}}
\put(346,653){\framebox(12,15){}}
\put(358,653){\framebox(11,15){}}
\put(369,653){\framebox(11,15){}}
\put(380,653){\framebox(11,15){}}
\put(391,653){\framebox(12,15){}}
\put(294,657){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(306,657){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(317,657){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(328,657){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(339,657){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(351,657){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(361,657){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(372,657){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(384,657){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(394,657){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
%%\put(390,657){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm Parent 1}}}
\put(320,635){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm Parent 1}}}
%\put(390,665){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm Parent 1}}}
\put(323,746){\framebox(15,52){}}
\put(323,791){\line( 1, 0){ 15}}
\put(323,783){\line( 1, 0){ 15}}
\put(323,775){\line( 1, 0){ 15}}
\put(323,753){\line( 1, 0){ 15}}
\put(331,768){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm .}}}
\put(331,760){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm .}}}
\put(331,757){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm .}}}
\put(300,746){\framebox(16,52){}}
\put(300,791){\line( 1, 0){ 16}}
\put(300,783){\line( 1, 0){ 16}}
\put(300,775){\line( 1, 0){ 16}}
\put(300,753){\line( 1, 0){ 16}}
\put(308,768){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm .}}}
\put(308,760){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm .}}}
\put(308,757){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm .}}}
\put(278,746){\framebox(15,52){}}
\put(278,791){\line( 1, 0){ 15}}
\put(278,783){\line( 1, 0){ 15}}
\put(278,775){\line( 1, 0){ 15}}
\put(278,753){\line( 1, 0){ 15}}
\put(286,768){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm .}}}
\put(286,760){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm .}}}
\put(286,757){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm .}}}
\put(256,746){\framebox(15,52){}}
\put(256,791){\line( 1, 0){ 15}}
\put(256,783){\line( 1, 0){ 15}}
\put(256,775){\line( 1, 0){ 15}}
\put(256,753){\line( 1, 0){ 15}}
\put(264,768){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm .}}}
\put(264,760){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm .}}}
\put(264,757){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm .}}}
\put(397,746){\framebox(15,52){}}
\put(397,791){\line( 1, 0){ 15}}
\put(397,783){\line( 1, 0){ 15}}
\put(397,775){\line( 1, 0){ 15}}
\put(397,753){\line( 1, 0){ 15}}
\put(405,768){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm .}}}
\put(405,760){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm .}}}
\put(405,757){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm .}}}
\put(352,772){\circle*{8}}
\put(367,772){\circle*{8}}
\put(383,772){\circle*{8}}

\put(303,590){\framebox(10,15){}}
\put(313,590){\framebox(11,15){}}
\put(324,590){\framebox(12,15){}}
\put(336,590){\framebox(10,15){}}
\put(346,590){\framebox(12,15){}}
\put(358,590){\framebox(11,15){}}
\put(369,590){\framebox(11,15){}}
\put(380,590){\framebox(11,15){}}
\put(391,590){\framebox(12,15){}}
\put(291,590){\framebox(12,15){}}
\put(294,594){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(306,594){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(317,594){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(328,594){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(339,594){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(351,594){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(361,594){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(372,594){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(384,594){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(394,594){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}

%%\put(390,594){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm Parent 2}}}
\put(320,572){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm Parent 2}}}
%\put(390,582){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm Parent 2}}}
\put(460,638){\framebox(11,15){}}
\put(471,638){\framebox(12,15){}}
\put(483,638){\framebox(10,15){}}
\put(493,638){\framebox(12,15){}}
\put(505,638){\framebox(11,15){}}
\put(516,638){\framebox(11,15){}}
\put(527,638){\framebox(11,15){}}
\put(538,638){\framebox(12,15){}}
\put(550,638){\framebox(10,15){}}
\put(560,638){\framebox(12,15){}}
\put(464,642){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(476,642){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(486,642){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(498,642){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(509,642){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(519,642){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(531,642){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(542,642){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(553,642){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(564,642){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 1}}}
\put(579,642){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm Child 1}}}
\put(460,609){\framebox(11,14){}}
\put(471,609){\framebox(12,14){}}
\put(483,609){\framebox(10,14){}}
\put(493,609){\framebox(12,14){}}
\put(505,609){\framebox(11,14){}}
\put(516,609){\framebox(11,14){}}
\put(527,609){\framebox(11,14){}}
\put(538,609){\framebox(12,14){}}
\put(550,609){\framebox(10,14){}}
\put(560,609){\framebox(12,14){}}
\put(464,612){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(476,612){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(486,612){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(498,612){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(509,612){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(519,612){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(531,612){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(542,612){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(553,612){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(564,612){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm 0}}}
\put(579,612){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm Child 2}}}
%%\put(431,660){\vector( 2,-1){ 29.200}}
\put(425,660){\vector( 2,-1){ 29.200}}
%%\put(431,660){\vector( 2,-3){ 29.231}}
\put(425,660){\vector( 2,-3){ 29.231}}
%%\put(431,597){\vector( 2, 3){ 29.692}}
\put(425,597){\vector( 2, 3){ 29.692}}
%%\put(431,597){\vector( 2, 1){ 29.200}}
\put(425,597){\vector( 2, 1){ 29.200}}
\put(245,731){\framebox(178,89){}}
\put(331,746){\vector( 0,-1){ 78}}
\put(264,746){\line( 0,-1){149}}
\put(264,597){\vector( 1, 0){ 17}}
\put(505,660){\vector(-2, 3){ 74.462}}
\put(260,805){\makebox(0,0)[lb]{\raisebox{0pt}[0pt][0pt]{\ninrm Population}}}
\end{picture}
		\end{center}
		\caption{Recombination of Chromosomes}
		\label{recom}
	\end{figure}

\newpage
	The cost function for the rectilinear crossing problem is
	fairly easy to describe.  All edges are checked in a pairwise
	fashion such that no edge is compared to itself, and no pair of
	edges are compared more than once.  If a pair of edges cross,
	then the crossing number is increased by one.  Whenever the
	cost evaluation function detects colinear edges (something that
	violate the problem constraints) a large penalty is invoked.
	Solutions containing large penalty values tend to drop out of
	the population very quickly.

	At first, verification was carried out by hand.  As the problem
	sizes grew larger, simple manual verification became
	increasingly difficult.  A simple graphics utility was written
	in the X-Windows environment to help verify solutions by
	plotting graphs of solutions and plotting intersection points.

\section{Results and Analysis}
	\label{results}

	\hspace{1em}
	Some of the parameters used for this presentation came from
	experiments done in previous work by one of the authors
	\cite{HINE92}.  Whether they are actually ``good'' parameters
	for this particular problem has yet to be explored.  For
	instance, in all of the experiments run, the mutation rate was
	held at 10\% and the linear bias at 2.5.
	Parameters specific to this instance of the minimal crossing
	problem include the boundaries of the planar region occupied by
	the graph.  The size of the area was limited to $1000 \times
	1000$ units (an arbitrary decision).  As noted in Table
	\ref{restab}, there was some minor experimentation with the
	pollenation rate.  This experimentation showed that more
	frequent pollenation led to faster convergence and sporadic
	results.  These preliminary results are probably not enough to
	justify the choice of pollenation every 150 generations.

	Table \ref{restab} lists out the parameters and results for
	various executions of the parallel genetic algorithm.
	Guy's formula~\cite{GUY72} produces the number in the Expected
	column, and output of the parallel genetic algorithm appears in
	the Result column.  This column displays some rather
	interesting numbers for graphs of size 12 and 13.  For these
	graphs the crossing numbers produced by the heuristic are lower
	than the minimum value proposed by Guy in 1972~\cite{GUY72}.  These
	values have been verified by hand, and the graphs that
	correspond to those numbers are shown in Figures \ref{graph1}
	and \ref{graph2}.

	\begin{figure}
	\centerline{\psfig{figure=12.ps,height=2.7in}}
	\centerline{\begin{tabular}{rrrrrrrrrrr}
	(894, & 15) & & (544, & 339) & & (610, & 189) 	& & (205, & 272) \\
	(582, & 815)& & (490, & 541) & & (521, & 628) 	& & (552, & 278) \\
	(873, & 29) & & (348, & 275) & & (352, & 279) 	& & (56, & 252) \\
	\end{tabular}}
	\caption{Complete Graph with 12 Vertices and 155 crossings}
	\label{graph1}
	\end{figure}

	\begin{figure}
	\centerline{\psfig{figure=13.ps,height=2.6in}}
	\centerline{\begin{tabular}{rrrrrrrrrrr}
	(541, &  519) & & (639, &  311) & & (611, &  370) & & (811, &  210) \\
	(337, &  330) & & (74, &  125) & & (725, &  265) & & (659, &  657) \\
	(709, &  766) & & (153, &  166) & & (231, &  233) & & (523, &  357) \\
	(572, &  552)
	\end{tabular}}
	\caption{Complete Graph with 13 Vertices and 229 crossings}
	\label{graph2}
	\end{figure}

%	\input{table}

	\begin{table}
	% ** sc spreadsheet output
\begin{center}
	\begin{tabular}{||r|r|r|r||r|r|r||}
	\hline
	Size&Pop&Pollen&Expected&Result&Generations&Time.\\
	\hline \hline
    3&   150&    150&        0&     0&        1& 0 sec\\\hline 
    4&   150&    150&        0&     0&      127& 1 sec\\\hline
    5&   150&    150&        1&     1&      247& 5 sec\\\hline
    6&   150&    150&        3&     3&    2,338& 47 sec\\\hline 
    7&   150&    150&        9&     9&    5,250& 148 sec\\\hline
    7&   150&    150&        9&     9&    5,007& 145 sec\\\hline 
   10&   100&    400&       60&    62&  134,409& 3 hrs\\\hline
   10&   100&    400&       60&    62&  143,609& 4 hrs\\\hline 
\hline
   11&   150&    100&      102&   120&      196& 2 min\\\hline
   11&   150&      5&      102&   124&      252& 2 min\\\hline 
   11&   150&      5&      102&   102&    7,770& 15 min\\\hline
   11&   150&    150&      102&   102&   13,299& 15 min\\\hline
   11&   100&    400&      102&   104&   14,009& 15 min\\\hline
   11&   150&    150&      102&   102&  152,550& 2 hrs\\\hline
\hline
   12&   150&    150&      156&   157&  138,599& 2 hrs\\\hline
   12&   150&    150&      156&   156&  194,151& 3 hrs\\\hline 
   12&   150&    150&      156&{\bf 155}&  228,739& 3 hrs\\\hline
\hline
   13&   150&    150&      231&   231&  139,711& 3 hrs\\\hline
   13&   150&    150&      231&   231&  189,809& 3 hrs\\\hline
   13&   150&    150&      231&{\bf 229}&  196,639& 3 hrs\\\hline 
\hline
   14&   150&    150&      328&   344&   89,125& 3 hrs\\\hline
   14&   150&    150&      328&   334&  131,250& 3 hrs\\\hline 
   14&   150&    150&      328&   333&  147,999& 4 hrs\\\hline
\hline
   15&   150&    150&      453&   465&   97,679& 3 hrs\\\hline
   15&   150&    150&      453&   469&  126,099& 4 hrs\\\hline 
\hline
   16&   150&    150&      612&   638&   77,639& 3 hrs\\\hline 
   16&   150&    150&      612&   636&   81,099& 3 hrs\\\hline
\hline
   17&   150&    150&      808&   874&   45,289& 3 hrs\\\hline
   17&   150&    150&      808&   864&   81,769& 4 hrs\\\hline 
\hline
   18&   150&    150&    1,047& 1,220&   57,809& 4 hrs\\\hline
   18&   150&    150&    1,047& 1,172&   59,829& 4 hrs\\\hline 
\hline
   19&   150&    150&    1,338& 1,562&   32,449& 3 hrs\\\hline
   19&   150&    150&    1,338& 1,568&   43,939& 4 hrs\\\hline 
\hline
   20&   150&    150&    1,683& 2,054&   22,349& 3 hrs\\\hline
   20&   150&    150&    1,683& 2,018&   35,619& 4 hrs\\\hline 
\end{tabular}
\end{center}
% ** end of sc spreadsheet output
\caption{Parameters and Results from Parallel Genetic Algorithms}
\label{restab}
\end{table}


	Another interesting feature of the genetic algorithms used is
	the number of iterations taken to produce a result.  There
	appears to be no real correlation between the ``goodness'' of a
	solution and how long it takes a genetic algorithm to produce
	it.  Intuition tells us that the longer a genetic algorithm
	executes, the better its results should be through ``survival
	of the fittest.''  However, as previously stated, genetic
	algorithms are heuristic search techniques, and are not
	guaranteed to find an optimal solution.  Much of the disparity
	between the results of each execution lies in the use of
	randomness as a tool to guide the search.  Some of the
	disparity is a result of the error checking and cost evaluation
	functions required by the minimal crossing problem.  When
	a child's chromosome is generated, no two vertices in that
	chromosome can be the same.  Whenever equal vertices are found,
	the child is discarded.  If the child passes error checking, it
	goes through the cost evaluation function, which is a fairly
	expensive operation.  Once evaluated, then the child {\it may}
	be inserted into the population--another expensive operation.

	Cost evaluation is expensive due to the method that selects
	edges to test.  Each edge is chosen in a pairwise fashion by
	vertices and tested against all other edges.  A simple
	algorithm to do this is briefly outlined in Figure \ref{cost},
	\begin{figure}[htb]
	\begin{center}
	{
	\begin{verbatim} 
	function cost()
	
	  for i := 1 to (number of vertices - 1) do
	    for j := (i + 1) to number of vertices do
	      for k := 1 to (number of vertices - 1) do
	        for m := (k + 1) to number of vertices do
	          if ((edge(i,j) != edge(k,m)) AND 
	              not_yet_tested(i,j,k,m)) {
	               total_cost := total_cost + 
	                             cost(edge(i,j),edge(k,m));
	          }
	        end /* for m */
	      end /* for k */
	    end /* for j */
	  end /* for i */
	  return(total_cost)
	end /* function cost */
	\end{verbatim}
	}
		\caption{Cost Evaluation}
		\label{cost}
	\end{center}
	\end{figure}
	and it is highly likely that there are better methods for
	evaluating the graph cost.  The cost of this evaluation is
	characterized by the following formula: 
	\[ \frac{n(n-1)(n-2)(n-3)}{2} \hspace{0.25in} = 
	\hspace{0.25in} \frac{n^{4} - 7n^{3} +12n^{2} - 6n}{2}\] 
	Obviously cost evaluation is an $O(n^{4})$
	operation.
	In practice however, this cost evaluation does not grow at the
	expected rate of an $O(n^{4})$ operation.  This slow growth
	rate is due to the speed of the CPU which introduces a large
	constant that divides the entire function.  This division
	appears to provide a lower order function for the limited
	values of $n$ that we are pursuing.  This savings is clearly
	illustrated by the time it takes to generate and test the
	initial population.  Figure \ref{time} shows a plot of
	initialization time versus problem size and compares it to
	$n^{4}$, $n^{3}$, and $n^{2}$.  From this plot, it appears the
	checking mechanism's performance lies somewhere between
	$O(n^{2})$ and $O(n^{3})$ for the graph sizes considered.
	\begin{figure}[htb]
		\begin{center}
		%\input{time}

%\setlength{\unitlength}{0.0085pt}
\setlength{\unitlength}{0.0075pt}
\begin{tabular}{r@{}c}
 & \begin{picture}(30208,23881)(-1300,-1750)
\put(0,0){\line(1,0){28907}}
\put(28907,0){\line(0,1){21680}}
\put(28907,21680){\line(-1,0){28907}}
\put(0,21680){\line(0,-1){21680}}
\put(-500,0){\makebox(0,0)[r]{$0$}}
\put(0,3613){\line(1,0){500}}
\put(28907,3613){\line(-1,0){500}}
\put(-500,3613){\makebox(0,0)[r]{$100$}}
\put(0,7226){\line(1,0){500}}
\put(28907,7226){\line(-1,0){500}}
\put(-500,7226){\makebox(0,0)[r]{$200$}}
\put(0,10839){\line(1,0){500}}
\put(28907,10839){\line(-1,0){500}}
\put(-500,10839){\makebox(0,0)[r]{$300$}}
\put(0,14452){\line(1,0){500}}
\put(28907,14452){\line(-1,0){500}}
\put(-500,14452){\makebox(0,0)[r]{$400$}}
\put(0,18065){\line(1,0){500}}
\put(28907,18065){\line(-1,0){500}}
\put(-500,18065){\makebox(0,0)[r]{$500$}}
\put(-500,21679){\makebox(0,0)[r]{$600$}}
\put(1651,0){\line(0,1){500}}
\put(1651,21680){\line(0,-1){500}}
\put(1651,-500){\makebox(0,0)[t]{$4$}}
\put(4955,0){\line(0,1){500}}
\put(4955,21680){\line(0,-1){500}}
\put(4955,-500){\makebox(0,0)[t]{$6$}}
\put(8258,0){\line(0,1){500}}
\put(8258,21680){\line(0,-1){500}}
\put(8258,-500){\makebox(0,0)[t]{$8$}}
\put(11562,0){\line(0,1){500}}
\put(11562,21680){\line(0,-1){500}}
\put(11562,-500){\makebox(0,0)[t]{$10$}}
\put(14865,0){\line(0,1){500}}
\put(14865,21680){\line(0,-1){500}}
\put(14865,-500){\makebox(0,0)[t]{$12$}}
\put(18169,0){\line(0,1){500}}
\put(18169,21680){\line(0,-1){500}}
\put(18169,-500){\makebox(0,0)[t]{$14$}}
\put(21473,0){\line(0,1){500}}
\put(21473,21680){\line(0,-1){500}}
\put(21473,-500){\makebox(0,0)[t]{$16$}}
\put(24776,0){\line(0,1){500}}
\put(24776,21680){\line(0,-1){500}}
\put(24776,-500){\makebox(0,0)[t]{$18$}}
\put(28080,0){\line(0,1){500}}
\put(28080,21680){\line(0,-1){500}}
\put(28080,-500){\makebox(0,0)[t]{$20$}}
\put(0,0){\line(1,0){28907}}
\put(0,2926){\circle*{100}}
\put(36,3016){\circle*{100}}
\put(72,3106){\circle*{100}}
\put(108,3197){\circle*{100}}
\put(144,3287){\circle*{100}}
\put(180,3377){\circle*{100}}
\put(180,3377){\circle*{100}}
\put(210,3461){\circle*{100}}
\put(240,3544){\circle*{100}}
\put(271,3628){\circle*{100}}
\put(301,3711){\circle*{100}}
\put(331,3795){\circle*{100}}
\put(361,3878){\circle*{100}}
\put(361,3878){\circle*{100}}
\put(391,3970){\circle*{100}}
\put(421,4063){\circle*{100}}
\put(451,4155){\circle*{100}}
\put(482,4247){\circle*{100}}
\put(512,4340){\circle*{100}}
\put(542,4432){\circle*{100}}
\put(542,4432){\circle*{100}}
\put(568,4519){\circle*{100}}
\put(593,4607){\circle*{100}}
\put(619,4694){\circle*{100}}
\put(645,4782){\circle*{100}}
\put(671,4869){\circle*{100}}
\put(696,4957){\circle*{100}}
\put(722,5044){\circle*{100}}
\put(748,5140){\circle*{100}}
\put(774,5237){\circle*{100}}
\put(800,5333){\circle*{100}}
\put(825,5429){\circle*{100}}
\put(851,5525){\circle*{100}}
\put(877,5622){\circle*{100}}
\put(903,5718){\circle*{100}}
\put(903,5718){\circle*{100}}
\put(926,5810){\circle*{100}}
\put(948,5903){\circle*{100}}
\put(971,5995){\circle*{100}}
\put(994,6088){\circle*{100}}
\put(1016,6180){\circle*{100}}
\put(1039,6272){\circle*{100}}
\put(1061,6365){\circle*{100}}
\put(1084,6457){\circle*{100}}
\put(1104,6547){\circle*{100}}
\put(1124,6637){\circle*{100}}
\put(1144,6726){\circle*{100}}
\put(1164,6816){\circle*{100}}
\put(1184,6906){\circle*{100}}
\put(1204,6996){\circle*{100}}
\put(1224,7085){\circle*{100}}
\put(1244,7175){\circle*{100}}
\put(1264,7265){\circle*{100}}
\put(1284,7363){\circle*{100}}
\put(1304,7461){\circle*{100}}
\put(1324,7559){\circle*{100}}
\put(1344,7657){\circle*{100}}
\put(1365,7754){\circle*{100}}
\put(1385,7852){\circle*{100}}
\put(1405,7950){\circle*{100}}
\put(1425,8048){\circle*{100}}
\put(1445,8146){\circle*{100}}
\put(1445,8146){\circle*{100}}
\put(1463,8242){\circle*{100}}
\put(1481,8338){\circle*{100}}
\put(1499,8434){\circle*{100}}
\put(1517,8530){\circle*{100}}
\put(1535,8626){\circle*{100}}
\put(1554,8722){\circle*{100}}
\put(1572,8818){\circle*{100}}
\put(1590,8914){\circle*{100}}
\put(1608,9010){\circle*{100}}
\put(1626,9106){\circle*{100}}
\put(1626,9106){\circle*{100}}
\put(1642,9201){\circle*{100}}
\put(1659,9295){\circle*{100}}
\put(1675,9390){\circle*{100}}
\put(1691,9485){\circle*{100}}
\put(1708,9579){\circle*{100}}
\put(1724,9674){\circle*{100}}
\put(1741,9768){\circle*{100}}
\put(1757,9863){\circle*{100}}
\put(1773,9958){\circle*{100}}
\put(1790,10052){\circle*{100}}
\put(1806,10147){\circle*{100}}
\put(1821,10241){\circle*{100}}
\put(1836,10335){\circle*{100}}
\put(1851,10429){\circle*{100}}
\put(1866,10523){\circle*{100}}
\put(1881,10617){\circle*{100}}
\put(1897,10711){\circle*{100}}
\put(1912,10806){\circle*{100}}
\put(1927,10900){\circle*{100}}
\put(1942,10994){\circle*{100}}
\put(1957,11088){\circle*{100}}
\put(1972,11182){\circle*{100}}
\put(1987,11276){\circle*{100}}
\put(1987,11276){\circle*{100}}
\put(2001,11370){\circle*{100}}
\put(2015,11464){\circle*{100}}
\put(2029,11558){\circle*{100}}
\put(2043,11651){\circle*{100}}
\put(2057,11745){\circle*{100}}
\put(2071,11839){\circle*{100}}
\put(2084,11933){\circle*{100}}
\put(2098,12027){\circle*{100}}
\put(2112,12121){\circle*{100}}
\put(2126,12214){\circle*{100}}
\put(2140,12308){\circle*{100}}
\put(2154,12402){\circle*{100}}
\put(2168,12496){\circle*{100}}
\put(2168,12496){\circle*{100}}
\put(2181,12590){\circle*{100}}
\put(2194,12684){\circle*{100}}
\put(2207,12778){\circle*{100}}
\put(2219,12872){\circle*{100}}
\put(2232,12966){\circle*{100}}
\put(2245,13060){\circle*{100}}
\put(2258,13154){\circle*{100}}
\put(2271,13249){\circle*{100}}
\put(2284,13343){\circle*{100}}
\put(2297,13437){\circle*{100}}
\put(2309,13531){\circle*{100}}
\put(2322,13625){\circle*{100}}
\put(2335,13719){\circle*{100}}
\put(2348,13813){\circle*{100}}
\put(2348,13813){\circle*{100}}
\put(2360,13908){\circle*{100}}
\put(2372,14002){\circle*{100}}
\put(2384,14097){\circle*{100}}
\put(2396,14191){\circle*{100}}
\put(2408,14286){\circle*{100}}
\put(2420,14381){\circle*{100}}
\put(2432,14475){\circle*{100}}
\put(2445,14570){\circle*{100}}
\put(2457,14664){\circle*{100}}
\put(2469,14759){\circle*{100}}
\put(2481,14854){\circle*{100}}
\put(2493,14948){\circle*{100}}
\put(2505,15043){\circle*{100}}
\put(2517,15137){\circle*{100}}
\put(2529,15232){\circle*{100}}
\put(2529,15232){\circle*{100}}
\put(2540,15327){\circle*{100}}
\put(2552,15423){\circle*{100}}
\put(2563,15518){\circle*{100}}
\put(2574,15613){\circle*{100}}
\put(2586,15708){\circle*{100}}
\put(2597,15804){\circle*{100}}
\put(2608,15899){\circle*{100}}
\put(2620,15994){\circle*{100}}
\put(2631,16089){\circle*{100}}
\put(2642,16185){\circle*{100}}
\put(2653,16280){\circle*{100}}
\put(2665,16375){\circle*{100}}
\put(2676,16470){\circle*{100}}
\put(2687,16566){\circle*{100}}
\put(2699,16661){\circle*{100}}
\put(2710,16756){\circle*{100}}
\put(2721,16852){\circle*{100}}
\put(2731,16949){\circle*{100}}
\put(2742,17045){\circle*{100}}
\put(2752,17141){\circle*{100}}
\put(2763,17237){\circle*{100}}
\put(2774,17334){\circle*{100}}
\put(2784,17430){\circle*{100}}
\put(2795,17526){\circle*{100}}
\put(2805,17623){\circle*{100}}
\put(2816,17719){\circle*{100}}
\put(2826,17815){\circle*{100}}
\put(2837,17912){\circle*{100}}
\put(2848,18008){\circle*{100}}
\put(2858,18104){\circle*{100}}
\put(2869,18200){\circle*{100}}
\put(2879,18297){\circle*{100}}
\put(2890,18393){\circle*{100}}
\put(2890,18393){\circle*{100}}
\put(2900,18490){\circle*{100}}
\put(2910,18588){\circle*{100}}
\put(2920,18685){\circle*{100}}
\put(2930,18783){\circle*{100}}
\put(2940,18880){\circle*{100}}
\put(2950,18977){\circle*{100}}
\put(2960,19075){\circle*{100}}
\put(2970,19172){\circle*{100}}
\put(2981,19269){\circle*{100}}
\put(2991,19367){\circle*{100}}
\put(3001,19464){\circle*{100}}
\put(3011,19562){\circle*{100}}
\put(3021,19659){\circle*{100}}
\put(3031,19756){\circle*{100}}
\put(3041,19854){\circle*{100}}
\put(3051,19951){\circle*{100}}
\put(3061,20049){\circle*{100}}
\put(3071,20146){\circle*{100}}
\put(0,0){\circle*{100}}
\put(97,0){\circle*{100}}
\put(194,0){\circle*{100}}
\put(291,0){\circle*{100}}
\put(388,0){\circle*{100}}
\put(486,0){\circle*{100}}
\put(583,0){\circle*{100}}
\put(680,0){\circle*{100}}
\put(777,0){\circle*{100}}
\put(874,0){\circle*{100}}
\put(971,0){\circle*{100}}
\put(1068,0){\circle*{100}}
\put(1165,0){\circle*{100}}
\put(1263,0){\circle*{100}}
\put(1360,0){\circle*{100}}
\put(1457,0){\circle*{100}}
\put(1554,0){\circle*{100}}
\put(1651,0){\circle*{100}}
\put(1748,2){\circle*{100}}
\put(1845,4){\circle*{100}}
\put(1943,6){\circle*{100}}
\put(2040,8){\circle*{100}}
\put(2137,11){\circle*{100}}
\put(2234,13){\circle*{100}}
\put(2331,15){\circle*{100}}
\put(2428,17){\circle*{100}}
\put(2526,19){\circle*{100}}
\put(2623,21){\circle*{100}}
\put(2720,23){\circle*{100}}
\put(2817,25){\circle*{100}}
\put(2914,28){\circle*{100}}
\put(3011,30){\circle*{100}}
\put(3109,32){\circle*{100}}
\put(3206,34){\circle*{100}}
\put(3303,36){\circle*{100}}
\put(3400,38){\circle*{100}}
\put(3497,40){\circle*{100}}
\put(3595,42){\circle*{100}}
\put(3692,44){\circle*{100}}
\put(3789,47){\circle*{100}}
\put(3886,49){\circle*{100}}
\put(3983,51){\circle*{100}}
\put(4080,53){\circle*{100}}
\put(4178,55){\circle*{100}}
\put(4275,57){\circle*{100}}
\put(4372,59){\circle*{100}}
\put(4469,61){\circle*{100}}
\put(4566,64){\circle*{100}}
\put(4663,66){\circle*{100}}
\put(4761,68){\circle*{100}}
\put(4858,70){\circle*{100}}
\put(4955,72){\circle*{100}}
\put(4955,72){\circle*{100}}
\put(5052,76){\circle*{100}}
\put(5149,80){\circle*{100}}
\put(5247,85){\circle*{100}}
\put(5344,89){\circle*{100}}
\put(5441,93){\circle*{100}}
\put(5538,97){\circle*{100}}
\put(5635,102){\circle*{100}}
\put(5732,106){\circle*{100}}
\put(5830,110){\circle*{100}}
\put(5927,114){\circle*{100}}
\put(6024,119){\circle*{100}}
\put(6121,123){\circle*{100}}
\put(6218,127){\circle*{100}}
\put(6315,131){\circle*{100}}
\put(6413,136){\circle*{100}}
\put(6510,140){\circle*{100}}
\put(6607,144){\circle*{100}}
\put(6607,144){\circle*{100}}
\put(6704,153){\circle*{100}}
\put(6801,161){\circle*{100}}
\put(6898,170){\circle*{100}}
\put(6995,178){\circle*{100}}
\put(7093,187){\circle*{100}}
\put(7190,195){\circle*{100}}
\put(7287,204){\circle*{100}}
\put(7384,212){\circle*{100}}
\put(7481,221){\circle*{100}}
\put(7578,229){\circle*{100}}
\put(7675,238){\circle*{100}}
\put(7772,246){\circle*{100}}
\put(7870,255){\circle*{100}}
\put(7967,263){\circle*{100}}
\put(8064,272){\circle*{100}}
\put(8161,280){\circle*{100}}
\put(8258,289){\circle*{100}}
\put(8355,303){\circle*{100}}
\put(8452,317){\circle*{100}}
\put(8550,330){\circle*{100}}
\put(8647,344){\circle*{100}}
\put(8744,358){\circle*{100}}
\put(8841,372){\circle*{100}}
\put(8938,386){\circle*{100}}
\put(9035,399){\circle*{100}}
\put(9133,413){\circle*{100}}
\put(9230,427){\circle*{100}}
\put(9327,441){\circle*{100}}
\put(9424,455){\circle*{100}}
\put(9521,468){\circle*{100}}
\put(9618,482){\circle*{100}}
\put(9716,496){\circle*{100}}
\put(9813,510){\circle*{100}}
\put(9910,524){\circle*{100}}
\put(10007,537){\circle*{100}}
\put(10104,551){\circle*{100}}
\put(10202,565){\circle*{100}}
\put(10299,579){\circle*{100}}
\put(10396,592){\circle*{100}}
\put(10493,606){\circle*{100}}
\put(10590,620){\circle*{100}}
\put(10687,634){\circle*{100}}
\put(10785,648){\circle*{100}}
\put(10882,661){\circle*{100}}
\put(10979,675){\circle*{100}}
\put(11076,689){\circle*{100}}
\put(11173,703){\circle*{100}}
\put(11270,717){\circle*{100}}
\put(11368,730){\circle*{100}}
\put(11465,744){\circle*{100}}
\put(11562,758){\makebox(0,0){$\Diamond$}}
\put(11562,758){\circle*{100}}
\put(11659,781){\circle*{100}}
\put(11756,805){\circle*{100}}
\put(11854,828){\circle*{100}}
\put(11951,852){\circle*{100}}
\put(12048,875){\circle*{100}}
\put(12145,898){\circle*{100}}
\put(12242,922){\circle*{100}}
\put(12339,945){\circle*{100}}
\put(12437,969){\circle*{100}}
\put(12534,992){\circle*{100}}
\put(12631,1016){\circle*{100}}
\put(12728,1039){\circle*{100}}
\put(12825,1062){\circle*{100}}
\put(12922,1086){\circle*{100}}
\put(13020,1109){\circle*{100}}
\put(13117,1133){\circle*{100}}
\put(13214,1156){\circle*{100}}
\put(13214,1156){\makebox(0,0){$\Diamond$}}
\put(13214,1156){\circle*{100}}
\put(13311,1188){\circle*{100}}
\put(13408,1220){\circle*{100}}
\put(13505,1252){\circle*{100}}
\put(13602,1284){\circle*{100}}
\put(13700,1315){\circle*{100}}
\put(13797,1347){\circle*{100}}
\put(13894,1379){\circle*{100}}
\put(13991,1411){\circle*{100}}
\put(14088,1443){\circle*{100}}
\put(14185,1475){\circle*{100}}
\put(14282,1507){\circle*{100}}
\put(14379,1539){\circle*{100}}
\put(14477,1570){\circle*{100}}
\put(14574,1602){\circle*{100}}
\put(14671,1634){\circle*{100}}
\put(14768,1666){\circle*{100}}
\put(14865,1698){\circle*{100}}
\put(14865,1698){\makebox(0,0){$\Diamond$}}
\put(14865,1698){\circle*{100}}
\put(14962,1736){\circle*{100}}
\put(15059,1774){\circle*{100}}
\put(15157,1813){\circle*{100}}
\put(15254,1851){\circle*{100}}
\put(15351,1889){\circle*{100}}
\put(15448,1927){\circle*{100}}
\put(15545,1966){\circle*{100}}
\put(15642,2004){\circle*{100}}
\put(15740,2042){\circle*{100}}
\put(15837,2080){\circle*{100}}
\put(15934,2119){\circle*{100}}
\put(16031,2157){\circle*{100}}
\put(16128,2195){\circle*{100}}
\put(16225,2233){\circle*{100}}
\put(16323,2272){\circle*{100}}
\put(16420,2310){\circle*{100}}
\put(16517,2348){\makebox(0,0){$\Diamond$}}
\put(16517,2348){\circle*{100}}
\put(16614,2397){\circle*{100}}
\put(16711,2446){\circle*{100}}
\put(16809,2495){\circle*{100}}
\put(16906,2544){\circle*{100}}
\put(17003,2592){\circle*{100}}
\put(17100,2641){\circle*{100}}
\put(17197,2690){\circle*{100}}
\put(17294,2739){\circle*{100}}
\put(17392,2788){\circle*{100}}
\put(17489,2837){\circle*{100}}
\put(17586,2886){\circle*{100}}
\put(17683,2935){\circle*{100}}
\put(17780,2983){\circle*{100}}
\put(17877,3032){\circle*{100}}
\put(17975,3081){\circle*{100}}
\put(18072,3130){\circle*{100}}
\put(18169,3179){\circle*{100}}
\put(18169,3179){\makebox(0,0){$\Diamond$}}
\put(18169,3179){\circle*{100}}
\put(18266,3241){\circle*{100}}
\put(18363,3302){\circle*{100}}
\put(18461,3364){\circle*{100}}
\put(18558,3426){\circle*{100}}
\put(18655,3487){\circle*{100}}
\put(18752,3549){\circle*{100}}
\put(18849,3611){\circle*{100}}
\put(18946,3672){\circle*{100}}
\put(19044,3734){\circle*{100}}
\put(19141,3795){\circle*{100}}
\put(19238,3857){\circle*{100}}
\put(19335,3919){\circle*{100}}
\put(19432,3980){\circle*{100}}
\put(19529,4042){\circle*{100}}
\put(19627,4104){\circle*{100}}
\put(19724,4165){\circle*{100}}
\put(19821,4227){\circle*{100}}
\put(19821,4227){\makebox(0,0){$\Diamond$}}
\put(19821,4227){\circle*{100}}
\put(19918,4304){\circle*{100}}
\put(20015,4380){\circle*{100}}
\put(20113,4457){\circle*{100}}
\put(20210,4533){\circle*{100}}
\put(20307,4610){\circle*{100}}
\put(20404,4686){\circle*{100}}
\put(20501,4763){\circle*{100}}
\put(20598,4839){\circle*{100}}
\put(20696,4916){\circle*{100}}
\put(20793,4992){\circle*{100}}
\put(20890,5069){\circle*{100}}
\put(20987,5145){\circle*{100}}
\put(21084,5222){\circle*{100}}
\put(21181,5298){\circle*{100}}
\put(21279,5375){\circle*{100}}
\put(21376,5451){\circle*{100}}
\put(21473,5528){\circle*{100}}
\put(21473,5528){\makebox(0,0){$\Diamond$}}
\put(21473,5528){\circle*{100}}
\put(21570,5621){\circle*{100}}
\put(21667,5715){\circle*{100}}
\put(21764,5808){\circle*{100}}
\put(21861,5902){\circle*{100}}
\put(21959,5995){\circle*{100}}
\put(22056,6089){\circle*{100}}
\put(22153,6182){\circle*{100}}
\put(22250,6276){\circle*{100}}
\put(22347,6369){\circle*{100}}
\put(22444,6463){\circle*{100}}
\put(22541,6556){\circle*{100}}
\put(22638,6650){\circle*{100}}
\put(22736,6743){\circle*{100}}
\put(22833,6837){\circle*{100}}
\put(22930,6930){\circle*{100}}
\put(23027,7024){\circle*{100}}
\put(23124,7117){\circle*{100}}
\put(23124,7117){\makebox(0,0){$\Diamond$}}
\put(23124,7117){\circle*{100}}
\put(23211,7216){\circle*{100}}
\put(23298,7315){\circle*{100}}
\put(23385,7414){\circle*{100}}
\put(23472,7513){\circle*{100}}
\put(23559,7611){\circle*{100}}
\put(23646,7710){\circle*{100}}
\put(23733,7809){\circle*{100}}
\put(23820,7908){\circle*{100}}
\put(23907,8007){\circle*{100}}
\put(23993,8106){\circle*{100}}
\put(24080,8205){\circle*{100}}
\put(24167,8304){\circle*{100}}
\put(24254,8403){\circle*{100}}
\put(24341,8502){\circle*{100}}
\put(24428,8600){\circle*{100}}
\put(24515,8699){\circle*{100}}
\put(24602,8798){\circle*{100}}
\put(24689,8897){\circle*{100}}
\put(24776,8996){\circle*{100}}
\put(24776,8996){\makebox(0,0){$\Diamond$}}
\put(24776,8996){\circle*{100}}
\put(24848,9092){\circle*{100}}
\put(24920,9188){\circle*{100}}
\put(24991,9283){\circle*{100}}
\put(25063,9379){\circle*{100}}
\put(25135,9475){\circle*{100}}
\put(25207,9571){\circle*{100}}
\put(25279,9667){\circle*{100}}
\put(25351,9763){\circle*{100}}
\put(25422,9858){\circle*{100}}
\put(25494,9954){\circle*{100}}
\put(25566,10050){\circle*{100}}
\put(25638,10146){\circle*{100}}
\put(25710,10242){\circle*{100}}
\put(25782,10338){\circle*{100}}
\put(25853,10433){\circle*{100}}
\put(25925,10529){\circle*{100}}
\put(25997,10625){\circle*{100}}
\put(26069,10721){\circle*{100}}
\put(26141,10817){\circle*{100}}
\put(26213,10913){\circle*{100}}
\put(26284,11008){\circle*{100}}
\put(26356,11104){\circle*{100}}
\put(26428,11200){\makebox(0,0){$\Diamond$}}
\put(26428,11200){\circle*{100}}
\put(26489,11298){\circle*{100}}
\put(26550,11395){\circle*{100}}
\put(26612,11493){\circle*{100}}
\put(26673,11591){\circle*{100}}
\put(26734,11689){\circle*{100}}
\put(26795,11786){\circle*{100}}
\put(26856,11884){\circle*{100}}
\put(26917,11982){\circle*{100}}
\put(26979,12079){\circle*{100}}
\put(27040,12177){\circle*{100}}
\put(27101,12275){\circle*{100}}
\put(27162,12372){\circle*{100}}
\put(27223,12470){\circle*{100}}
\put(27285,12568){\circle*{100}}
\put(27346,12666){\circle*{100}}
\put(27407,12763){\circle*{100}}
\put(27468,12861){\circle*{100}}
\put(27529,12959){\circle*{100}}
\put(27591,13056){\circle*{100}}
\put(27652,13154){\circle*{100}}
\put(27713,13252){\circle*{100}}
\put(27774,13349){\circle*{100}}
\put(27835,13447){\circle*{100}}
\put(27896,13545){\circle*{100}}
\put(27958,13643){\circle*{100}}
\put(28019,13740){\circle*{100}}
\put(28080,13838){\makebox(0,0){$\Diamond$}}
\put(0,975){\circle*{100}}
\put(90,1031){\circle*{100}}
\put(180,1086){\circle*{100}}
\put(271,1145){\circle*{100}}
\put(361,1204){\circle*{100}}
\put(452,1268){\circle*{100}}
\put(542,1331){\circle*{100}}
\put(632,1399){\circle*{100}}
\put(722,1467){\circle*{100}}
\put(813,1540){\circle*{100}}
\put(903,1612){\circle*{100}}
\put(994,1689){\circle*{100}}
\put(1084,1766){\circle*{100}}
\put(1174,1848){\circle*{100}}
\put(1264,1929){\circle*{100}}
\put(1355,2016){\circle*{100}}
\put(1445,2102){\circle*{100}}
\put(1536,2194){\circle*{100}}
\put(1626,2285){\circle*{100}}
\put(1716,2382){\circle*{100}}
\put(1806,2478){\circle*{100}}
\put(1866,2546){\circle*{100}}
\put(1927,2614){\circle*{100}}
\put(1987,2682){\circle*{100}}
\put(2047,2754){\circle*{100}}
\put(2108,2825){\circle*{100}}
\put(2168,2897){\circle*{100}}
\put(2228,2972){\circle*{100}}
\put(2288,3048){\circle*{100}}
\put(2348,3123){\circle*{100}}
\put(2348,3123){\circle*{100}}
\put(2408,3202){\circle*{100}}
\put(2469,3282){\circle*{100}}
\put(2529,3361){\circle*{100}}
\put(2529,3361){\circle*{100}}
\put(2589,3444){\circle*{100}}
\put(2650,3527){\circle*{100}}
\put(2710,3610){\circle*{100}}
\put(2710,3610){\circle*{100}}
\put(2770,3697){\circle*{100}}
\put(2830,3785){\circle*{100}}
\put(2890,3872){\circle*{100}}
\put(2890,3872){\circle*{100}}
\put(2950,3963){\circle*{100}}
\put(3011,4054){\circle*{100}}
\put(3071,4145){\circle*{100}}
\put(3071,4145){\circle*{100}}
\put(3131,4241){\circle*{100}}
\put(3192,4336){\circle*{100}}
\put(3252,4432){\circle*{100}}
\put(3252,4432){\circle*{100}}
\put(3312,4532){\circle*{100}}
\put(3372,4631){\circle*{100}}
\put(3432,4731){\circle*{100}}
\put(3432,4731){\circle*{100}}
\put(3477,4809){\circle*{100}}
\put(3523,4887){\circle*{100}}
\put(3568,4965){\circle*{100}}
\put(3613,5043){\circle*{100}}
\put(3658,5125){\circle*{100}}
\put(3704,5206){\circle*{100}}
\put(3749,5288){\circle*{100}}
\put(3794,5369){\circle*{100}}
\put(3839,5454){\circle*{100}}
\put(3884,5539){\circle*{100}}
\put(3929,5624){\circle*{100}}
\put(3974,5709){\circle*{100}}
\put(4019,5797){\circle*{100}}
\put(4065,5886){\circle*{100}}
\put(4110,5974){\circle*{100}}
\put(4155,6062){\circle*{100}}
\put(4200,6154){\circle*{100}}
\put(4246,6246){\circle*{100}}
\put(4291,6338){\circle*{100}}
\put(4336,6430){\circle*{100}}
\put(4381,6526){\circle*{100}}
\put(4426,6622){\circle*{100}}
\put(4471,6717){\circle*{100}}
\put(4516,6813){\circle*{100}}
\put(4561,6912){\circle*{100}}
\put(4607,7012){\circle*{100}}
\put(4652,7111){\circle*{100}}
\put(4697,7210){\circle*{100}}
\put(4733,7292){\circle*{100}}
\put(4769,7375){\circle*{100}}
\put(4806,7457){\circle*{100}}
\put(4842,7540){\circle*{100}}
\put(4878,7622){\circle*{100}}
\put(4878,7622){\circle*{100}}
\put(4914,7708){\circle*{100}}
\put(4950,7793){\circle*{100}}
\put(4986,7879){\circle*{100}}
\put(5022,7964){\circle*{100}}
\put(5058,8050){\circle*{100}}
\put(5094,8139){\circle*{100}}
\put(5130,8228){\circle*{100}}
\put(5167,8316){\circle*{100}}
\put(5203,8405){\circle*{100}}
\put(5239,8494){\circle*{100}}
\put(5239,8494){\circle*{100}}
\put(5275,8586){\circle*{100}}
\put(5311,8678){\circle*{100}}
\put(5348,8770){\circle*{100}}
\put(5384,8862){\circle*{100}}
\put(5420,8954){\circle*{100}}
\put(5456,9049){\circle*{100}}
\put(5492,9144){\circle*{100}}
\put(5528,9240){\circle*{100}}
\put(5564,9335){\circle*{100}}
\put(5600,9430){\circle*{100}}
\put(5636,9528){\circle*{100}}
\put(5672,9627){\circle*{100}}
\put(5709,9725){\circle*{100}}
\put(5745,9824){\circle*{100}}
\put(5781,9922){\circle*{100}}
\put(5811,10007){\circle*{100}}
\put(5841,10092){\circle*{100}}
\put(5871,10177){\circle*{100}}
\put(5902,10262){\circle*{100}}
\put(5932,10347){\circle*{100}}
\put(5962,10432){\circle*{100}}
\put(5962,10432){\circle*{100}}
\put(5992,10520){\circle*{100}}
\put(6022,10607){\circle*{100}}
\put(6052,10695){\circle*{100}}
\put(6082,10783){\circle*{100}}
\put(6112,10870){\circle*{100}}
\put(6142,10958){\circle*{100}}
\put(6172,11049){\circle*{100}}
\put(6202,11139){\circle*{100}}
\put(6232,11230){\circle*{100}}
\put(6263,11321){\circle*{100}}
\put(6293,11411){\circle*{100}}
\put(6323,11502){\circle*{100}}
\put(6323,11502){\circle*{100}}
\put(6353,11596){\circle*{100}}
\put(6383,11689){\circle*{100}}
\put(6413,11783){\circle*{100}}
\put(6444,11877){\circle*{100}}
\put(6474,11970){\circle*{100}}
\put(6504,12064){\circle*{100}}
\put(6504,12064){\circle*{100}}
\put(6534,12161){\circle*{100}}
\put(6564,12257){\circle*{100}}
\put(6594,12354){\circle*{100}}
\put(6624,12450){\circle*{100}}
\put(6654,12547){\circle*{100}}
\put(6684,12643){\circle*{100}}
\put(6714,12743){\circle*{100}}
\put(6744,12842){\circle*{100}}
\put(6774,12942){\circle*{100}}
\put(6805,13042){\circle*{100}}
\put(6835,13141){\circle*{100}}
\put(6865,13241){\circle*{100}}
\put(6865,13241){\circle*{100}}
\put(6891,13329){\circle*{100}}
\put(6917,13417){\circle*{100}}
\put(6943,13505){\circle*{100}}
\put(6968,13594){\circle*{100}}
\put(6994,13682){\circle*{100}}
\put(7020,13770){\circle*{100}}
\put(7046,13858){\circle*{100}}
\put(7046,13858){\circle*{100}}
\put(7072,13949){\circle*{100}}
\put(7097,14039){\circle*{100}}
\put(7123,14130){\circle*{100}}
\put(7149,14221){\circle*{100}}
\put(7175,14312){\circle*{100}}
\put(7200,14402){\circle*{100}}
\put(7226,14493){\circle*{100}}
\put(7226,14493){\circle*{100}}
\put(7252,14586){\circle*{100}}
\put(7278,14680){\circle*{100}}
\put(7304,14773){\circle*{100}}
\put(7329,14867){\circle*{100}}
\put(7355,14960){\circle*{100}}
\put(7381,15054){\circle*{100}}
\put(7407,15147){\circle*{100}}
\put(7407,15147){\circle*{100}}
\put(7433,15243){\circle*{100}}
\put(7459,15340){\circle*{100}}
\put(7485,15436){\circle*{100}}
\put(7510,15532){\circle*{100}}
\put(7536,15628){\circle*{100}}
\put(7562,15725){\circle*{100}}
\put(7588,15821){\circle*{100}}
\put(7588,15821){\circle*{100}}
\put(7614,15920){\circle*{100}}
\put(7639,16019){\circle*{100}}
\put(7665,16118){\circle*{100}}
\put(7691,16218){\circle*{100}}
\put(7717,16317){\circle*{100}}
\put(7742,16416){\circle*{100}}
\put(7768,16515){\circle*{100}}
\put(7768,16515){\circle*{100}}
\put(7791,16604){\circle*{100}}
\put(7813,16693){\circle*{100}}
\put(7836,16782){\circle*{100}}
\put(7859,16872){\circle*{100}}
\put(7881,16961){\circle*{100}}
\put(7904,17050){\circle*{100}}
\put(7926,17139){\circle*{100}}
\put(7949,17228){\circle*{100}}
\put(7972,17320){\circle*{100}}
\put(7994,17412){\circle*{100}}
\put(8017,17503){\circle*{100}}
\put(8040,17595){\circle*{100}}
\put(8062,17687){\circle*{100}}
\put(8085,17779){\circle*{100}}
\put(8107,17870){\circle*{100}}
\put(8130,17962){\circle*{100}}
\put(8153,18056){\circle*{100}}
\put(8175,18151){\circle*{100}}
\put(8198,18245){\circle*{100}}
\put(8220,18340){\circle*{100}}
\put(8243,18434){\circle*{100}}
\put(8265,18528){\circle*{100}}
\put(8288,18623){\circle*{100}}
\put(8310,18717){\circle*{100}}
\put(8333,18814){\circle*{100}}
\put(8355,18911){\circle*{100}}
\put(8378,19008){\circle*{100}}
\put(8401,19105){\circle*{100}}
\put(8423,19201){\circle*{100}}
\put(8446,19298){\circle*{100}}
\put(8468,19395){\circle*{100}}
\put(8491,19492){\circle*{100}}
\put(8514,19592){\circle*{100}}
\put(8536,19691){\circle*{100}}
\put(8559,19791){\circle*{100}}
\put(8582,19890){\circle*{100}}
\put(8604,19990){\circle*{100}}
\put(8627,20089){\circle*{100}}
\put(8649,20189){\circle*{100}}
\put(8672,20288){\circle*{100}}
\put(8692,20379){\circle*{100}}
\put(8712,20470){\circle*{100}}
\put(8732,20561){\circle*{100}}
\put(8752,20652){\circle*{100}}
\put(8772,20742){\circle*{100}}
\put(8792,20833){\circle*{100}}
\put(8812,20924){\circle*{100}}
\put(8832,21015){\circle*{100}}
\put(8852,21106){\circle*{100}}
\put(0,325){\circle*{100}}
\put(90,337){\circle*{100}}
\put(180,349){\circle*{100}}
\put(271,362){\circle*{100}}
\put(361,374){\circle*{100}}
\put(452,387){\circle*{100}}
\put(542,400){\circle*{100}}
\put(632,413){\circle*{100}}
\put(722,426){\circle*{100}}
\put(813,440){\circle*{100}}
\put(903,454){\circle*{100}}
\put(994,469){\circle*{100}}
\put(1084,483){\circle*{100}}
\put(1174,498){\circle*{100}}
\put(1264,512){\circle*{100}}
\put(1355,527){\circle*{100}}
\put(1445,542){\circle*{100}}
\put(1536,558){\circle*{100}}
\put(1626,573){\circle*{100}}
\put(1716,589){\circle*{100}}
\put(1806,605){\circle*{100}}
\put(1897,622){\circle*{100}}
\put(1987,638){\circle*{100}}
\put(2078,655){\circle*{100}}
\put(2168,671){\circle*{100}}
\put(2258,689){\circle*{100}}
\put(2348,706){\circle*{100}}
\put(2439,724){\circle*{100}}
\put(2529,741){\circle*{100}}
\put(2620,760){\circle*{100}}
\put(2710,778){\circle*{100}}
\put(2800,797){\circle*{100}}
\put(2890,815){\circle*{100}}
\put(2981,834){\circle*{100}}
\put(3071,853){\circle*{100}}
\put(3162,873){\circle*{100}}
\put(3252,892){\circle*{100}}
\put(3342,912){\circle*{100}}
\put(3432,931){\circle*{100}}
\put(3523,952){\circle*{100}}
\put(3613,972){\circle*{100}}
\put(3704,993){\circle*{100}}
\put(3794,1013){\circle*{100}}
\put(3884,1035){\circle*{100}}
\put(3974,1056){\circle*{100}}
\put(4065,1078){\circle*{100}}
\put(4155,1099){\circle*{100}}
\put(4246,1121){\circle*{100}}
\put(4336,1143){\circle*{100}}
\put(4426,1166){\circle*{100}}
\put(4516,1188){\circle*{100}}
\put(4607,1211){\circle*{100}}
\put(4697,1233){\circle*{100}}
\put(4788,1257){\circle*{100}}
\put(4878,1280){\circle*{100}}
\put(4968,1304){\circle*{100}}
\put(5058,1327){\circle*{100}}
\put(5149,1352){\circle*{100}}
\put(5239,1376){\circle*{100}}
\put(5330,1401){\circle*{100}}
\put(5420,1425){\circle*{100}}
\put(5510,1450){\circle*{100}}
\put(5600,1475){\circle*{100}}
\put(5691,1501){\circle*{100}}
\put(5781,1526){\circle*{100}}
\put(5872,1552){\circle*{100}}
\put(5962,1578){\circle*{100}}
\put(6052,1605){\circle*{100}}
\put(6142,1631){\circle*{100}}
\put(6233,1658){\circle*{100}}
\put(6323,1684){\circle*{100}}
\put(6414,1711){\circle*{100}}
\put(6504,1738){\circle*{100}}
\put(6594,1766){\circle*{100}}
\put(6684,1794){\circle*{100}}
\put(6775,1822){\circle*{100}}
\put(6865,1850){\circle*{100}}
\put(6956,1879){\circle*{100}}
\put(7046,1907){\circle*{100}}
\put(7136,1936){\circle*{100}}
\put(7226,1965){\circle*{100}}
\put(7317,1994){\circle*{100}}
\put(7407,2023){\circle*{100}}
\put(7498,2053){\circle*{100}}
\put(7588,2083){\circle*{100}}
\put(7678,2113){\circle*{100}}
\put(7768,2143){\circle*{100}}
\put(7859,2174){\circle*{100}}
\put(7949,2205){\circle*{100}}
\put(8040,2236){\circle*{100}}
\put(8130,2267){\circle*{100}}
\put(8220,2299){\circle*{100}}
\put(8310,2330){\circle*{100}}
\put(8401,2362){\circle*{100}}
\put(8491,2394){\circle*{100}}
\put(8582,2427){\circle*{100}}
\put(8672,2459){\circle*{100}}
\put(8762,2492){\circle*{100}}
\put(8852,2524){\circle*{100}}
\put(8943,2558){\circle*{100}}
\put(9033,2591){\circle*{100}}
\put(9124,2625){\circle*{100}}
\put(9214,2658){\circle*{100}}
\put(9304,2692){\circle*{100}}
\put(9394,2726){\circle*{100}}
\put(9485,2761){\circle*{100}}
\put(9575,2796){\circle*{100}}
\put(9666,2831){\circle*{100}}
\put(9756,2866){\circle*{100}}
\put(9846,2901){\circle*{100}}
\put(9936,2936){\circle*{100}}
\put(10027,2972){\circle*{100}}
\put(10117,3008){\circle*{100}}
\put(10208,3045){\circle*{100}}
\put(10298,3081){\circle*{100}}
\put(10388,3118){\circle*{100}}
\put(10478,3154){\circle*{100}}
\put(10569,3191){\circle*{100}}
\put(10659,3228){\circle*{100}}
\put(10750,3266){\circle*{100}}
\put(10840,3303){\circle*{100}}
\put(10930,3341){\circle*{100}}
\put(11020,3379){\circle*{100}}
\put(11111,3418){\circle*{100}}
\put(11201,3456){\circle*{100}}
\put(11292,3495){\circle*{100}}
\put(11382,3534){\circle*{100}}
\put(11472,3574){\circle*{100}}
\put(11562,3613){\circle*{100}}
\put(11653,3653){\circle*{100}}
\put(11743,3692){\circle*{100}}
\put(11834,3732){\circle*{100}}
\put(11924,3772){\circle*{100}}
\put(12014,3813){\circle*{100}}
\put(12104,3854){\circle*{100}}
\put(12195,3895){\circle*{100}}
\put(12285,3936){\circle*{100}}
\put(12376,3978){\circle*{100}}
\put(12466,4019){\circle*{100}}
\put(12556,4061){\circle*{100}}
\put(12646,4102){\circle*{100}}
\put(12737,4145){\circle*{100}}
\put(12827,4187){\circle*{100}}
\put(12918,4230){\circle*{100}}
\put(13008,4273){\circle*{100}}
\put(13098,4316){\circle*{100}}
\put(13188,4359){\circle*{100}}
\put(13279,4403){\circle*{100}}
\put(13369,4446){\circle*{100}}
\put(13460,4490){\circle*{100}}
\put(13550,4534){\circle*{100}}
\put(13640,4579){\circle*{100}}
\put(13730,4623){\circle*{100}}
\put(13821,4668){\circle*{100}}
\put(13911,4713){\circle*{100}}
\put(14002,4759){\circle*{100}}
\put(14092,4804){\circle*{100}}
\put(14182,4850){\circle*{100}}
\put(14272,4895){\circle*{100}}
\put(14363,4942){\circle*{100}}
\put(14453,4988){\circle*{100}}
\put(14544,5035){\circle*{100}}
\put(14634,5081){\circle*{100}}
\put(14724,5128){\circle*{100}}
\put(14814,5175){\circle*{100}}
\put(14905,5223){\circle*{100}}
\put(14995,5270){\circle*{100}}
\put(15086,5318){\circle*{100}}
\put(15176,5366){\circle*{100}}
\put(15266,5415){\circle*{100}}
\put(15356,5463){\circle*{100}}
\put(15447,5512){\circle*{100}}
\put(15537,5561){\circle*{100}}
\put(15628,5610){\circle*{100}}
\put(15718,5659){\circle*{100}}
\put(15808,5709){\circle*{100}}
\put(15898,5759){\circle*{100}}
\put(15989,5809){\circle*{100}}
\put(16079,5859){\circle*{100}}
\put(16170,5910){\circle*{100}}
\put(16260,5960){\circle*{100}}
\put(16350,6011){\circle*{100}}
\put(16440,6062){\circle*{100}}
\put(16531,6114){\circle*{100}}
\put(16621,6165){\circle*{100}}
\put(16712,6217){\circle*{100}}
\put(16802,6268){\circle*{100}}
\put(16892,6321){\circle*{100}}
\put(16982,6373){\circle*{100}}
\put(17073,6426){\circle*{100}}
\put(17163,6478){\circle*{100}}
\put(17254,6531){\circle*{100}}
\put(17344,6584){\circle*{100}}
\put(17434,6638){\circle*{100}}
\put(17524,6692){\circle*{100}}
\put(17615,6746){\circle*{100}}
\put(17705,6800){\circle*{100}}
\put(17796,6854){\circle*{100}}
\put(17886,6908){\circle*{100}}
\put(17976,6963){\circle*{100}}
\put(18066,7018){\circle*{100}}
\put(18157,7074){\circle*{100}}
\put(18247,7129){\circle*{100}}
\put(18338,7185){\circle*{100}}
\put(18428,7240){\circle*{100}}
\put(18518,7297){\circle*{100}}
\put(18608,7353){\circle*{100}}
\put(18699,7410){\circle*{100}}
\put(18789,7466){\circle*{100}}
\put(18880,7523){\circle*{100}}
\put(18970,7580){\circle*{100}}
\put(19060,7638){\circle*{100}}
\put(19150,7695){\circle*{100}}
\put(19241,7753){\circle*{100}}
\put(19331,7811){\circle*{100}}
\put(19422,7869){\circle*{100}}
\put(19512,7927){\circle*{100}}
\put(19602,7986){\circle*{100}}
\put(19692,8045){\circle*{100}}
\put(19783,8104){\circle*{100}}
\put(19873,8163){\circle*{100}}
\put(19964,8223){\circle*{100}}
\put(20054,8282){\circle*{100}}
\put(20144,8342){\circle*{100}}
\put(20234,8402){\circle*{100}}
\put(20325,8463){\circle*{100}}
\put(20415,8523){\circle*{100}}
\put(20506,8584){\circle*{100}}
\put(20596,8645){\circle*{100}}
\put(20686,8707){\circle*{100}}
\put(20776,8768){\circle*{100}}
\put(20867,8830){\circle*{100}}
\put(20957,8891){\circle*{100}}
\put(21048,8954){\circle*{100}}
\put(21138,9016){\circle*{100}}
\put(21228,9079){\circle*{100}}
\put(21318,9141){\circle*{100}}
\put(21409,9204){\circle*{100}}
\put(21499,9267){\circle*{100}}
\put(21590,9331){\circle*{100}}
\put(21680,9394){\circle*{100}}
\put(21770,9458){\circle*{100}}
\put(21860,9522){\circle*{100}}
\put(21951,9587){\circle*{100}}
\put(22041,9651){\circle*{100}}
\put(22132,9716){\circle*{100}}
\put(22222,9781){\circle*{100}}
\put(22312,9846){\circle*{100}}
\put(22402,9911){\circle*{100}}
\put(22493,9977){\circle*{100}}
\put(22583,10042){\circle*{100}}
\put(22674,10109){\circle*{100}}
\put(22764,10175){\circle*{100}}
\put(22854,10242){\circle*{100}}
\put(22944,10308){\circle*{100}}
\put(23035,10375){\circle*{100}}
\put(23125,10442){\circle*{100}}
\put(23216,10509){\circle*{100}}
\put(23306,10576){\circle*{100}}
\put(23396,10644){\circle*{100}}
\put(23486,10712){\circle*{100}}
\put(23577,10781){\circle*{100}}
\put(23667,10849){\circle*{100}}
\put(23758,10918){\circle*{100}}
\put(23848,10986){\circle*{100}}
\put(23938,11055){\circle*{100}}
\put(24028,11124){\circle*{100}}
\put(24119,11194){\circle*{100}}
\put(24209,11263){\circle*{100}}
\put(24300,11333){\circle*{100}}
\put(24390,11403){\circle*{100}}
\put(24480,11474){\circle*{100}}
\put(24570,11544){\circle*{100}}
\put(24661,11615){\circle*{100}}
\put(24751,11686){\circle*{100}}
\put(24842,11757){\circle*{100}}
\put(24932,11828){\circle*{100}}
\put(25022,11900){\circle*{100}}
\put(25112,11972){\circle*{100}}
\put(25203,12044){\circle*{100}}
\put(25293,12116){\circle*{100}}
\put(25384,12189){\circle*{100}}
\put(25474,12261){\circle*{100}}
\put(25564,12334){\circle*{100}}
\put(25654,12407){\circle*{100}}
\put(25745,12481){\circle*{100}}
\put(25835,12554){\circle*{100}}
\put(25926,12628){\circle*{100}}
\put(26016,12702){\circle*{100}}
\put(26106,12777){\circle*{100}}
\put(26196,12851){\circle*{100}}
\put(26287,12926){\circle*{100}}
\put(26377,13000){\circle*{100}}
\put(26468,13076){\circle*{100}}
\put(26558,13151){\circle*{100}}
\put(26648,13227){\circle*{100}}
\put(26738,13302){\circle*{100}}
\put(26829,13378){\circle*{100}}
\put(26919,13454){\circle*{100}}
\put(27010,13531){\circle*{100}}
\put(27100,13607){\circle*{100}}
\put(27190,13684){\circle*{100}}
\put(27280,13761){\circle*{100}}
\put(27371,13838){\circle*{100}}
\put(27461,13915){\circle*{100}}
\put(27552,13993){\circle*{100}}
\put(27642,14071){\circle*{100}}
\put(27732,14149){\circle*{100}}
\put(27822,14227){\circle*{100}}
\put(27913,14306){\circle*{100}}
\put(28003,14384){\circle*{100}}
\put(28094,14464){\circle*{100}}
\put(28184,14543){\circle*{100}}
\put(28274,14623){\circle*{100}}
\put(28364,14702){\circle*{100}}
\put(28455,14782){\circle*{100}}
\put(28545,14862){\circle*{100}}
\put(28636,14942){\circle*{100}}
\put(28726,15022){\circle*{100}}
\put(28817,15103){\circle*{100}}
\put(-3303,15355){\makebox(0,0){s}}
\put(-3303,14452){\makebox(0,0){e}}
\put(-3303,13549){\makebox(0,0){c}}
\put(-3303,12646){\makebox(0,0){o}}
\put(-3303,11742){\makebox(0,0){n}}
\put(-3303,10839){\makebox(0,0){d}}
\put(-3303,9936){\makebox(0,0){s}}
%\put(13214,-1806){\makebox(0,0){Number of Verticies}}
\put(13214,-1996){\makebox(0,0){Number of Verticies}}
\put(4955,19872){\makebox(0,0){$n^{4}$}}
\put(9910,19872){\makebox(0,0){$n^{3}$}}
\put(26428,15355){\makebox(0,0){$n^{2}$}}
\put(19821,19872){\makebox(0,0){$\Diamond$:  Initialization Time}}
\end{picture}
\end{tabular}

		\end{center}
		\caption{Initialization Time versus Number of Vertices}
		\label{time}
	\end{figure}

\section{Conclusion}
	\label{conclusions}

	\hspace{1em}The marriage of parallel processing and genetic
	algorithms seems to be a reasonably effective tool for
	obtaining results for intractable problems.  The method
	presented is a somewhat crude tool; however, with refinement,
	it has the potential of becoming an even more valuable problem
	solving heuristic.  As there was no comparison between the
	presented algorithm and an equivalent exhaustive search
	technique, few, if any, conclusions can be made about the
	superiority of one method over the other.  The performance of a
	traditional exhaustive search method is known to have a speedup
	linearly proportional to the number of processors working in
	concert on the problem.  Genetic algorithms do not provide any
	speedup; however, the results generated by this implementation
	encourage the conclusion that genetic algorithms are a valuable
	search tool.

	Guy's boundary formula \cite{GUY72} was an outgrowth of his
	construction method which placed the graph vertices in a
	triangular pattern.  The final mappings provided by the genetic
	algorithm are very close to the results one would expect using
	Guy's method.  These results increase the confidence in the
	usefulness and correctness of the genetic algorithm presented.
	The fact that the genetic algorithm obtained results for
	$K_{12}$ and $K_{13}$ that were better than those conjectured
	by Guy \cite{GUY72} is very exciting.  The results we have
	produced show that what was conjectured as an equality more
	than 20 years ago is merely a loose upper bound which can
	possibly be tightened in the future.

\section{Future Work}
	\label{future}

	\hspace{1em}As with any project, extensions and modifications
	can be made to increase its utility and/or its performance.  As
	it stands, this project is limited to the rectilinear crossing
	problem.  With minor modification, the program could handle
	more general cases of rectilinear graphs, or with more effort,
	it could explore the general instances of the crossing
	problem.

	A further, and perhaps more significant experiment would be to
	make use of the general characteristics of ``good'' solutions.
	For instance, the results produced by the program have distinct
	characteristics which could be exploited in generating the
	initial population(s).  Research into the representation of the
	solution should also be performed.  A genetic algorithm is only
	as good as its solution representation~\cite{HINE92}.  It is
	possible that the representation used for this project is not
	the best available, but without further investigation, this
	point is unclear.

	Genetic algorithms are designed to provide acceptable results
	within a reasonable amount of time.  Improving the performance
	of the genetic algorithm requires examination of the sorting
	methods, random number generation, communication, and the cost
	evaluation function.  One improvement to the implementation
	would be to sort the vertices of the graph to help reduce
	error-checking time.  Another area of investigation for
	improving performance is to show the effects of various
	parameters on convergence time.

	At the moment, the current implementation of the parallel
	genetic algorithm is a fairly crude tool.  However, even this
	simple heuristic seems to provide excellent results.  Further
	refinement and experimentation needs to be done in order to
	create a more robust program.  Additionally, development of an
	exhaustive search method to solve the rectilinear crossing
	problem would provide a reasonable standard to compare the
	results of the genetic algorithm with.  Such a standard for
	comparison would prove invaluable to determining the
	desirability of using one heuristic over another.

\section*{Remarks}
	\hspace{1em}In private Communication which began after this
	paper was submitted, Geoffrey Exoo\cite{exoo} informed us of
	some very nice results for the Rectilinear Minimal Crossing
	problem which improve upon some of the results we have
	presented, and go well beyond the size of problems we have
	considered.

\quad
\baselineskip=12pt
\parindent=0pt
%\bibliography{/home/phd/fredh/papers/bibdir/xing}

\begin{thebibliography}{10}

\bibitem{BLAZ64}
J.~Bla\u{z}ek and M.~Koman.
\newblock A minimal problem concerning complete plane graphs.
\newblock In M.~Fiedler, editor, {\em Theory of Graphs and its Applications},
  pages 113--117. Academic Press, New York, 1964.

\bibitem{CHAN87}
K.C. Chang.
\newblock Efficient algorithms for layer assignment problems.
\newblock {\em IEEE Trans. on Computer Aided Design of Integrated Circuits and
  Systems}, 6(1):67--71, January 1987.

\bibitem{CHAR86}
G.~Chartrand and L.~Lesniak.
\newblock {\em Graphs and Digraphs}.
\newblock Wadsworth \& Brooks/Cole Advanced Books \& Software, Monterey, CA,
  2nd. edition, 1986.

\bibitem{DAVI91}
L.~Davis, editor.
\newblock {\em Handbook of Genetic Algorithms}.
\newblock Van Nostrand Reinhold, New York, 1991.

\bibitem{exoo}
G.~Exoo.
\newblock Private Communication, results to be submitted for publication soon.

\bibitem{GARE82}
M.R. Garey and D.S. Johnson.
\newblock {\em Computers and Intractability: A Guide to the Theory of
  {NP-Completeness}}.
\newblock W.H. Freeman and Company, New York, 1982.

\bibitem{GOLD89}
D.E. Goldberg.
\newblock {\em Genetic Algorithms in Search, Optimization, and Machine
  Learning}.
\newblock Addison-Wesley, Reading, MA, 1989.

\bibitem{GUY72}
R.K. Guy.
\newblock A minimal problem concerning complete plane graphs.
\newblock In Y.~Alavi, D.R. Lick, and A.T. White, editors, {\em Graph Theory
  and Applications}, pages 111--124, Berlin, 1972. Springer-Verlag.

\bibitem{GUY92}
R.K. Guy, November 24, 1992.
\newblock Private Communication with R.P. Pargas.

\bibitem{HINE92}
J.~Hines, J.T. Thorpe, and K.B. Winiecki.
\newblock Solving quadratic assignment problems through parallel genetic
  algorithms.
\newblock Unpublished Tech Report, Clemson University, May 1992.

\bibitem{JOHN82}
D.S. Johnson.
\newblock The {NP-Completeness} column: an ongoing guide.
\newblock {\em Journal of Algorithms}, 3(1):89--99, March 1982.

\bibitem{WANG89}
Y.~Wang, R.C.T. Lee, and J.S. Chang.
\newblock The number of intersections between two rectangular paths.
\newblock {\em IEEE Trans. on Computers}, 38(11):1564--1571, November 1989.

\end{thebibliography}
\end{document}
