The human being has since the beginning of time always strived to solve the problems she encounters. While the earlier problems often were about creating tools to make everyday life easier, the problems of today tends to be to solve different kinds of calculations or make different kinds of diagnosises. When the number of factors affecting the problem increases linearly, the number of possible solutions tends to increase exponentially. This in turn implies that in many cases it isn’t even possible to solve a problem exactly within a reasonable time frame, and that’s why the use of optimization comes into the picture. Even a problem that appears to be fairly simple might lead to a search space so large that it will take several billions of years to search through even a portion of it using traditional methods. To guarantee an optimal solution there is simply no other way than to search through the search space in its entirety. This dissertation aims to give an introduction to common heuristic and genetic optimization techniques. We are going to show that by using any of these techniques makes it possible to find a near optimal solution within a few seconds, depending on the complexity of the problem. The use of these techniques can in many cases be a necessity for finding a solution at all within a reasonable time frame. Optimization in general is a very large area that not only involves computer science, and it is not possible to cover all of it in a dissertation like this. This dissertation aims to open the door and take the first step into this interesting world that many times is ruled by randomness.