Everything is theoretically impossible, until it is done.
- Robert A. Heinlein


Solving real-world problems applying classical algorithms and data structures. The key to success is using the right type of technique, such as dynamic programming or greedy algorithms. These algorithms are usually supported by appropriate data structures, such as various kinds of trees, heaps or graphs.


Finding the best approximation of optimal result for hard problems that are infeasible for classical algorithms. Frequently, some optimization algorithms can get stuck in a local optimum, as in the case of hill climbing. To overcome this, we have to employ modifications such as introducing randomness or pruning candidates.


Using artificial intelligence algorithms for playing various turn-based games. Decision-based solutions, such as the minimax algorithm, search for the best possible outcome. In the case of complex games with many possible moves, we must utilize branch pruning or exploit random sampling in Monte Carlo methods.


Creating solutions that can learn without being explicitly programmed. Constructed algorithms can make predictions or decisions by building a model from sample input data. Machine learning is usually employed in tasks where classical solutions are infeasible or difficult to design.


Creating optimization algorithms inspired by biological evolution. Improving a population of solutions from generation to generation by rewarding desired specimens and introducing small random changes reflecting natural selection and mutation. As a consequence, the population gradually evolves, leading to an increase in overall fitness.


Implementing inspired by nature, decentralized, self-organizing systems consisting of population of simple agents. Individual agents follow very simple rules without centralized control dictating their actions. Local interactions between agents and the environment lead to the emergence of complex global behavior.