Self-adaptation enables a software system to execute successfully under situations that are unknown during design time. An adaptive software system thus can handle situations at run time such as the actual environment the system faces during operation, whether or not the software still has bugs, as well as when and how the requirements may change. To this end, adaptive software systems reconfigure their structure or modify their behaviour at run-time in response to their perception of themselves, their environment, and their requirements.
As an example, a cloud system during run time may face an unexpected change in its workload, such as a radical increase in the number of users that simultaneously access the system. As a consequence, the cloud system in its current configuration is not able to handle such workload and thus cannot satisfy its response time requirements. To handle this situation, the cloud systems thus may dynamically add additional compute resources to handle the increased workload.