Hello, dear friend, you can consult us at any time if you have any questions, add WeChat: daixieit

Evolutionary Computation 2023/2024

Lab 2: Time Series Prediction with GP

Released: February 26, 2024

Deadline: March 18, 2024

Weight: 25 %

You need to implement one program that solves Exercises 1-3 using any programming language. In Exercise 5, you will run a set of experiments and describe the result using plots and a short discussion.

(In the following, replace abc123 with your username.) You need to submit one zip file with the name ec2024-lab2-abc123.zip. The zip file should contain one directory named ec2024-lab2-abc123 containing the following files:

• the source code for your program

• a Dockerfile (see the appendix for instructions)

• a PDF file for Exercises 4 and 5

In this lab, we will do a simple form of time series prediction.  We assume that we are given some historical data, (e.g. bitcoin prices for each day over a year), and need to predict the next value in the time series (e.g., tomorrow’s bitcoin value).

We formulate the problem  as  a regression problem.   The  training  data  consists  of  a  set  of  m input vectors X =  (x(0) ,..., x(m−1)) representing historical data, and a set of m output values Y = (x(0) ,..., x(m−1)), where for each 0 j m — 1, x(j)  e Rn  and y(j)  e R.  We will use genetic programming to evolve a prediction model f : Rn R, such that f(x(j)) ~ y (j) .

Candidate solutions, i.e. programs, will be represented as expressions, where each expression eval- uates to a value, which is considered the output of the program.  When evaluating an expression, we assume that we are given a current input vector x = (x0 ,..., xn−1) e Rn. Expressions andeval- uations are defined recursively. Any floating number is an expression which evaluates to the value of the number.  If e1 , e2 , e3 , and e4 are expressions which evaluate to v1 , v2 , v3  and v4  respectively, then the following are also expressions

.  (add  e1  e2 ) is addition which evaluates to v1  + v2 , e.g.  (add  1  2)三 3

.  (sub  e1  e2 ) is subtraction which evaluates to v1  — v2 , e.g.  (sub  2  1)三 1 .  (mul  e1  e2 ) is multiplication which evaluates to v1 v2 , e.g.  (mul  2  1) 2

.  (div  e1  e2 ) is division which evaluates to v1 /v2  ifv2  ≠ 0 and 0 otherwise,e.g., (div  4  2) 2, and (div  4  0) 0,

.  (pow  e1  e2 ) is power which evaluates to v1(v)2 , e.g.,  (pow  2  3)三 8

.  (sqrt  e1 ) is the square root which evaluates to^v1 , e.g. (sqrt  4) 2

.  (log  e1 ) is the logarithm base 2 which evaluates to log(v1 ), e.g.  (log  8)三 3

.  (exp  e1 ) is the exponential function which evaluates to ev1 , e.g.  (exp  2) e2 ~ 7.39 .  (max  e1  e2 ) is the maximum which evaluates to max(v1 , v2 ), e.g.,  (max  1  2)三 2

.  (ifleq  e1  e2  e3  e4 ) is a branching statement which evaluates to v3  ifv1  三 v2 , otherwise the

expression evaluates to v4  e.g.  (ifleq  1  2  3  4)三 3 and  (ifleq  2  1  3  4) 4 .  (data  e1 ) is the j-th element xj  of the input, where j 三 |「v1]|   mod n.

.  (diff  e1  e2 ) is the difference xk  — xwhere k 三 |「v1]|   mod n and ℓ 三 |「v2]|   mod n

.  (avg  e1   e2 )  is  the  average where  k  三  |「v1]|   mod n  and ℓ  三  |「v2]| mod n

In all cases where the mathematical value of an expression is undefined or not a real number (e.g., ^ — 1, 1/0 or (avg  1  1)), the expression should evaluate to 0.

We can build large expressions from the recursive definitions. For example, the expression

(add  (mul  2  3)  (log  4))

evaluates to

2 · 3 + log(4) = 6 + 2 = 8.

To evaluate the fitness of an expression e on a training data (X , Y) of size m, we use the mean square error

where e(x(j)) is the value of the expression e when evaluated on the input vector x(j) .

Exercise 1. (30  % of the marks)

Implement a routine to parse and evaluate expressions. You can assume that the input describes a syntactically correct expression. Hint: Make use of a library for parsing s-expressions, and ensure that you evaluate expressions exactly as specified on page 2.

Input arguments:

.  -expr an expression

.  -n the  dimension  of the input vector n

.  -x the input vector

.  -question the  question number (always  1 in this  case)

Output:

.  the value of the expression

Example: In this example, we assume that your program has been compiled to an executable with the name my lab solution.

[pkl@phi  ocamlec]$ my_lab_solution  -question  1  -n  1  -x  "1.0"  \

-expr  "(mul  (add  1  2)  (log  8))"

9.0

