# Genetic Algorithm Implementation $V_d \in \mathbb{N} - \{0\}$ (list of demand node / hospitals) $V_c \in \mathbb{N} - \{0\}$ (list of collection node) $V_n \in V_d \cup V_c$ (list of customer nodes) $V \in V_n \cup \{0\}$ (list of all nodes, $0=$depot) $c_{i,j}$ (moving duration between $v_i, v_j \in V$) $t_{i}$ (service time of node $v_i \in V_n$) $s_k \in V \times V$ ($k$-th fleet route) $T \in \mathbb{R}$ (maximum time allowed for each $s_k$) $g = \{s_k : k \in \mathbb{N} \}$ (genome: all fleet route to serve all customer nodes) ## Genome encoding Suppose there are two customer nodes $v_1, v_2 \in V_n$ This is the initial genome $g$ in population looks like: | 0 | $v_1$ | 0 | $v_2$ | 0 | | --- | ----- | --- | ----- | --- | **Note**: $g = \{ \{0, v_1, 0\}, \{0, v_2, 0\} \}$, $s_1 = \{0, v_1, 0\}$, $s_2 = \{0, v_2, 0\}$ This is the solution (might) looks like: | 0 | $v_2$ | $v_1$ | 0 | 0 | | --- | ----- | ----- | ---:| --- | **Note**: $g = \{ \{0, v_2, v_1, 0\} \}$, $s_1 = \{0, v_2, v_1, 0\}$, $s_2 = \{0, 0\}$ **Remarks**: - initial population consists of randomly ordered $v_i \in V_n$ with $\{0\}$ between each node. Thus, genome length is $2|V_n| + 1$ - each genome $g$ contains segments $s_k$ which separated by $\{0\}$ (depot node) - each segment represent one trip starting from depot until come back to depot - segment can be empty, which means the trip in that specific segment is not occurs. empty segment encoded as $\{0, 0\}$ ## Fitness Function - First split genome into segments - For each segment $s_k$ if there are $v_m, v_n \in V_n$ such that $v_m \in V_d$ and $v_n \in V_c$, returns $0$, the whole genome is not fit - Because each trip can not be both collecting and distributing - For each segment $s_k$ if total number of time required $\sum c_{ij} + t_i > T$ such that $(v_i, v_j)$ is consecutive element of $s_k$, then returns $0$, the whole genome is not fit - Because each trip not allowed to exceed $T$ - Else calculate the sum of all $c_{i,j}$ and $t_i$ of the segment ## Mutation There are two kinds of mutations 1. combine two segments (50% chance) or (100% chance for initial populations) 2. swap two nodes in any segment (50% chance) or (0% chance for initial populations) ## Crossover If there is segment $s_{i}^m$ in genome $g_{m}$ that same but with different order with segment $s_{j}^n$ in genome $g_{n}$, then move $s_{i}^m$ into $g_{n}$ and $s_{j}^n$ into $g_{m}$, which producing two offsprings into population. For example: given parents: $g_1 = \{ \{0, v_1, v_2, 0\}, \{0, v_3, v_4, 0 \} \}$ $g_2 = \{ \{0, v_2, v_1, 0\}, \{0, v_3, 0 \}, \{0, v_4, 0\} \}$ producing offsprings: $g_3 = \{ \{0, v_2, v_1, 0\}, \{0, v_3, v_4, 0 \} \}$ $g_4 = \{ \{0, v_1, v_2, 0\}, \{0, v_3, 0 \}, \{0, v_4, 0\} \}$ ## Experimental notes - It relatively quick to converge - Best result for case which requires large number of fleet trips. Hence small $T$ or large $|V|$ - Not very good for small number of fleet, due to crossover is not effective, since the offspring fitness value would be same with the parent.