Phenomena from mathematics and computer science such as cellular automata, random graphs, and some instances of evolutionary computation and artificial life exhibit features of self-organization. In swarm robotics, self-organization is used to produce emergent behavior. In particular the theory of random graphs has been used as a justification for self-organization as a general principle of complex systems. In the field of multi-agent systems, understanding how to engineer systems that are capable of presenting self-organized behavior is an active research area. Optimization algorithms can be considered self-organizing because they aim to find the optimal solution to a problem. If the solution is considered as a state of the iterative system, the optimal solution is the selected, converged structure of the system. Self-organizing networks include small-world networks self-stabilization and scale-free networks. These emerge from bottom-up interactions, unlike top-down hierarchical networks within organizations, which are not self-organizing. Cloud computing systems have been argued to be inherently self-organising, but while they have some autonomy, they are not self-managing as they do not have the goal of reducing their own complexity.