Computational intelligence is a field of artificial intelligence concerned with so-called heuristic algorithms, which aim to produce good solutions to problems in a reasonable amount of time. These algorithms are widely used for several real world applications, e.g., routing problems; assignment and scheduling problems; medical, biomedical and bioinformatics problems; forecasting problems; etc. More recently, they have also started to be used to help solving software engineering problems. In particular, software systems have become ever larger and more complex, making software engineering tasks such as software project planning, software testing and maintenance increasingly costly and error prone. Many of these tasks can be formulated as problems that can be solved with the help of computational intelligence. If properly designed, computational intelligence approaches can be used as decision support tools to increase software development cost-effectiveness and improve software quality.
This module teaches computational intelligence approaches that can be applied to problems from several different domains. It also explores the synergies between computational intelligence and software engineering. It explains (1) software engineering problems that can be solved with the help of computational intelligence, (2) when and why computational intelligence is important for solving these problems, (3) how to formulate these problems in order to use computational intelligence approaches to solve them, (4) what computational intelligence approaches can be used to solve these problems, (5) how these approaches work and (6) how to use these approaches.
In particular, this module explains both optimisation and machine learning approaches. Optimisation problems are concerned with finding a solution that achieves one or more pre-defined goals. For example, software test case generation can be seen as the problem of finding a set of test cases that maximise code coverage and minimise testing effort. Computational intelligence algorithms such as evolutionary algorithms inspired by Darwin's evolutionary theory can be used to solve this problem, saving the time to create a good set of test cases manually and helping to improve software quality.
Machine learning problems are concerned with creating models able to infer knowledge from data. For example, models can be created to learn the relationship between software code metrics and information on whether the corresponding piece of code contains bugs or not. These models can then be used to predict whether new pieces of code are likely to contain bugs, providing an insight into what pieces of code require more or less testing effort. Computational intelligence algorithms such as naive bayes can be used to solve this problem.