[pkl@phi  ocamlec]$ my_lab_solution  -question  1  -n  2  -x  "1.0  2.0"  \ -expr  "(max  (data  0)  (data  1))"

2.0

Exercise 2. (10  %  of the  marks)  Implement a routine which computes the fitness of an expression given a training data set.

Input arguments:

.  -expr an expression

.  -n the  dimension of the input vector

.  -m the size of the training data (X , Y)

.  -data the name of a file containing the training data in the form of m lines, where each line contains n + 1  values separated by  tab characters. The first n elements in a line represents an input vector x, and the last element in a line represents the  output value y.

.  -question the  question number (always 2 in this  case)

Output:

.  The fitness  of the  expression, given the  data.

Exercise 3. (30  % of the marks)

Design a genetic programming algorithm to do time series forecasting. You can use any genetic operators and selection mechanism you find suitable.

Input arguments:

.  -lambda population size

.  -n the dimension of the input vector

.  -m the size of the training data (X , Y)

.  -data the name of a file containing training data in the form of m lines, where each line contains n + 1 values separated by tab  characters.  The first n elements in a line represents an input vector x, and the last element in a line represents the  output value y.

.  -time budget the number of seconds to run the algorithm

.  -question the  question number (always 3 in this  case)

Output:

.  The fittest expression found within the time  budget.

Exercise 4. (10 % of the marks) Here, you should do one of the following exercises.

If you follow LH Evolutionary  Computation,  do  the following  exercise: Describe  your algorithm from Exercise 3 in the form of pseudo-code. The pseudo-code should be sufficiently detailed to allow an exact re-implementation.

If you follow  LM Evolutionary  Computation  (extended), do  the  following  exercise:

Describe in 150 words or less the result in one recent research paper on the topic  “symbolic regression using genetic programming” .  The paper needs to  be published in 2020 or later in the proceedings of one of the following conferences: GECCO, PPSN, CEC, or FOGA.

Exercise 5. (20  % of the marks)

In this final task, you should try to determine parameter settings for your algorithm which lead to as fit expressions as possible.

Your algorithm is likely to have several parameters, such as the population size, mutation rates, selection mechanism,  and other mechanisms  components, such as diversity mechanisms.

Choose parameters which you think are essential for the behaviour of your algorithm. Run a set  of experiments to determine the impact of these parameters on the solution quality. For each parameter setting, run 100 repetitions,  and plot box plots of the fittest solution found within the time budget.

A. Docker Howto

Follow these steps exactly to build, test, save, and submit your Docker image. Please replace abc123 in the text below with your username.

1. Install Docker CE on your machine from the following website:

https://www.docker.com/community-edition

2. Copy the PDF file from Exercises 4 and 5 all required source files, and/or bytecode to an empty directory named ec2024-lab2-abc123 (where you replace abc123 with your username).

mkdir ec2024 - lab2 - abc123

cd ec2024 - lab2 - abc123 /

cp ../ exercise . pdf .

cp ../ abc123 . py .

3. Create a text file Dockerfile file in the same directory, following the instructions below.

# Do not change the following line . It specifies the base image which

# will be downloaded when you build your image .

FROM pklehre / ec2024 - lab2

# Add all the files you need for your submission into the Docker image ,

# e . g . source code , Java bytecode , etc . In this example , we assume your

# program is the Python code in the file abc123 . py . For simplicity , we

# copy the file to the / bin directory in the Docker image . You can add

# multiple files if needed .

ADD abc123 . py / bin

# Install all the software required to run your code . The Docker image

# is derived from the Debian Linux distribution . You therefore need to

# use the apt - get package manager to install software . You can install

# e . g . java , python , ghc or whatever you need . You can also

# compile your code if needed .

# Note that Java and Python are already installed in the base image .

# RUN apt - get update

# RUN apt - get -y install python - numpy

# The final line specifies your username and how to start your program .

# Replace abc123 with your real username and python / bin / abc123 . py

# with what is required to start your program .

CMD [" - username " , " abc123 " , " - submission " , " python / bin / abc123 . py "]

4. Build the Docker image as shown below. The base image pklehre/ec2024-lab2 will be downloaded from Docker Hub

docker build . -t ec2024 - lab2 - abc123

5. Run the docker image to test that your program starts. A battery of test cases will be executed to check your solution.

docker run ec2024 - lab2 - abc123

6. Once you are happy with your solution, compress the directory containing the Dockerfile as a zip-file. The directory should contain the source code, the Dockerfile, and the PDF file for Exercise 4 and 5. The name of the zip-file should be ec2024-lab2-abc123.zip (again, replace the abc123 with your username).

Following the example above, the directory structure contained in the zip file should be as follows:

ec2024-lab2-abc123/exercise.pdf

ec2024-lab2-abc123/abc123.py

ec2024-lab2-abc123/Dockerfile

Submissions which do not adhere to this directory structure will be rejected!

7. Submit the zip file ec2024-lab2-abc123.zip on Canvas.