## HW6 Genetic Algorithms

### Evolved Sorting Networks

**Due: Monday April 29 at 11:59pm**

Develop a genetic algorithm to find a sorting network capable of sorting 16 elements.
It's possible for a sorting network to do comparisons in parallel, but for the homework, we will assume that all comparisons occur serially. A serial sorting network can be encoded as an ordered list of pairs. Each
pair represents a comparison and potential swap of inputs.
For instance (3,5) denotes swapping the element at position 3 with the element at position 5 if the element at position 3 is greater (assuming we are attempting to sort in ascending order). A bubble sort over a six
element sorting network could be encoded:

**
(6,5)(5,4)(4,3)(3,2)(2,1)
(6,5)(5,4)(4,3)(3,2)
(6,5)(5,4)(4,3)
(6,5)(5,4)
(6,5)
**

Recall the basics of genetic algorithms:

- Generate
*n* random solutions: *G*_{i}.
- Evaluate all solutions with the fitness functions Φ()
- Select (with replacement)
*m* of the solutions for survival with probability of
selection proportional to the relative fitness of the solutions:
*P(select(G*_{i})) = Φ(G_{i})/Σ_{j} Φ(G_{j})
- Repeatedly select two survivors and combine them through crossover to generate
*n* new solutions:
*G'*_{i}
- Optionally,
*k* of the new generation can be copies of the most fit solutions from the previous generation instead of combinations.
- Traverse each solution and mutate each subsection with (low) probability
*P*_{mut}.
- Repeat from step 2.

It is impractical to evaluate all *n* networks on all possible combinations of inputs, even with
limited length. Therefore, your fitness function should be evaluated over a subset of the inputs.
In addition to maintaining a pool of solutions, you should also maintain a pool of inputs.
To
prevent your networks from evolving to only solve all but the most difficult inputs, co-evolve the inputs
alongside the solutions. The fitness of the inputs (which can be seen as parasites) should be determined by the number of
solutions that sort it incorrectly. This way, the fitness function will adapt to force solutions to
answer all inputs.

You are responsible for deciding how to handle crossover and
mutation. You should use some method to encourage shorter solutions.

Please prepare and submit a well-written report with the following:

- A description of your algorithm. Be sure to describe your mutation and selection strategies.
- A graph showing best solution performance over generation.
- A graph showing best solution length over generation.
- A final successful solution.
- A discussion of how close your best sorting networks is to the optimum one (which is of length nlogn).

The report should be in pdf format and should contain your name, email and EID. The command to submit will be something like: turnin --submit lewfish hw6.