Devon Doyle

Welcome to my portfolio!

This is the old version of my website from when I first learned how to write HTML and CSS. Click my picture to go back to the new version!

I'm a student of the University of Michigan class of 2022. Go Blue!
I created this portfolio website from scratch as a project to learn the basics of HTML, CSS, and JavaScrpit.

I am a dedicated student pursuing Bachelor's degrees in Computer Science and Economics. I have experience in competitive leadership, critical thinking, strategizing, and project coordination. I am actively seeking professional connections and experience via internships. Check out some of my projects under the "Projects" dropdown.



Feel free to contact me by any means. Also, visit my LinkedIn page!

Evolutionary Neural Network

As an ongoing independent project from late high school, I decided to program an artificially-evolving neural network simulator using basic creatures in a predefined environment. I took inspiration from several other community programmers who made similar programs. This was my first attempt at using a neural network to facilitate fitness-based evolution.

The Environment

The environment of the simulation is a 100 by 100 grid of tiles, generated by a user-created .png image of the desired layout. The program reads the pixels' colors and decides if it is a water or land tile. The example shown here is a map that is mostly covered with land, with some minor water bodies providing boundaries and obstacles. Each tile contains a certain amount of food, a regeneration rate, and a cooldown timer for restarting the food regeneration process after it is completely depleted to discourage stagnant creatures.

Each tile can either be land or water. Water tiles have no food and no regeneration, so it is extremely disadvantageous for a creature to remain in the water for a long period of time. The goal of this is to encourage the evolution of water-avoidant traits.

Meet The Creatures!

Shown here is an example of a creature in the simulator. Each creature has several sensors, which help it identify certain aspects of the environment, like the amount of food around it or if there is another creature nearby. These sensors are the source of input to the creature's neural network and help determine what actions the creature will take.

Creatures that are successful at staying alive and feeding can produce offspring with slightly mutated genes, which imitates random genetic variation in humans.

Neural Network Design

Each creature’s intelligence is determined by its internal neural network system. The values of the inputs and hidden layers represent the neurons, while the connections between them represent the axons of the network. A network of n countable neuron layers must have n - 1 axon layers. This closely resembles neural interaction in the human nervous system.

My simulation uses a feedforward neural nework design. In a feedforward design, input values are multiplied, summed, and run through a sigmoid function into hidden layers of values, which are then multiplied, summed, and run through sigmoid functions between each other as needed and finally into an output layer of values.

To the right is a visualization of my network design for these creatures. The neuron values are shown as numbers, with axon lines ranging from black (negative axon) to white (positive axon). Empty values are spaces left for future additions.

Feedback System

In order for actual evolution in behavior to occur, some form of feedback from the environment is required. In this model, environmental fitness is the source of feedback. Creatures with a greater suitability to survive (fitness) are more likely to reproduce, passing on their network qualities. Over time, the networks of more-suitable creatures will dominate the landscape, and newly-developed traits among those suitable creatures will cause disruptions in any equilibrium that is established, leading to further refinement of the network pool as competition for resources drives evolution.

Observed Traits

One of the most prevalent traits that can be seen in the simulator is the avoidance of disadvantageous tiles. Many creatures, in a map that includes bodies of water, will adapt to avoid water and tiles with little food. Being in these areas is disadvantageous because, while the creatures constantly decay, they will have no source of food.

Here is an example of a creature with a neural network that learned to change direction or avoid water or foodless tiles completely when it encountered them. Some creatures tend to back away, some choose to speed up to get through, and some exhibit a combination of the two.

Creature Count and Gene Evolution

As the simulation runs, it keeps track of how many creatures were alive and their genes through time. Creatures will similar neural networks will have similar colors for easy visual identification. Once certain suitable creatures grow in population to dominate the environment, resources become scarce and the population decreases, giving rise to new, more suitable populations.

In this example, dark green and dark pink/purple creatures dominated for a period of time. Once resources ran out, a period of turbulence followed as other more-suitable populations grew out of the scarcity, leading to descendants of the pink/purple populations to grow. Once those descendants grew to capacity and used up the newly available resources, more turbulence ensued which gave rise to yet another more-suitable descendant population of the purple neural network traits. This process repeats over and over again and is the driving force behind the neural network evolution. Watching the graphs reflecting this phenomenon in real time is truly fascinating, and I am very proud of these results!


