Evolutionary Algorithms are randomized optimization methods. They are inspired by principles of biological evolution, however, applied in a technical context for the solution of mathematical or technical optimization problems.

These population-based methods apply the principles of inheritance, variation, and the "survival of the fittest" to candidate solutions. The resulting search heuristics are applicable to a wide variety of application problems. They are conceptually relatively simple and often easy to implement. Their analysis requires elaborate tools and quickly becomes intractable. Evolutionary search is often applied to the approximate solution of hard optimization tasks for which efficient problem-specific solvers are not available.

The course starts out with a basic model of an evolutionary algorithm. Departing from this model students will learn about various aspects of evolutionary optimization on discrete and continuous search spaces, from which a systematic taxonomy of modular components will be developed.


The course consists of a two hours/week lecture and an accompanying two hours/week practical course. The course will be in English.


The course is designed for Master students of the Angewandte Informatik program. The lecture Mathematics for Modeling and Data Analysis is strongly recommended as a background:

Participants should be familiar with linear algebra and elementary probability theory. For example, students should be well acquainted with the following terms:

  • vector, basis, linear function, linear map, matrix
  • norm, inner product, orthogonal
  • probability, distribution, density, quantile
  • normal distribution, expectation, variance, covariance

More advanced mathematical material will be introduced as needed.


The course is accompanied by regular homework assignments, some of which will involve programming tasks in Python. All homework assignments are distributed and handed in in the form of Jupyter notebooks.


Die Stu­die­ren­den haben grund­le­gen­de Fä­hig­kei­ten und Tech­ni­ken, um ne­ben­läu­fi­ge Pro­gram­me si­cher ent­wi­ckeln zu kön­nen. Sie ken­nen soft­ware­tech­ni­sche Ent­wurfs­mus­ter, wel­che be­kann­te Pro­ble­me bei ne­ben­läu­fi­gen Pro­gram­men wie zum Bei­spiel die Ver­klem­mung ver­mei­den las­sen. Die Teil­neh­mer kön­nen

  • die Per­form­anz von Pro­gram­men durch den Ein­satz der ne­ben­läu­fi­gen Pro­gram­mie­rung ver­bes­sern,
  • be­ste­hen­de Pro­gram­me ana­ly­sie­ren und mög­li­che Feh­ler er­ken­nen und
  • die Sprach­merk­ma­le und Schnitt­stel­len von JAVA für die ne­ben­läu­fi­ge Pro­gram­mie­rung si­cher an­wen­den.


Mo­der­ne Hard­ware-Ar­chi­tek­tu­ren las­sen sich nur durch den Ein­satz ne­ben­läu­fi­ger Pro­gram­me rich­tig aus­nut­zen. Die ne­ben­läu­fi­ge Pro­gram­mie­rung ga­ran­tiert bei rich­ti­ger An­wen­dung eine op­ti­ma­le Aus­las­tung der Hard­ware. Je­doch sind mit einem sorg­lo­sen Ein­satz die­ser Tech­nik auch viele Ri­si­ken ver­bun­den. Die Ver­an­stal­tung stellt Vor­tei­le und Pro­ble­me ne­ben­läu­fi­ger Pro­gram­me dar und zeigt, wie sich die Per­form­anz von Pro­gram­men ver­bes­sern lässt:

  • Ne­ben­läu­fig­keit: Schnell­ein­stieg
    • An­wen­dun­gen vs. Pro­zes­se
    • Pro­gram­me und ihre Aus­füh­rung
    • Vor­tei­le & Pro­ble­me von ne­ben­läu­fi­gen Pro­gram­men
      • Ver­bes­se­rung der Per­form­anz
      • Syn­chro­ni­sa­ti­on
      • Rea­li­sie­rung kri­ti­scher Ab­schnit­te
      • Mo­ni­to­re
      • Le­ben­dig­keit
      • Ver­klem­mun­gen
  • Thre­ads in Java
  • UML-Mo­del­lie­rung von Ne­ben­läu­fig­keit
  • Neues zur Ne­ben­läu­fig­keit in Java 5 und Java 6
  • Rea­li­sie­rung von Ne­ben­läu­fig­keit
  • Fort­ge­schrit­te­ne Ja­va-Kon­zep­te für Ne­ben­läu­fig­keit