You are on page 1of 6

REZA SETIAWAN K11111008 ALGORITMA GENETIKA

Pembahasan Penjelasan
Source code Algoritma Genetika Untuk TSP
1. Tahapan Inisialisasi Populasi
Script
if (!empty($_POST)) {
Baris 198-199
define('CITY_COUNT',
7);
$population
= Baris 200-214
$_POST['population'] + 0;
if ($population > 999)
$population =
999;
$generations
=
$_POST['generations'] + 0;
$elitism
=
$_POST['elitism'] + 0;
$names = array();
$distances = array();
$initialPopulation
array();
$currentPopulation
array();

=
=

for ($i = 1; $i <=


CITY_COUNT; $i++) {
$names[$i]
=
$_POST['name'.$i];
for($i = 0; $i < $population; Baris 230-232
$i++) { $initialPopulation[$i] =
pickRandom();}

Penjelasan
Define disini berfungsi untuk
mendefinisikan dari 7 kota.
-$_POST['population'],
$_POST['generations'], dan
$_POST['elitism']
ialah
mengambil
data
dari
database tau nilai yang di
inputkan.
-Kondisi jika populasi lebih
besar dari 999 maka populasi
sama dengan 999, kemudian
generasi diambil dari form
generasi ditambah 0, elitism
diambil dari -form elitism
ditambah 0.
Variable name, distances,
initialPopulation,
currentPopulation
ialah
Mengambil
nama
kota
pengguna dan memasukkan
-Perulangan
untuk
menginisialisasi
populasi
annya ke dalam sebuah array
Membangun
inisialisasi
populasi awal

2. Seleksi
Script
$i = 0;

Penjelasan
$distanceSum = 0;
$biggest = 0;

Baris
238-240

foreach ($initialPopulation AS $entity) { Baris


$currentPopulation[$i]['dna']
$entity;

= 241-242

Kondisi menentukan nilai


awal
masing-masing
variabel
foreach untuk menampilkan
entity
dari
inisialisai
populasi
yaitu
jumlah
populasi yang diinputkan
berupa output dna

REZA SETIAWAN K11111008 ALGORITMA GENETIKA


$currentPopulation[$i]['rate']
= Baris
rate($entity, $distances);
$distanceSum += 243-248
$currentPopulation[$i]['rate'];
if
($currentPopulation[$i]['rate']
>
$biggest)
$biggest =
$currentPopulation[$i]['rate'];
$i++;
}
$biggest += 1;
Baris
$chancesSum = 0;
249-250
for ($i = 0; $i < $population; $i++ ) {

Baris

251-254
$currentPopulation[$i]['metric']
=
$biggest
$currentPopulation[$i]['rate'];
$chancesSum +=
$currentPopulation[$i]['metric'];
}
for ($i = 0; $i < $population; $i++ ) {
Baris
$currentPopulation[$i]['chances']
= $currentPopulation[$i]['metric'] /
$chancesSum;
}
util::sort($currentPopulation, 'rate');
$ceilSum = 0;
for ($i = 0; $i <
$population; $i++ ) {
$currentPopulation[$i]['floor'] =
$ceilSum;
$ceilSum
+=
$currentPopulation[$i]['chances'];
}
debug($currentPopulation);
echo "</pre>\n";
if
(converging($initialPopulation))
break;

255-257

Baris
258-263

Baris
264-267

Proses
seleksi
dna
menggunakan
roulete
wheel yang terdapat dalam
fungsi rate.

Menentukan nilai awal


masing-masing
variable
tersebut
Perulangan untuk mencari
nilai jumlah kemungkinan
populasi

Perulangan untuk mencari


nilai probabilitas populasi
saat dalam kondisi ini

Script menjalankan fungsi


util, kemudian menentukan
nilai
variabel
dan
melakukan
perulangan
untuk
mencari
nilai
kumulatif dari populasi
tersebut.
Menjalankan fungsi debug
probabilitas
populasi
kemudian
menampilkan
diprogram dan mengulang
kembali proses tersebut
serta jika telah memenuhi
syarat
pada
fungsi
converging maka proses
berhenti.

REZA SETIAWAN K11111008 ALGORITMA GENETIKA


3. Crossover
Script
Penjelasan
for ($j = 0; $j < $population - Baris
$elitism; $j++) {
273-290
$rouletteMale = rand(0,
100) / 100;
for ($i = $population - 1;
$i >= 0; $i--) {
if
($currentPopulation[$i]['floor']
< $rouletteMale) {
$dad
=
$currentPopulation[$i]['dna'];
break;
}}
$rouletteFemale
=
rand(0, 100) / 100;
for ($i = $population - 1;
$i >= 0; $i--) {
if
($currentPopulation[$i]['floor']
< $rouletteFemale) {
$mom
=
$currentPopulation[$i]['dna'];
break;
}}
4. Mutasi
Script
$child = mate($mom, $dad);
$initialPopulation[] = $child;
}

Script
ini
berfungsi
membangkitkan nilai acak
yang mana terdapat fungsi
rand
dan
juga
menampilkan nilai acak dari
populasi yang telah di input.
Pada baris ke 277 dan 286
merupakan
penyeleksian
nilai
yang
akan
di
croosoverkan.

Penjelasan

Baris
292-294

5. Fitness Terbaik
Script
Penjelasan
$initialPopulation = array();
Baris
for ($j = 0; $j < $elitism; $j++) 269-272
$initialPopulation[] =
$currentPopulation[$j]['dna'];
}

$child merupakan nilai


atau hasil dari mutasi
dengan suatu fungsi dari
matedari populasi.yang
di proses.

Kondisi perulangan pada


inisialisasi populasi dan
membandingkan populasi
pada gen tersebut

REZA SETIAWAN K11111008 ALGORITMA GENETIKA


6. Fungsi atau script program pendukung
<?php
function converging($pop) {
$items = count(array_unique($pop));
if ($items == 1)
return true;
else
return false;
}
function pickRandom() {
$choices = array('A', 'B', 'C', 'D', 'E', 'F', 'G');
shuffle($choices);
return implode('',$choices);
}
function rate($dna, $distances) {
$mileage = 0;
$letters = str_split($dna);
for ($i = 0; $i < CITY_COUNT - 1; $i++) {
$mileage += $distances[let2num($letters[$i])][let2num($letters[$i+1])];
}
return $mileage;
}
function debug($ar) {
echo "<table class='debug'>";
echo
"<tr><th>&nbsp;</th><th>DNA</th><th>Fit</th><th>Roulette</th></tr>\n";
foreach($ar as $element => $value) {
echo "<tr><td>" . leadingZero($element) . "</td><td>" . $value['dna'] .
"</td><td>" . $value['rate'] . "</td><td>" . sprintf("%01.2f", $value['chances'] * 100) .
"%</td></tr>\n";
}
echo "</table>\n";
}
function leadingZero($value) {
if ($value < 10)
$value = '00' . $value;
else if ($value < 100)
$value = '0' . $value;
return $value;
}
function mate($mommy, $daddy) {
$baby = "AAAAAA";
while (substr_count($baby, 'A') != 1 || substr_count($baby, 'B') != 1 ||

REZA SETIAWAN K11111008 ALGORITMA GENETIKA


substr_count($baby, 'C') != 1 || substr_count($baby, 'D') != 1 || substr_count($baby, 'E')
!= 1 || substr_count($baby, 'F') != 1 || substr_count($baby, 'G') != 1) {
$baby = "";
for($i = 0; $i < CITY_COUNT; $i++) {
$chosen = mt_rand(0,1);
if ($chosen)
$baby .= substr($mommy, $i, 1);
else
$baby .= substr($daddy, $i, 1);
}
}
return $baby;
}
function let2num($char) {
if ($char == 'A')
return 1;
else if ($char == 'B')
return 2;
else if ($char == 'C')
return 3;
else if ($char == 'D')
return 4;
else if ($char == 'E')
return 5;
else if ($char == 'F')
return 6;
else if ($char == 'G')
return 7;
else
die("WHOOPS");
}
class util {
static private $sortfield = null;
static private $sortorder = 1;
static private function sort_callback(&$a, &$b) {
if($a[self::$sortfield] == $b[self::$sortfield]) return 0;
return ($a[self::$sortfield] < $b[self::$sortfield])? -self::$sortorder :
self::$sortorder;
}
static function sort(&$v, $field, $asc=true) {
self::$sortfield = $field;
self::$sortorder = $asc? 1 : -1;
usort($v, array('util', 'sort_callback'));
}
}

REZA SETIAWAN K11111008 ALGORITMA GENETIKA

You might also like