Although this program has successfully achieved basic creature instincts, this network design has some important limitations. This is evolution with fixed topologies. In other words, since every creature has the same neural network structure, significant innovation is extremely difficult and time consuming. Stay tuned, as I am currently working on a project with neural networks that don't only evolve through numerical values, but in their very structure as well!

Try it Yourself!

If you are interested, feel free to download and run this simulation for yourself. You can find it on my GitHub page, which is linked in the menu. Run the "NeuralNetLatest.jar" file. I'm sure you will enjoy watching and interacting with the creatures of the simulation!

Motion Profile Mapper

In my final year of high school, as lead programmer of FRC Team 3539, my main goal was to develop an application that creates paths on the field that the robot could read and follow based solely on user input. In the first 15 seconds of every game, the robot needed to move by itself, and instead of hard-coding motor speeds and times manually, this application guided the robot along a set path. This was easier to use and allowed us to be more versatile during competitions, where the ability to change based on your teammates' needs was essential. I am extremely grateful to our mentor, Mr. VanCamp, who provided framework and guidance and was absolutely essential in our journey to reaching the end product.

The User Interface

In the game for 2018, there were obstacles on the field (shown as green, red, and yellow boxes) that needed to be traversed autonomously. We could only stand back and watch as the robot moved on its own, without any human input. All robot movement was guided by the paths generated in this program, as seen in the demonstration.

The user creates points on the chart that the robot should follow, and the program uses those points to create two separate paths, one for each side of the robot.

Velocity Calculation

After two splines are generated for the left and right sides of the robot, the application then creates a complete guide of velocity values that the robot should apply to its motors in order to accurately follow the path. This was an especially difficult task, since the motors have physical limitations beyond what might be mathematically possible.

Some issues that we had to work around were the minor physical differences between motors, the need to ramp-up and ramp-down velocities for optimal performance (including battery saving), and possible variations in actual field measurements from competition to competition.

Shown here are the corresponding velocity maps for the left and right sides of the robot. This data was generated from the demonstrated path above! Turns are indicated by an increase in velocity for one side and a decrease in velocity for the other side.

Competition Versatility

During competition, we were often paired with teammates that had autonomous plans that conflicted with ours. For example, both of our robot paths could end up colliding during the game, which could break the robots. In those cases, instead of having to re-code, debug, and test new plans (which was impossible given competition time constraints), we simply opened up the motion profile mapper, drew a new path according to their needs, and had everything ready to go within minutes. This proved to be critical to our success in many matches.

Proper Programming

One major difference between this project and my other projects at the time was the necessity of programming professionally. Upon graduation, this application was going to be passed down to future programmers on the team to improve and maintain for years to come. Because of that, I needed to make sure that all code that I wrote was clean, easy to follow, and properly documented. This, of course, is much easier said than done. However, this was where I developed most of my good programming practices, which have influenced the structures of my future projects. This application is still used by team programmers today!

Use the menu link to my GitHub page to find the version of the mapper that I last modified before graduating. Feel free to download it and test it out! Here you can watch our robot following a motion profile path live at the FRC State Championship in Michigan. Watch team 3539 for the first 15 seconds!

Performance Video

Song Guesser Web Application

In my first year at the University of Michigan, my team and I created a website application as a final project called "DJ 183." The website consisted of several important programming skills: a back-end python server, a front-end website with HTML, information obtained through a public API, and database utilization. The implementation and features of this project were entirely up to our group. Unfortunately, this is no longer online for public use to prevent future students from stealing our code and using it as their own work. However, the code is stored in a private GitHub repository on my GitHub page (linked in the menu), so I can share it upon request. You can see the bare bones of the website here.

Custom-Designed Websites

I have offered my programming skills to some local businesses in the Romeo, Michigan area to create unique, detailed websites to their liking that suit their businesses and help them better connect to their clients and the community. Here are some links to those websites that I created from scratch.

Midwest Stairs / Wolverine Finish Carpentry

Midwest Stairs (with sister company Wolverine Finish Carpentry) is a local carpentry business that does custom interior projects for clients' homes. This website was essential to helping them centralize their information and provided accessibility to their business. Done in summer 2020, this was the first website I created for a business. The greatest challenge for this project was learning how to create a website that functioned and looked professional on both mobile and PC devices.

Currently in Development

I am currently working on custom portfolio websites for some film students. They will be added here when they are complete!