programer skripsi tesis tugas akhir
-

Contoh Program Source Code   /

Algoritma Genetika Source Code Java

Posted on 00.04
Join with us

Algoritma Genetika Source Code Java

Algoritma Genetika

Algoritma genetika mrp teknik pencarian yg di dlm ilmu komputer unt menemukan penyelesaian perkiraan unt optimisasi & masalah pencarian. Algoritma genetika mrp kelas khusus dr algoritma evolusioner dg memakai teknik yg terinspirasi oleh biologi evolusioner spt warisan, mutasi, seleksi alam & rekombinasi (atau crossover)

Algoritma Genetika pertama kali dikembangkan oleh John Holland pd tahun 1970-an di New York, Amerika Serikat. Dia beserta murid-murid & teman kerjanya menghasilkan buku berjudul "Adaption in Natural and Artificial Systems" pd tahun 1975.

Algoritma Genetika khususnya diterapkan sbg simulasi komputer dimana sebuah populasi representasi abstrak (disebut kromosom) dr solusi-solusi calon (disebut individual) pd sebuah masalah optimisasi akan berkembang mjd solusi-solusi yg lbh baik. Secara tradisional, solusi-solusi dilambangkan dlm biner sbg string '0' & '1', walaupun dimungkinkan jg penggunaan penyandian (encoding) yg berbeda. 

Evolusi

Evolusi dimulai dr sebuah populasi individual acak yg lengkap & terjadi dlm generasi-generasi. dlm tiap generasi, kemampuan keseluruhan populasi dievaluasi, kemudian multiple individuals di pilih dr populasi sekarang (current) tsb secara stochastic (berdasarkan kemampuan mereka), lalu dimodifikasi (melalui mutasi / rekombinasi) mjd bentuk populasi baru yg mjd populasi sekarang (current) pd iterasi berikutnya dr algoritma.
Algoritma genetik yg umum menyaratkan dua hal unt didefinisikan: 

(1) representasi genetik dr penyelesaian
(2) fungsi kemampuan unt mengevaluasinya.

Representasi baku mrp sebuah larik bit-bit. Larik jenis & struktur lain bisa dipakai dg cara yg sama. Hal utama yg membuat representasi genetik ini mjd tepat mrp bahwa bagian-bagiannya mudah diatur karena ukurannya yg tetap, yg memudahkan operasi persilangan sederhana. Representasi panjang variabel jg dipakai, tetapi implementasi persilangan lbh kompleks dlm kasus ini. Representasi spt pohon diselidiki dlm pemrograman genetik & representasi bentuk bebas diselidiki di dlm HBGA.

Fungsi kemampuan didefinisikan di atas representasi genetik & mengukur kualitas penyelesaian yg diwakili. Fungsi kemampuan selalu tergantung pd masalah. sbg contoh, jika pd ransel kita ingin memaksimalkan jumlah benda (obyek) yg bisa kita masukkan ke dalamnya pd beberapa kapasitas yg tetap. Representasi penyelesaian mungkin berbentuk larik bits, dimana tiap bit mewakili obyek yg berbeda, & nilai bit (0 / 1) menggambarkan apakah obyek tsb ada di dlm ransel / tidak. tdk setiap representasi spt ini valid, karena ukuran obyek bisa melebihi kapasitas ransel. Kemampuan penyelesaian mrp jumlah nilai dr semua obyek di dlm ransel jika representasi itu valid, / jika tdk 0. dlm beberapa masalah, susah / bahkan tdk mungkin unt mendefinisikan lambang kemampuan, maka pd kasus ini dipakai IGA.

Sekali kita mendefinisikan representasi genetik & fungsi kemampuan, algoritma genetik akan memproses inisialisasi populasi penyelesaian secara acak, & memperbaikinya melalui aplikasi pengulangan dg aplikasi operator-operator mutasi, persilangan, & seleksi.

Algoritma genetik mrp suatu metode yg memakai seleksi alam yg mrp bagian utama dr prinsip evolusi sbg dasar pemikiran unt menyelesaikan suatu permasalahan. Prinsip ini dikemukakan oleh Charles Darwin, dimana tanpa menghiraukan prinsip dasar penurunan sifat, Darwin mengemukakan penggabungan kualitas induk pd generasi berikutnya, disamping itu bahwa individu yg mampu beradaptasi dg lingkunganya akan mempunyai kesempatan hidup yg lbh besar.

Penggunaan prinsip genetika pd komputer dimulai pd tahun 1950 ketika beberapa ahli Biologi memakai komputer unt simulasi sistem biologi. Akhir tahun 1975 John Holland dr Universitas Michigan melalui paper yg berjudul “Adaption in Natural and Artificial System” memakai konsep dasar algoritma genetika. Algoritma genetika bekerja dg suatu populasi string & melakukan proses pencarian nilai optimal secara parallel, dg memakai operator genetika. Algoritma genetika akan melakukan rekombinasi antar individu.

Algoritma genetika memiliki elemen dasar berupa string yg tersusun dr rangkaian substring (gen), yg masing-masing mrp kode dr parameter dlm ruang solusi dimana suatu string (kromosom) menyatakan kandidat solusi. Kumpulan string dlm populasi berkembang dr generasi ke generasi melalui operator genetika. pd setiap iterasi, individu-individu (Kromosam) dlm populasi itu akan dievolusi & diseleksi unt menentukan populasi pd generasi berikutnya. Populasi ini akan terus berulang sampai menemukan suatu parameter dg nilai yg paling optimal sesuai dg yg diinginkan. Adapun struktur umum algoritma genetika bisa diilustrasikan pd gambar berikut:

Gambar 1. Struktur umum Algoritma Genetika

Binary encoding bisa memberikan bnyak kemungkinan pd kromosom meskipun pd jumlah allele yg sedikit. Dilain pihak jenis encoding ini tdk cukup natural unt beberapa kasus tertentu & kadang-kadang harus dilakukan koreksi setelah melakukancrossover / mutasi, contoh penggunaan Binary encoding mrp pd permasalahanknapsack / pengepakan, dimana ada beberapa barang dg jumlah & ukuran masing-masing & knapsack harus memberikan kapasitasnya unt barang-barang tsb, permasalahanya mrp bagaimana memilih barang unt memaksimalkan jumlah barang sehingga bisa ditampung olehk napsack tanpa harus menambah kapasitasnya.

Istilah-istilah yg dipakai dlm Algoritma genetika ini hampir sama dg istilah-istilah yg dipakai dlm bidang biologi genetika, antara lain Gen, Kromosom, Populasi, Fungsi Fitness, & operator genetika yg meliputi mutasi & crossover.

Gen mrp suatu sel dr suatu kromosom / nilai yg terdapat dlm Algoritma genetika ini bisa dibentuk oleh sebuah byte bahkan tdk menutup kemungkinan suatu string. Gen ini mewakili sebagian kecil dr solusi permasalahan.

Individu dlm populasi disebut string, genotype / kromosom-kromosom terdiri dr unit-unit yg dinamakan Gen, Karakter, Decoder. Kromosom ini bisa mewakili suatu solusi, dimana bisa diilustrasikan dlm gambar dibawah ini:


Gambar 2. Kromosom dalam 
Untuk mempresentasikan kromosom dilakukan dg proses encoding, dibawah ini akan dijelaskan beberapa proses encoding yg biasa dipakai dlm beberapa kasus tertentu.

Permutation Encoding

Untuk jenis Permutation Encoding ini dipakai unt permasalahan proses pengurutan, misalnya terdapat kasus optimasi jadwal / pd kasus traveling salesman. pd Permutation Encoding, setiap Gen pd kromosom berupa angka dimana bisa ditampilkan spt gambar di bawah ini:
Gambar 3. Permutation Encoding
Permutation Encoding hanya berlaku unt permasalahan pengurutan, unt itu dlm kasus-kasus yg ada pd Permutation Encoding terdapat beberapa jenis crossover & mutasi yg harus dibuat unt mempertahankan kromosom agar tetap konsisten. Contoh penggunaan Permutation Encoding ini mrp pd kasus trvelling salesman, dimana terdapat beberapa kota dg jarak masing-masing. pd kasus traveling salesman ini seorang salesman harus mengunjungi semua kota yg ada, tetapi tdk harus berjalan jauh unt mencapai seluruh kota. Permasalahanya mrp menentukan urutan kota yg akan dikunjungi unt meminimalisasi jarak yg harus ditempuh.

Binary encoding

Binary encoding mrp jenis encoding yg paling sering dipakai karena kasus pertama yg ada pd Algiritma Genetik memakai algoritma jenis ini. Setiap kromosom padaBinary encoding mrp bit 0 & 1 dimana bisa ditampilkan pd gambar bawah:
Gambar 4. Binary encoding
Binary encoding bisa memberikan bnyak kemungkinan pd kromosom meskipun pd jumlah Gen yg sedikit. Dilain pihak jenis encoding ini tdk cukup natural unt beberapa kasus tertentu & kadang-kadang harus dilakukan koreksi setelah melakukancrossover / mutasi, contoh penggunaan Binary encoding mrp pd permasalahanknapsack / pengepakan, dimana ada beberapa barang dengna jumlah & ukuran masing-masing & knapsack harus memberikan kapasitasnya unt barang-barang tsb, permasalahanya mrp bagaimana memilih barang unt memaksimalkan jumlah barang sehingga bisa ditampung oleh knapsack tanpa harus menambah kapasitasnya.

Crossover

Crossover mrp operator algoritma genetika yg membutuhkan parameter dua kromosom. Dua buah kromosom tsb disebut kromosom induk. Operator ini akan menghasilkan dua buah kromosom baru. Ada beberapa jenis crossover yg sering dipakai dlm algoritma genetika antara lain:

Ordered Based Crossover

Ordered based Crossover diawali dg menentukan posisi-posisi gen secara random pd induk pertama misalnya didapatkan posisi 3,4,6 & 9 pd induk.

P1= ( 1 2 3 4 5 6 7 8 9 )

P1= ( 4 5 2 1 8 7 6 9 3 )

Kemudian Gen-gen pd induk yg berada tepat dibawah posisi-posisi tsb dicatat yaitu 2,1,7 & 3 unt Q1 disalin dr P1 dg menghilangkan angka-angka 2,1,7 dan3 tsb sehingga menjadi

Q1= ( x x x 4 5 6 x 8 9 )

Subset 2,1,7, & 3 ini di masukan dlm Q1 dimulai dr kiri dg mempertahankan urutan sehingga menjadi

Q1 = (2 1 7 4 5 6 3 8 9)

Untuk Q2 diperlukan sama hanya perlu meukar induk pertama mjd induk kedua & induk kedua mjd induk pertama yg menjadi:

Q2 = (3 5 2 1 8 7 4 6 9)

One-Point Crossover

Contoh kerja operator ini mrp dg menentukan crossover point (gen tertentu). Kromosom baru pertama berisi gen pertama sampai gen crossover point dr kromosom induk pertama ditambah dg gen dr crossover point sampai gen terakhir dr kromosom induk kedua. Kromosom baru kedua berisi gen pertama sampai gen crossover point dr induk kedua ditambahkan dg gen dr crossover point sampai gen dr kromosom induk pertama. Adapun metode crossover ini bisa diilustrasikan pd gambar berikut:
Gambar 5. Proses crossover dengan satu crossover point
Dari ilustrasi di atas maka contoh penerapan metode One-Point Crossover mrp sbg berikut:

Parent 1: 1 2 3 4 5 | 6 7 8 9
Parent 2: 4 5 3 6 8 | 9 7 2 1

Setelah proses crossover turunan yg bisa dihasilkan mrp dr kedua parent diatas adalah:

Parent 1: 1 2 3 4 5 | 9 7 2 1
Parent 2: 4 5 3 6 8 | 6 7 8 9

Two-Point Crossover

Proses Two-Point Crossover hampir sama dg prosedur One-Point Crossover, kecuali pd Two-Point Crossover harus di pilih dua crossover point & hanya gen yg ada di antara kedua crossover point itu yg akan ditukarkan.
Metode ini bisa mjd bagian awal & akhir dr kromosom & hanya menukar bagian tengahnya saja.

N-Point Crossover

Prosedur N-Point Crossover hampir sama baik dg prosedur one-point crossover maupuntwo-point crossover, hanya saja dlm n-point crossover ini harus di pilih n crossover point & hanya gen di antara crossover point ganjil & genap yg bisa ditukarkan sedangkan gen diantara genap & ganjil operator crossover tdk berubah. / dg kata lain harus di pilih posisi n & hanya bit antara ganjil & genap posisi crossover yg akan dihilangkan.

Contoh:
P1= 9 7 6 3 2 8
P2= 2 1 9 7 4 5

Jika didapatkan angka random unt n=3 & diacak 1,2 & 4 sbg posisi dr gen yg akan di crossover, didapatkan kromosom turunan:

T1= 9 1 6 3 4 5
T2= 2 7 9 7 2 8

Mutasi

Mutasi mrp operator yg membutuhkan satu perameter. Kromosom operator ini mrp nilai suatu gen dr sebuah kromosom sehingga kromosom yg baru ini berbeda dg kromosom yg lama. Sekumpulan kejadian dg suatu nilai pelanggaran maksimal bisa dg mudah dihilangkan selama evaluasi fitness “tujuan dr proses mutasi ini, unt mempertahankan kehilangan permanent dr suatu bit / gen” (Whitley,1993:16). Seluruh proses mutasi ini menjanjikan keuntungan melalui pengarahan mutasi kemana mutasi ini tsb sangat dibutuhkan. Oprator mutasi dipakai unt melakukan modifikasi satu / lbh dr nilai gen dlm individu yg sama. Mutasi memastikan bahwa probabilitas unt pencarian pd daerah tertentu dlm persoalan tdk akan pernah nol & mencegah kehilangan total materi genetika setelah pemilihan & penghapusan. Mutasi ini bukanlah operator genetika yg utama, yg dilakukan secara acak pd gen dg kemungkinan yg lbh kecil. Metode ini disebut metasi gen (gene mutation) terdapat metode lain yaitu: “order mutation” dimana dimungkinkan unt menghilangkan seluruh gen dr dua gen yg di pilih secara acak. Terdapat empat operator yg biasa dipakai unt permasalahan penjadwalan antara lain:

Violation Directed Mutation (VDM)

Memilih sutatu kejadian dg suatu nilai pelanggaran maksimal, & secara acak mengubah waktu penugasan.

Event Freeing Mutation (EFM)

Memilih suatu kejadian dg sauatu pelanggaran maksimal, kemudian memberi waktu baru yg mana akan mengurangi secara maksimal angka ini.

Secara stokastik memilih suatu kejadian ,bias melalui kejadian itu dg nilai pelanggaran yg tinggi, kemudian secara stokastik memilh waktu baru unt kejadian ini, bisa melalui waktu yg mana akan mengurangi secara maksimal angka pelanggaran kejadian.

Fungsi Objektif

Fungsi objektif mrp tujuan dr optimasi permasalahan. Biasanya fungsi objektif ini hanya dua macam yaitu memaksimalkan & meminimalkan

Model Pengembangan Algoritma Genetika

Algoritma genetika menyelesaikan permasalahan dg cara menghasilkan, mengubah & mengevaluasi kandidat solusi dr permasalahan tsb. Awalnya sebuah populasi acak yg terdiri dr kromosom-kromosom di hasilkan kemudian kromosom-kromosom itu diubah oleh operator genetika yaitu crossover & mutasi, kemudian kromosom-kromosom tsb dievaluasi oleh fungsi fitness.

Terdapat beberapa cara dlm menentukan inisialisasi diantaranya biner & non biner. unt inisialisasi masalah penjadwalan yg paling sederhana bisa dilihat sbg masalah penetapan V even / kejadian dlm S selang waktu dg kata lain definisi dr masalah penjadwalan adalah:

E mrp definisi dr sejumlah V even (e1.e2,….en)
T mrp definisi dr sejumlah S selang waktu (t1,t2,…tn)

Berdasarkan definisi tsb maka permasalahan penjadwalan tsb ditetapkan sbg pasangan terurut (a,b) yg berarti a Є E & b Є T, dg intepretasi bahwa evena terjadi pd selang waktu b.

Terdapat berbagai versi pengkodean masalah penjadwalan diantaranya mrp representasi klasik & representasi Tuples. dlm representasi kalsik dipakai matrik dua dimensi. Bagian kolom mrp bagian produksi & bagian baris mrp interval waktu. Isi dr matrik M(i,j) mrp staf / karyawan yg mengerjakan WOdan jumlah shiftnya. Jadi matrik M(i,j) dibaca sbg karyawan dg shift m mengerjakan WOpada bagian produksi.

Metode penentuan lokasi awal sangat berpengaruh terhadap kinerja algoritma genetika. Ada dua cara yg bisa dipakai unt menghasilkan dua populasi awal. Cara yg pertama dg menghasilkan seluruh kromosom secara acak. Sedangkan cara yg kedua sbgn kromosom dihasilkan dg metode tertentu, yg dikenal dg populasi awal terarah. Salah satu metode unt membangkitkan populasi awal mrp metodeJoshepus permutation.

Berikut mrp algoritma joshepus permutation:


Step 1 = [ Nilai awal ]
For i=1 to N Step1
Plist[i]  0
End for
N Loop  random (N) + 1
F gen  random (N) + 1
K=1
Step 2 = [ Isi nilai gen ]
Kromosom [k]  F gen
Plist [F gen]  1
Step 3 = [ Cek kondisi ]
If ( K= n ) then go to Step 7
End if
Step 4 = [ Cari nilai gen selanjutnya ]
For i=1 to N Loop Step1
Repeat
F gen  F gen + 1
If (F gen > N) then
F gen  1
Until Plist [F gen] <> 1
End if
End for
Step 5 = [ Naikan ounter k ]
K =K+1
Step 6 = [ Ulangi Step2 sampai Step 5 ]
Go to Step 2
Step 7 = [ Ulangi unt kromosom selanjutnya ]
If Belum_semua_krm_telah_diinisialisasi then
Kromosom  parameter_ke_krm_berikutnya_dalam_populasi
Go to Step 2
End if
Step 8 = [ Selesai ]
Return


N mrp jumlah allele dlm seluruh kromosom, Plist mrp sebuah array dg jumlah element sebnyak N, random (x) mrp fungsi generator bilangan random antara 0 sampai x-1. element array dimulai dr 1. kromosom mrp element dr array populasi yg menampung urutan allele.

Fungsi Evaluasi / Fungsi Fitness

Fungsi mrp salah satu aspek terpenting dlm algoritma genetika. Fungsi evaluasi yg baik harus mampu menghasilkan suatu kurva silo. Siklus yg cukup baik & bisa mewakili permasalahan yg dihadapi.Pengumpulan dini dlm algoritma genetika terjadi ketika beberapa kromosom dg nilai fitness yg tinggi (tapi bukan optimal) memdominasi populasi dg mengakibatkan algoritma genetika konvergen pd local optima. Ketika populasi konvergenkemampuan algoritma genetika unt mencari solusi manjadi lbh baik. Crossover antara kromosom yg hampir identik menghasilkan kromosom baru yg identik dlm operasi ini hanya operasi mutasi yg mampu menghasilkan kromosom yg relatif baru & mrp cara unt menghidarkan kromosom yg super mendominasi populasi.

Algoritma Genetika Source Code Java




package org.jenetics;

import static java.lang.Math.round;
import static java.lang.String.format;
import static java.util.Objects.requireNonNull;
import static org.jenetics.internal.util.object.NonNull;
import static org.jenetics.internal.util.object.checkProbability;
import static org.jenetics.util.arrays.forEach;

import java.util.Collection;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import org.jenetics.internal.util.Concurrency;

import org.jenetics.util.Array;
import org.jenetics.util.Factory;
import org.jenetics.util.Function;
import org.jenetics.util.Timer;
import org.jenetics.util.functions;

/**
 * <h3>Getting started</h3>
 *
 * Setup minimum GA kebutuhan pabrik genotipe, {code Pabrik <Genotipe <? >>},
 * Dan kebugaran {link Fungsi}. The {link Genotipe} mengimplementasikan
 * {}link Pabrik antarmuka dan karena itu dapat digunakan sbg prototipe untuk menciptakan
 * Penduduk awal dan untuk menciptakan Genotipe acak baru.
 *
 */
public class GeneticAlgorithm<
	G extends Gene<?, G>,
	C extends Comparable<? super C>
>
{

	/**
	 * Ukuran populasi default yang digunakan oleh GA ini.
	 */
	public static final int DEFAULT_POPULATION_SIZE = 50;

	/**
	 * Usia standar fenotip maksimal GA ini:
	 */
	public static final int DEFAULT_MAXIMAL_PHENOTYPE_AGE = 70;

	/**
	 * Fraksi keturunan default yang digunakan oleh GA ini.
	 */
	public static final double DEFAULT_OFFSPRING_FRACTION = 0.6;


	private final Lock _lock = new ReentrantLock(true);

	private final Optimize _optimization;
	private final Executor _executor;

	private final Factory<Genotype<G>> _genotypeFactory;
	private final Factory<Phenotype<G, C>> _phenotypeFactory;
	private final Function<? super Genotype<G>, ? extends C> _fitnessFunction;
	private Function<? super C, ? extends C> _fitnessScaler;

	private double _offspringFraction = DEFAULT_OFFSPRING_FRACTION;

	// Alterers
	private Alterer<G> _alterer = CompositeAlterer.of(
		new SinglePointCrossover<G>(0.1),
		new Mutator<G>(0.05)
	);

	// Selectors
	private Selector<G, C> _survivorSelector = new TournamentSelector<>(3);
	private Selector<G, C> _offspringSelector = new TournamentSelector<>(3);

	// Population
	private int _populationSize = DEFAULT_POPULATION_SIZE;
	private Population<G, C> _population = new Population<>(_populationSize);
	private int _maximalPhenotypeAge = DEFAULT_MAXIMAL_PHENOTYPE_AGE;
	private volatile int _generation = 0;

	// Statistics
	private Statistics.Calculator<G, C> _calculator = new Statistics.Calculator<>();
	private Statistics<G, C> _bestStatistics = null;
	private Statistics<G, C> _statistics = null;
	private final AtomicInteger _killed = new AtomicInteger(0);
	private final AtomicInteger _invalid = new AtomicInteger(0);

	//Beberapa ukuran kinerja.
	private final Timer _executionTimer = new Timer("Execution time");
	private final Timer _selectTimer = new Timer("Select time");
	private final Timer _alterTimer = new Timer("Alter time");
	private final Timer _combineTimer = new Timer("Combine survivors and offspring time");
	private final Timer _statisticTimer = new Timer("Statistic time");
	private final Timer _evaluateTimer = new Timer("Evaluate time");


	/**
	 * Buat algoritma genetika baru.
	 *
	 *param GenotypeFactory pabrik genotipe GA ini bekerja dengan.
     *param FitnessFunction fungsi fitness GA ini menggunakan.
     *param FitnessScaler scaler kebugaran GA ini menggunakan.
     * Optimasiparam Tentukan apakah GA ini memaksimalkan atau meminimalkan
     * Fungsi fitness.
     *param Eksekutor {link java.util.concurrent.Executor} digunakan untuk
     * Mengeksekusi bagian parallelizable kode.
      *throws NullPointerException jika salah satu argumen adalah {code null}.
	 */
	public GeneticAlgorithm(
		final Factory<Genotype<G>> genotypeFactory,
		final Function<? super Genotype<G>, ? extends C> fitnessFunction,
		final Function<? super C, ? extends C> fitnessScaler,
		final Optimize optimization,
		final Executor executor
	) {
		_genotypeFactory = requireNonNull(genotypeFactory, "GenotypeFactory");
		_fitnessFunction = requireNonNull(fitnessFunction, "FitnessFunction");
		_fitnessScaler = requireNonNull(fitnessScaler, "FitnessScaler");
		_optimization = requireNonNull(optimization, "Optimization");
		_executor = requireNonNull(executor, "Executor");

		_phenotypeFactory = new Factory<Phenotype<G, C>>() {
			@Override public Phenotype<G, C> newInstance() {
				return Phenotype.of(
					_genotypeFactory.newInstance(),
					_fitnessFunction,
					_fitnessScaler,
					_generation
				);
			}
		};
	}

	/**
	 * Buat algoritma genetika baru.
     *
     *param GenotypeFactory pabrik genotipe GA ini bekerja dengan.
     *param FitnessFunction fungsi fitness GA ini menggunakan.
     *param FitnessScaler scaler kebugaran GA ini menggunakan.
     *Optimasiparam Tentukan apakah GA ini memaksimalkan atau meminimalkan
     *Fungsi fitness.
     *throws NullPointerException jika salah satu argumen adalah {code null}.
	 */
	public GeneticAlgorithm(
		final Factory<Genotype<G>> genotypeFactory,
		final Function<? super Genotype<G>, ? extends C> fitnessFunction,
		final Function<? super C, ? extends C> fitnessScaler,
		final Optimize optimization
	) {
		this(
			genotypeFactory,
			fitnessFunction,
			fitnessScaler,
			optimization,
			Concurrency.commonPool()
		);
	}

	/**
	* Buat algoritma genetika baru.
    *
    *param GenotypeFactory pabrik genotipe GA ini bekerja dengan.
    *param FitnessFunction fungsi fitness GA ini menggunakan.
    *Optimasiparam Tentukan apakah GA ini memaksimalkan atau meminimalkan
    *Fungsi fitness.
    *Param Eksekutor {link java.util.concurrent.Executor} digunakan untuk
    *Mengeksekusi bagian parallelizable kode.
    *throws NullPointerException jika salah satu argumen adalah {code null}.
	*/
	
	public GeneticAlgorithm(
		final Factory<Genotype<G>> genotypeFactory,
		final Function<? super Genotype<G>, ? extends C> fitnessFunction,
		final Optimize optimization,
		final Executor executor
	) {
		this(
			genotypeFactory,
			fitnessFunction,
			functions.<C>Identity(),
			optimization,
			executor
		);
	}

	/**
	 *Buat algoritma genetika baru.
     *
     *param GenotypeFactory pabrik genotipe GA ini bekerja dengan.
     *param FitnessFunction fungsi fitness GA ini menggunakan.
     *Optimasiparam Tentukan apakah GA ini memaksimalkan atau meminimalkan
     *Fungsi fitness.
     *throws NullPointerException jika salah satu argumen adalah {code null}.
	 */
	 
	public GeneticAlgorithm(
		final Factory<Genotype<G>> genotypeFactory,
		final Function<? super Genotype<G>, ? extends C> fitnessFunction,
		final Optimize optimization
	) {
		this(
			genotypeFactory,
			fitnessFunction,
			functions.<C>Identity(),
			optimization,
			Concurrency.commonPool()
		);
	}

	/**
	 *Buat algoritma genetika baru. Secara default GA mencoba untuk memaksimalkan
     *Fungsi fitness.
     *
     *param GenotypeFactory pabrik genotipe GA ini bekerja dengan.
     *param FitnessFunction fungsi fitness GA ini menggunakan.
     *param Eksekutor {link java.util.concurrent.Executor} digunakan untuk
     *Mengeksekusi bagian parallelizable kode.
     *throws NullPointerException jika salah satu argumen adalah {code null}.
	 */
	public GeneticAlgorithm(
		final Factory<Genotype<G>> genotypeFactory,
		final Function<? super Genotype<G>, ? extends C> fitnessFunction,
		final Executor executor
	) {
		this(
			genotypeFactory,
			fitnessFunction,
			functions.<C>Identity(),
			Optimize.MAXIMUM,
			executor
		);
	}

	/**
	 *Buat algoritma genetika baru. Secara default GA mencoba untuk memaksimalkan
     *Fungsi fitness.
      *
     *param GenotypeFactory pabrik genotipe GA ini bekerja dengan.
     *param FitnessFunction fungsi fitness GA ini menggunakan.
     *throws NullPointerException jika salah satu argumen adalah {code null}.
	 */
	 
	public GeneticAlgorithm(
		final Factory<Genotype<G>> genotypeFactory,
		final Function<? super Genotype<G>, ? extends C> fitnessFunction
	) {
		this(
			genotypeFactory,
			fitnessFunction,
			functions.<C>Identity(),
			Optimize.MAXIMUM,
			Concurrency.commonPool()
		);
	}

	/**
	 *Buat algoritma genetika baru. Secara default GA mencoba untuk memaksimalkan
     *Fungsi fitness.
     *
     *param GenotypeFactory pabrik genotipe GA ini bekerja dengan.
     *param FitnessFunction fungsi fitness GA ini menggunakan.
     *param FitnessScaler scaler kebugaran GA ini menggunakan.
     *param Eksekutor {link java.util.concurrent.Executor} digunakan untuk
     *Mengeksekusi bagian parallelizable kode.
      *throws NullPointerException jika salah satu argumen adalah {code null}.
	 */
	 
	public GeneticAlgorithm(
		final Factory<Genotype<G>> genotypeFactory,
		final Function<? super Genotype<G>, ? extends C> fitnessFunction,
		final Function<? super C, ? extends C> fitnessScaler,
		final Executor executor
	) {
		this(
			genotypeFactory,
			fitnessFunction,
			fitnessScaler,
			Optimize.MAXIMUM,
			executor
		);
	}

	 
	public GeneticAlgorithm(
		final Factory<Genotype<G>> genotypeFactory,
		final Function<? super Genotype<G>, ? extends C> fitnessFunction,
		final Function<? super C, ? extends C> fitnessScaler
	) {
		this(
			genotypeFactory,
			fitnessFunction,
			fitnessScaler,
			Optimize.MAXIMUM,
			null
		);
	}

	public void setup() {
		_lock.lock();
		try {
			prepareSetup();
			_population.fill(
				_phenotypeFactory,
				_populationSize - _population.size()
			);
			finishSetup();
		} finally {
			_lock.unlock();
		}
	}

	public void setup(final Collection<Genotype<G>> genotypes) {
		_lock.lock();
		try {
			prepareSetup();
			setGenotypes(genotypes);
			finishSetup();
		} finally {
			_lock.unlock();
		}
	}

	private void prepareSetup() {
		if (_generation > 0) {
			throw new IllegalStateException(
				"Metode GeneticAlgorithm.setup () harus dipanggil hanya sekali."
			);
		}

		++_generation;
		_executionTimer.start();
	}

	private void finishSetup() {
		//Mengevaluasi kebugaran.
		evaluate();

		//Valuasi pertama dari populasi awal.
		_statisticTimer.start();
		_statistics = _calculator.evaluate(
			_executor, _population, _generation, _optimization
		).build();

		_bestStatistics = _statistics;
		_statisticTimer.stop();

		_executionTimer.stop();

		setTimes(_statistics);
	}

	/**
	 * Berevolusi satu generasi.
	 *
	 */
	public void evolve() {
		_lock.lock();
		try {
			// Memeriksa keadaan setup.
			if (_generation == 0) {
				throw new IllegalStateException(
					"Call the GeneticAlgorithm.setup() method before " +
					"calling GeneticAlgorithm.evolve()."
				);
			}


			//Mulai timer eksekusi keseluruhan
			_executionTimer.start();

			//Kenaikan generasi dan generasi.
			++_generation;

			//Pilih selamat dan keturunannya.
			_selectTimer.start();
			final Array<Population<G, C>> selection = select();
			final Population<G, C> survivors = selection.get(0);
			final Population<G, C> offsprings = selection.get(1);
			_selectTimer.stop();

			//Alter keturunan (Rekombinasi, Mutasi ...).
			_alterTimer.start();
			_alterer.alter(offsprings, _generation);
			_alterTimer.stop();

			// Menggabungkan populasi baru (yang berisi korban dan keturunan diubah).
			_combineTimer.start();
			final int killed = _killed.get();
			final int invalid = _invalid.get();
			_population = combine(survivors, offsprings);
			_combineTimer.stop();

			//Mengevaluasi fitness
			evaluate();

			//Evaluasi statistik
			_statisticTimer.start();
			final Statistics.Builder<G, C> builder = _calculator.evaluate(
					_executor, _population, _generation, _optimization
				);
			builder.killed(_killed.get() - killed);
			builder.invalid(_invalid.get() - invalid);
			_statistics = builder.build();

			final int comp = _optimization.compare(
				_statistics.getBestPhenotype(),
				_bestStatistics.getBestPhenotype()
			);

			if (comp > 0) {
				_bestStatistics = _statistics;
			}

			_statisticTimer.stop();

			_executionTimer.stop();

			setTimes(_statistics);
		} finally {
			_lock.unlock();
		}
	}

	private void setTimes(final Statistics<?, ?> statistic) {
		statistic.getTime().execution.set(_executionTimer.getInterimTime());
		statistic.getTime().selection.set(_selectTimer.getInterimTime());
		statistic.getTime().alter.set(_alterTimer.getInterimTime());
		statistic.getTime().combine.set(_combineTimer.getInterimTime());
		statistic.getTime().evaluation.set(_evaluateTimer.getInterimTime());
		statistic.getTime().statistics.set(_statisticTimer.getInterimTime());
	}

	private void evaluate() {
		_evaluateTimer.start();
		try (Concurrency c = Concurrency.with(_executor)) {
			c.execute(_population);
		}
		_evaluateTimer.stop();
	}

	/**
	 * Berevolusi jumlah tertentu {generasicode}
	 *
	 */
	public void evolve(final int generations) {
		for (int i = 0; i < generations; ++i) {
			evolve();
		}
	}

	/**
	 * Berevolusi GA selama yang diberikan {link Fungsi} return {code true}.
	 *
	 */
	public void evolve(final Function<? super Statistics<G, C>, Boolean> until) {
		requireNonNull(until, "Termination condition");
		while (until.apply(getStatistics())) {
			evolve();
		}
	}

	private Array<Population<G, C>> select() {
		final Array<Population<G, C>> selection = new Array<>(2);
		final int numberOfSurvivors = getNumberOfSurvivors();
		final int numberOfOffspring = getNumberOfOffsprings();
		assert (numberOfSurvivors + numberOfOffspring == _populationSize);

		try (Concurrency c = Concurrency.with(_executor)) {
			c.execute(new Runnable() {
				@Override
				public void run() {
					final Population<G, C> survivors = _survivorSelector.select(
						_population, numberOfSurvivors, _optimization
					);

					assert (survivors.size() == numberOfSurvivors);
					selection.set(0, survivors);
				}
			});

			final Population<G, C> offsprings = _offspringSelector.select(
				_population, numberOfOffspring, _optimization
			);

			assert (offsprings.size() == numberOfOffspring);
			selection.set(1, offsprings);
		}

		return selection;
	}

	private Population<G, C> combine(
		final Population<G, C> survivors,
		final Population<G, C> offsprings
	) {
		assert (survivors.size() + offsprings.size() == _populationSize);
		final Population<G, C> population = new Population<>(_populationSize);

		try (Concurrency c = Concurrency.with(_executor)) {
			// Matikan yang sudah tua dan menggantinya dengan yang baru.
			c.execute(new Runnable() {
				@Override
				public void run() {
					for (int i = 0, n = survivors.size(); i < n; ++i) {
						final Phenotype<G, C> survivor = survivors.get(i);

						final boolean isTooOld =
							survivor.getAge(_generation) > _maximalPhenotypeAge;

						final boolean isInvalid = isTooOld || !survivor.isValid();

						// Maaf, terlalu tua atau tidak valid.
						if (isInvalid) {
							survivors.set(i, _phenotypeFactory.newInstance());
						}

						if (isTooOld) {
							_killed.incrementAndGet();
						} else if (isInvalid) {
							_invalid.incrementAndGet();
						}
					}
				}
			});

			// Dalam waktu yang berarti kita dapat menambahkan keturunan.
			population.addAll(offsprings);
		}

		population.addAll(survivors);

		return population;
	}

	private int getNumberOfSurvivors() {
		return _populationSize - getNumberOfOffsprings();
	}

	private int getNumberOfOffsprings() {
		return (int)round(
			_offspringFraction*_populationSize
		);
	}

	/**
	 * Kembali {code true} jika {link #setup ()} metode telah disebut,
	 */
	public boolean isInitialized() {
		_lock.lock();
		try {
			return _generation > 0;
		} finally {
			_lock.unlock();
		}
	}

	public Lock getLock() {
		return _lock;
	}

	/**
	 * Kembalikan digunakan genotipe {} Pabriklink dari GA. Pabrik genotipe
	 */
	 
	public Factory<Genotype<G>> getGenotypeFactory() {
		return _genotypeFactory;
	}
	
	public Function<? super Genotype<G>, ? extends C> getFitnessFunction() {
		return _fitnessFunction;
	}

	public void setFitnessScaler(final Function<? super C, ? extends C> scaler) {
		_fitnessScaler = requireNonNull(scaler, "FitnessScaler");
	}

	/**
	 * Kembalikan kebugaran scaler saat ini digunakan {}link Fungsi dari GA.
	 */
	public Function<? super C, ? extends C> getFitnessScaler() {
		return _fitnessScaler;
	}

	/**
	 * Kembali fraksi keturunan saat ini digunakan dari GA.
	 */
	public double getOffspringFraction() {
		return _offspringFraction;
	}

	/**
	 * Kembalikan saat ini digunakan keturunan {} Selectorlink dari GA.
	 */
	public Selector<G, C> getOffspringSelector() {
		return _offspringSelector;
	}

	/**
	 * Kembalikan saat ini digunakan survivor {} Selectorlink dari GA.
	 *
	 */
	public Selector<G, C> getSurvivorSelector() {
		return _survivorSelector;
	}

	/**
	 * Kembalikan saat ini digunakan {link Alterer} dari GA.
	 */
	public Alterer<G> getAlterer() {
		return _alterer;
	}

	/**
	 * Kembali generasi saat ini secara keseluruhan.
	 */
	public int getGeneration() {
		return _generation;
	}

	/**
	 * Kembali usia maksimal dari {link Fenotipe} s.
	 *
	 */
	public int getMaximalPhenotypeAge() {
		return _maximalPhenotypeAge;
	}

	/**
	 * Kembali yang terbaik {}link Fenotipe sejauh atau {code null} jika GA belum diinisialisasi belum.
	 */
	public Phenotype<G, C> getBestPhenotype() {
		return _bestStatistics != null ? _bestStatistics.getBestPhenotype() : null;
	}

	public Statistics<G, C> getStatistics() {
		return _statistics;
	}

	/**
	 * Mengatur pilihan keturunan.
	 *
	 */
	public void setOffspringSelector(final Selector<G, C> selector) {
		_offspringSelector = requireNonNull(selector, "Offspring selector");
	}

	/**
	 * Mengatur pilihan yang selamat
	 *
	 */
	public void setSurvivorSelector(final Selector<G, C> selector) {
		_survivorSelector = requireNonNull(selector, "Survivor selector");
	}

	/**
	 * Set kedua, pemilih keturunan dan pemilih yang selamat.
	 *
	 */
	public void setSelectors(final Selector<G, C> selector) {
		setOffspringSelector(selector);
		setSurvivorSelector(selector);
	}

	/**
	 * Mengatur fraksi keturunan.
	 *
	 */
	public void setOffspringFraction(final double offspringFraction) {
		_offspringFraction = checkProbability(offspringFraction);
	}
	public void setAlterer(final Alterer<G> alterer) {
		_alterer = requireNonNull(alterer, "Alterer");
	}

	@SafeVarargs
	public final void setAlterers(final Alterer<G>... alterers) {
		setAlterer(CompositeAlterer.of(alterers));
	}

	/**
	 * Mengatur usia maksimal fenotip dalam populasi.
	 *
	 */
	public void setMaximalPhenotypeAge(final int age) {
		if (age < 1) {
			throw new IllegalArgumentException(format(
				"Phenotype age must be greater than one, but was %s.", age
			));
		}
		_maximalPhenotypeAge = age;
	}

	/**
	 * Mengatur ukuran populasi yang diinginkan.
	 */
	public void setPopulationSize(final int size) {
		if (size < 1) {
			throw new IllegalArgumentException(format(
				"Population size must be greater than zero, but was %s.", size
			));
		}
		_populationSize = size;
	}

	public void setPopulation(final Collection<Phenotype<G, C>> population) {
		forEach(population, NonNull);
		if (population.size() < 1) {
			throw new IllegalArgumentException(format(
				"Population size must be greater than zero, but was %s.",
				population.size()
			));
		}

		final Population<G, C> pop = new Population<>(population.size());
		for (Phenotype<G, C> phenotype : population) {
			pop.add(phenotype.newInstance(
				_fitnessFunction, _fitnessScaler, _generation
			));
		}

		_population = pop;
		_populationSize = population.size();
	}

	
	public void setGenotypes(final Collection<Genotype<G>> genotypes) {
		forEach(genotypes, NonNull);
		if (genotypes.size() < 1) {
			throw new IllegalArgumentException(
				"Genotype size must be greater than zero, but was " +
				genotypes.size() + ". "
			);
		}

		final Population<G, C> population = new Population<>(genotypes.size());
		for (Genotype<G> genotype : genotypes) {
			population.add(Phenotype.of(
				genotype,
				_fitnessFunction,
				_fitnessScaler,
				_generation
			));
		}

		_population = population;
		_populationSize = genotypes.size();
	}

	/**
	 * Kembali salinan dari populasi saat ini.
	 *
	 */
	public Population<G, C> getPopulation() {
		return new Population<>(_population);
	}

	/**
	 * Kembali ukuran populasi yang diinginkan dari GA.
	 *
	 */
	public int getPopulationSize() {
		return _populationSize;
	}

	/**
	 * Kembali statistik fenotip terbaik.
	 */
	public Statistics<G, C> getBestStatistics() {
		return _bestStatistics;
	}

	/**
	 * Kembali jumlah fenotipe tewas, sejauh ini.
	 */
	public int getNumberOfKilledPhenotypes() {
		return _killed.get();
	}

	/**
	 * Kembali jumlah fenotip yang tidak valid, sejauh ini.
	 */
	public int getNumberOfInvalidPhenotypes() {
		return _invalid.get();
	}

	/**
	 * Mengatur kalkulator statistik untuk algoritma ini misalnya genetik.
	 */
	public void setStatisticsCalculator(
		final Statistics.Calculator<G, C> calculator
	) {
		_calculator = requireNonNull(calculator, "Statistic calculator");
	}

	/**
	 * Kembali arus statistik kalkulator.
	 */
	public Statistics.Calculator<G, C> getStatisticsCalculator() {
		return _calculator;
	}

	/**
	 * Kembali statistik waktu saat ini GA.
	 */
	public Statistics.Time getTimeStatistics() {
		_lock.lock();
		try {
			final Statistics.Time time = new Statistics.Time();
			time.alter.set(_alterTimer.getTime());
			time.combine.set(_combineTimer.getTime());
			time.evaluation.set(_evaluateTimer.getTime());
			time.execution.set(_executionTimer.getTime());
			time.selection.set(_selectTimer.getTime());
			time.statistics.set(_statisticTimer.getTime());
			return time;
		} finally {
			_lock.unlock();
		}
	}

	/**
	 * Metode ini memperoleh kunci untuk memastikan bahwa nilai yang dikembalikan konsisten.
	 */
	@Override
	public String toString() {
		Phenotype<G, C> phenotype = null;
		int generation = 0;

		_lock.lock();
		try {
			generation = _generation;
			phenotype = getStatistics().getBestPhenotype();
		} finally {
			_lock.unlock();
		}

		return format("%4d: (best) %s", generation, phenotype);
	}

}


Kode programnya lengkapnya akan dibahas pada artikel berikutnya.


Algoritma Genetika Source Code Java

Algoritma Genetika

Algoritma genetika mrp teknik pencarian yg di dlm ilmu komputer unt menemukan penyelesaian perkiraan unt optimisasi & masalah pencarian. Algoritma genetika mrp kelas khusus dr algoritma evolusioner dg memakai teknik yg terinspirasi oleh biologi evolusioner spt warisan, mutasi, seleksi alam & rekombinasi (atau crossover)

Algoritma Genetika pertama kali dikembangkan oleh John Holland pd tahun 1970-an di New York, Amerika Serikat. Dia beserta murid-murid & teman kerjanya menghasilkan buku berjudul "Adaption in Natural and Artificial Systems" pd tahun 1975.

Algoritma Genetika khususnya diterapkan sbg simulasi komputer dimana sebuah populasi representasi abstrak (disebut kromosom) dr solusi-solusi calon (disebut individual) pd sebuah masalah optimisasi akan berkembang mjd solusi-solusi yg lbh baik. Secara tradisional, solusi-solusi dilambangkan dlm biner sbg string '0' & '1', walaupun dimungkinkan jg penggunaan penyandian (encoding) yg berbeda. 

Evolusi

Evolusi dimulai dr sebuah populasi individual acak yg lengkap & terjadi dlm generasi-generasi. dlm tiap generasi, kemampuan keseluruhan populasi dievaluasi, kemudian multiple individuals di pilih dr populasi sekarang (current) tsb secara stochastic (berdasarkan kemampuan mereka), lalu dimodifikasi (melalui mutasi / rekombinasi) mjd bentuk populasi baru yg mjd populasi sekarang (current) pd iterasi berikutnya dr algoritma.
Algoritma genetik yg umum menyaratkan dua hal unt didefinisikan: 

(1) representasi genetik dr penyelesaian
(2) fungsi kemampuan unt mengevaluasinya.

Representasi baku mrp sebuah larik bit-bit. Larik jenis & struktur lain bisa dipakai dg cara yg sama. Hal utama yg membuat representasi genetik ini mjd tepat mrp bahwa bagian-bagiannya mudah diatur karena ukurannya yg tetap, yg memudahkan operasi persilangan sederhana. Representasi panjang variabel jg dipakai, tetapi implementasi persilangan lbh kompleks dlm kasus ini. Representasi spt pohon diselidiki dlm pemrograman genetik & representasi bentuk bebas diselidiki di dlm HBGA.

Fungsi kemampuan didefinisikan di atas representasi genetik & mengukur kualitas penyelesaian yg diwakili. Fungsi kemampuan selalu tergantung pd masalah. sbg contoh, jika pd ransel kita ingin memaksimalkan jumlah benda (obyek) yg bisa kita masukkan ke dalamnya pd beberapa kapasitas yg tetap. Representasi penyelesaian mungkin berbentuk larik bits, dimana tiap bit mewakili obyek yg berbeda, & nilai bit (0 / 1) menggambarkan apakah obyek tsb ada di dlm ransel / tidak. tdk setiap representasi spt ini valid, karena ukuran obyek bisa melebihi kapasitas ransel. Kemampuan penyelesaian mrp jumlah nilai dr semua obyek di dlm ransel jika representasi itu valid, / jika tdk 0. dlm beberapa masalah, susah / bahkan tdk mungkin unt mendefinisikan lambang kemampuan, maka pd kasus ini dipakai IGA.

Sekali kita mendefinisikan representasi genetik & fungsi kemampuan, algoritma genetik akan memproses inisialisasi populasi penyelesaian secara acak, & memperbaikinya melalui aplikasi pengulangan dg aplikasi operator-operator mutasi, persilangan, & seleksi.

Algoritma genetik mrp suatu metode yg memakai seleksi alam yg mrp bagian utama dr prinsip evolusi sbg dasar pemikiran unt menyelesaikan suatu permasalahan. Prinsip ini dikemukakan oleh Charles Darwin, dimana tanpa menghiraukan prinsip dasar penurunan sifat, Darwin mengemukakan penggabungan kualitas induk pd generasi berikutnya, disamping itu bahwa individu yg mampu beradaptasi dg lingkunganya akan mempunyai kesempatan hidup yg lbh besar.

Penggunaan prinsip genetika pd komputer dimulai pd tahun 1950 ketika beberapa ahli Biologi memakai komputer unt simulasi sistem biologi. Akhir tahun 1975 John Holland dr Universitas Michigan melalui paper yg berjudul “Adaption in Natural and Artificial System” memakai konsep dasar algoritma genetika. Algoritma genetika bekerja dg suatu populasi string & melakukan proses pencarian nilai optimal secara parallel, dg memakai operator genetika. Algoritma genetika akan melakukan rekombinasi antar individu.

Algoritma genetika memiliki elemen dasar berupa string yg tersusun dr rangkaian substring (gen), yg masing-masing mrp kode dr parameter dlm ruang solusi dimana suatu string (kromosom) menyatakan kandidat solusi. Kumpulan string dlm populasi berkembang dr generasi ke generasi melalui operator genetika. pd setiap iterasi, individu-individu (Kromosam) dlm populasi itu akan dievolusi & diseleksi unt menentukan populasi pd generasi berikutnya. Populasi ini akan terus berulang sampai menemukan suatu parameter dg nilai yg paling optimal sesuai dg yg diinginkan. Adapun struktur umum algoritma genetika bisa diilustrasikan pd gambar berikut:

Gambar 1. Struktur umum Algoritma Genetika

Binary encoding bisa memberikan bnyak kemungkinan pd kromosom meskipun pd jumlah allele yg sedikit. Dilain pihak jenis encoding ini tdk cukup natural unt beberapa kasus tertentu & kadang-kadang harus dilakukan koreksi setelah melakukancrossover / mutasi, contoh penggunaan Binary encoding mrp pd permasalahanknapsack / pengepakan, dimana ada beberapa barang dg jumlah & ukuran masing-masing & knapsack harus memberikan kapasitasnya unt barang-barang tsb, permasalahanya mrp bagaimana memilih barang unt memaksimalkan jumlah barang sehingga bisa ditampung olehk napsack tanpa harus menambah kapasitasnya.

Istilah-istilah yg dipakai dlm Algoritma genetika ini hampir sama dg istilah-istilah yg dipakai dlm bidang biologi genetika, antara lain Gen, Kromosom, Populasi, Fungsi Fitness, & operator genetika yg meliputi mutasi & crossover.

Gen mrp suatu sel dr suatu kromosom / nilai yg terdapat dlm Algoritma genetika ini bisa dibentuk oleh sebuah byte bahkan tdk menutup kemungkinan suatu string. Gen ini mewakili sebagian kecil dr solusi permasalahan.

Individu dlm populasi disebut string, genotype / kromosom-kromosom terdiri dr unit-unit yg dinamakan Gen, Karakter, Decoder. Kromosom ini bisa mewakili suatu solusi, dimana bisa diilustrasikan dlm gambar dibawah ini:


Gambar 2. Kromosom dalam 
Untuk mempresentasikan kromosom dilakukan dg proses encoding, dibawah ini akan dijelaskan beberapa proses encoding yg biasa dipakai dlm beberapa kasus tertentu.

Permutation Encoding

Untuk jenis Permutation Encoding ini dipakai unt permasalahan proses pengurutan, misalnya terdapat kasus optimasi jadwal / pd kasus traveling salesman. pd Permutation Encoding, setiap Gen pd kromosom berupa angka dimana bisa ditampilkan spt gambar di bawah ini:
Gambar 3. Permutation Encoding
Permutation Encoding hanya berlaku unt permasalahan pengurutan, unt itu dlm kasus-kasus yg ada pd Permutation Encoding terdapat beberapa jenis crossover & mutasi yg harus dibuat unt mempertahankan kromosom agar tetap konsisten. Contoh penggunaan Permutation Encoding ini mrp pd kasus trvelling salesman, dimana terdapat beberapa kota dg jarak masing-masing. pd kasus traveling salesman ini seorang salesman harus mengunjungi semua kota yg ada, tetapi tdk harus berjalan jauh unt mencapai seluruh kota. Permasalahanya mrp menentukan urutan kota yg akan dikunjungi unt meminimalisasi jarak yg harus ditempuh.

Binary encoding

Binary encoding mrp jenis encoding yg paling sering dipakai karena kasus pertama yg ada pd Algiritma Genetik memakai algoritma jenis ini. Setiap kromosom padaBinary encoding mrp bit 0 & 1 dimana bisa ditampilkan pd gambar bawah:
Gambar 4. Binary encoding
Binary encoding bisa memberikan bnyak kemungkinan pd kromosom meskipun pd jumlah Gen yg sedikit. Dilain pihak jenis encoding ini tdk cukup natural unt beberapa kasus tertentu & kadang-kadang harus dilakukan koreksi setelah melakukancrossover / mutasi, contoh penggunaan Binary encoding mrp pd permasalahanknapsack / pengepakan, dimana ada beberapa barang dengna jumlah & ukuran masing-masing & knapsack harus memberikan kapasitasnya unt barang-barang tsb, permasalahanya mrp bagaimana memilih barang unt memaksimalkan jumlah barang sehingga bisa ditampung oleh knapsack tanpa harus menambah kapasitasnya.

Crossover

Crossover mrp operator algoritma genetika yg membutuhkan parameter dua kromosom. Dua buah kromosom tsb disebut kromosom induk. Operator ini akan menghasilkan dua buah kromosom baru. Ada beberapa jenis crossover yg sering dipakai dlm algoritma genetika antara lain:

Ordered Based Crossover

Ordered based Crossover diawali dg menentukan posisi-posisi gen secara random pd induk pertama misalnya didapatkan posisi 3,4,6 & 9 pd induk.

P1= ( 1 2 3 4 5 6 7 8 9 )

P1= ( 4 5 2 1 8 7 6 9 3 )

Kemudian Gen-gen pd induk yg berada tepat dibawah posisi-posisi tsb dicatat yaitu 2,1,7 & 3 unt Q1 disalin dr P1 dg menghilangkan angka-angka 2,1,7 dan3 tsb sehingga menjadi

Q1= ( x x x 4 5 6 x 8 9 )

Subset 2,1,7, & 3 ini di masukan dlm Q1 dimulai dr kiri dg mempertahankan urutan sehingga menjadi

Q1 = (2 1 7 4 5 6 3 8 9)

Untuk Q2 diperlukan sama hanya perlu meukar induk pertama mjd induk kedua & induk kedua mjd induk pertama yg menjadi:

Q2 = (3 5 2 1 8 7 4 6 9)

One-Point Crossover

Contoh kerja operator ini mrp dg menentukan crossover point (gen tertentu). Kromosom baru pertama berisi gen pertama sampai gen crossover point dr kromosom induk pertama ditambah dg gen dr crossover point sampai gen terakhir dr kromosom induk kedua. Kromosom baru kedua berisi gen pertama sampai gen crossover point dr induk kedua ditambahkan dg gen dr crossover point sampai gen dr kromosom induk pertama. Adapun metode crossover ini bisa diilustrasikan pd gambar berikut:
Gambar 5. Proses crossover dengan satu crossover point
Dari ilustrasi di atas maka contoh penerapan metode One-Point Crossover mrp sbg berikut:

Parent 1: 1 2 3 4 5 | 6 7 8 9
Parent 2: 4 5 3 6 8 | 9 7 2 1

Setelah proses crossover turunan yg bisa dihasilkan mrp dr kedua parent diatas adalah:

Parent 1: 1 2 3 4 5 | 9 7 2 1
Parent 2: 4 5 3 6 8 | 6 7 8 9

Two-Point Crossover

Proses Two-Point Crossover hampir sama dg prosedur One-Point Crossover, kecuali pd Two-Point Crossover harus di pilih dua crossover point & hanya gen yg ada di antara kedua crossover point itu yg akan ditukarkan.
Metode ini bisa mjd bagian awal & akhir dr kromosom & hanya menukar bagian tengahnya saja.

N-Point Crossover

Prosedur N-Point Crossover hampir sama baik dg prosedur one-point crossover maupuntwo-point crossover, hanya saja dlm n-point crossover ini harus di pilih n crossover point & hanya gen di antara crossover point ganjil & genap yg bisa ditukarkan sedangkan gen diantara genap & ganjil operator crossover tdk berubah. / dg kata lain harus di pilih posisi n & hanya bit antara ganjil & genap posisi crossover yg akan dihilangkan.

Contoh:
P1= 9 7 6 3 2 8
P2= 2 1 9 7 4 5

Jika didapatkan angka random unt n=3 & diacak 1,2 & 4 sbg posisi dr gen yg akan di crossover, didapatkan kromosom turunan:

T1= 9 1 6 3 4 5
T2= 2 7 9 7 2 8

Mutasi

Mutasi mrp operator yg membutuhkan satu perameter. Kromosom operator ini mrp nilai suatu gen dr sebuah kromosom sehingga kromosom yg baru ini berbeda dg kromosom yg lama. Sekumpulan kejadian dg suatu nilai pelanggaran maksimal bisa dg mudah dihilangkan selama evaluasi fitness “tujuan dr proses mutasi ini, unt mempertahankan kehilangan permanent dr suatu bit / gen” (Whitley,1993:16). Seluruh proses mutasi ini menjanjikan keuntungan melalui pengarahan mutasi kemana mutasi ini tsb sangat dibutuhkan. Oprator mutasi dipakai unt melakukan modifikasi satu / lbh dr nilai gen dlm individu yg sama. Mutasi memastikan bahwa probabilitas unt pencarian pd daerah tertentu dlm persoalan tdk akan pernah nol & mencegah kehilangan total materi genetika setelah pemilihan & penghapusan. Mutasi ini bukanlah operator genetika yg utama, yg dilakukan secara acak pd gen dg kemungkinan yg lbh kecil. Metode ini disebut metasi gen (gene mutation) terdapat metode lain yaitu: “order mutation” dimana dimungkinkan unt menghilangkan seluruh gen dr dua gen yg di pilih secara acak. Terdapat empat operator yg biasa dipakai unt permasalahan penjadwalan antara lain:

Violation Directed Mutation (VDM)

Memilih sutatu kejadian dg suatu nilai pelanggaran maksimal, & secara acak mengubah waktu penugasan.

Event Freeing Mutation (EFM)

Memilih suatu kejadian dg sauatu pelanggaran maksimal, kemudian memberi waktu baru yg mana akan mengurangi secara maksimal angka ini.

Secara stokastik memilih suatu kejadian ,bias melalui kejadian itu dg nilai pelanggaran yg tinggi, kemudian secara stokastik memilh waktu baru unt kejadian ini, bisa melalui waktu yg mana akan mengurangi secara maksimal angka pelanggaran kejadian.

Fungsi Objektif

Fungsi objektif mrp tujuan dr optimasi permasalahan. Biasanya fungsi objektif ini hanya dua macam yaitu memaksimalkan & meminimalkan

Model Pengembangan Algoritma Genetika

Algoritma genetika menyelesaikan permasalahan dg cara menghasilkan, mengubah & mengevaluasi kandidat solusi dr permasalahan tsb. Awalnya sebuah populasi acak yg terdiri dr kromosom-kromosom di hasilkan kemudian kromosom-kromosom itu diubah oleh operator genetika yaitu crossover & mutasi, kemudian kromosom-kromosom tsb dievaluasi oleh fungsi fitness.

Terdapat beberapa cara dlm menentukan inisialisasi diantaranya biner & non biner. unt inisialisasi masalah penjadwalan yg paling sederhana bisa dilihat sbg masalah penetapan V even / kejadian dlm S selang waktu dg kata lain definisi dr masalah penjadwalan adalah:

E mrp definisi dr sejumlah V even (e1.e2,….en)
T mrp definisi dr sejumlah S selang waktu (t1,t2,…tn)

Berdasarkan definisi tsb maka permasalahan penjadwalan tsb ditetapkan sbg pasangan terurut (a,b) yg berarti a Є E & b Є T, dg intepretasi bahwa evena terjadi pd selang waktu b.

Terdapat berbagai versi pengkodean masalah penjadwalan diantaranya mrp representasi klasik & representasi Tuples. dlm representasi kalsik dipakai matrik dua dimensi. Bagian kolom mrp bagian produksi & bagian baris mrp interval waktu. Isi dr matrik M(i,j) mrp staf / karyawan yg mengerjakan WOdan jumlah shiftnya. Jadi matrik M(i,j) dibaca sbg karyawan dg shift m mengerjakan WOpada bagian produksi.

Metode penentuan lokasi awal sangat berpengaruh terhadap kinerja algoritma genetika. Ada dua cara yg bisa dipakai unt menghasilkan dua populasi awal. Cara yg pertama dg menghasilkan seluruh kromosom secara acak. Sedangkan cara yg kedua sbgn kromosom dihasilkan dg metode tertentu, yg dikenal dg populasi awal terarah. Salah satu metode unt membangkitkan populasi awal mrp metodeJoshepus permutation.

Berikut mrp algoritma joshepus permutation:


Step 1 = [ Nilai awal ]
For i=1 to N Step1
Plist[i]  0
End for
N Loop  random (N) + 1
F gen  random (N) + 1
K=1
Step 2 = [ Isi nilai gen ]
Kromosom [k]  F gen
Plist [F gen]  1
Step 3 = [ Cek kondisi ]
If ( K= n ) then go to Step 7
End if
Step 4 = [ Cari nilai gen selanjutnya ]
For i=1 to N Loop Step1
Repeat
F gen  F gen + 1
If (F gen > N) then
F gen  1
Until Plist [F gen] <> 1
End if
End for
Step 5 = [ Naikan ounter k ]
K =K+1
Step 6 = [ Ulangi Step2 sampai Step 5 ]
Go to Step 2
Step 7 = [ Ulangi unt kromosom selanjutnya ]
If Belum_semua_krm_telah_diinisialisasi then
Kromosom  parameter_ke_krm_berikutnya_dalam_populasi
Go to Step 2
End if
Step 8 = [ Selesai ]
Return


N mrp jumlah allele dlm seluruh kromosom, Plist mrp sebuah array dg jumlah element sebnyak N, random (x) mrp fungsi generator bilangan random antara 0 sampai x-1. element array dimulai dr 1. kromosom mrp element dr array populasi yg menampung urutan allele.

Fungsi Evaluasi / Fungsi Fitness

Fungsi mrp salah satu aspek terpenting dlm algoritma genetika. Fungsi evaluasi yg baik harus mampu menghasilkan suatu kurva silo. Siklus yg cukup baik & bisa mewakili permasalahan yg dihadapi.Pengumpulan dini dlm algoritma genetika terjadi ketika beberapa kromosom dg nilai fitness yg tinggi (tapi bukan optimal) memdominasi populasi dg mengakibatkan algoritma genetika konvergen pd local optima. Ketika populasi konvergenkemampuan algoritma genetika unt mencari solusi manjadi lbh baik. Crossover antara kromosom yg hampir identik menghasilkan kromosom baru yg identik dlm operasi ini hanya operasi mutasi yg mampu menghasilkan kromosom yg relatif baru & mrp cara unt menghidarkan kromosom yg super mendominasi populasi.

Algoritma Genetika Source Code Java




package org.jenetics;

import static java.lang.Math.round;
import static java.lang.String.format;
import static java.util.Objects.requireNonNull;
import static org.jenetics.internal.util.object.NonNull;
import static org.jenetics.internal.util.object.checkProbability;
import static org.jenetics.util.arrays.forEach;

import java.util.Collection;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import org.jenetics.internal.util.Concurrency;

import org.jenetics.util.Array;
import org.jenetics.util.Factory;
import org.jenetics.util.Function;
import org.jenetics.util.Timer;
import org.jenetics.util.functions;

/**
 * <h3>Getting started</h3>
 *
 * Setup minimum GA kebutuhan pabrik genotipe, {code Pabrik <Genotipe <? >>},
 * Dan kebugaran {link Fungsi}. The {link Genotipe} mengimplementasikan
 * {}link Pabrik antarmuka dan karena itu dapat digunakan sbg prototipe untuk menciptakan
 * Penduduk awal dan untuk menciptakan Genotipe acak baru.
 *
 */
public class GeneticAlgorithm<
	G extends Gene<?, G>,
	C extends Comparable<? super C>
>
{

	/**
	 * Ukuran populasi default yang digunakan oleh GA ini.
	 */
	public static final int DEFAULT_POPULATION_SIZE = 50;

	/**
	 * Usia standar fenotip maksimal GA ini:
	 */
	public static final int DEFAULT_MAXIMAL_PHENOTYPE_AGE = 70;

	/**
	 * Fraksi keturunan default yang digunakan oleh GA ini.
	 */
	public static final double DEFAULT_OFFSPRING_FRACTION = 0.6;


	private final Lock _lock = new ReentrantLock(true);

	private final Optimize _optimization;
	private final Executor _executor;

	private final Factory<Genotype<G>> _genotypeFactory;
	private final Factory<Phenotype<G, C>> _phenotypeFactory;
	private final Function<? super Genotype<G>, ? extends C> _fitnessFunction;
	private Function<? super C, ? extends C> _fitnessScaler;

	private double _offspringFraction = DEFAULT_OFFSPRING_FRACTION;

	// Alterers
	private Alterer<G> _alterer = CompositeAlterer.of(
		new SinglePointCrossover<G>(0.1),
		new Mutator<G>(0.05)
	);

	// Selectors
	private Selector<G, C> _survivorSelector = new TournamentSelector<>(3);
	private Selector<G, C> _offspringSelector = new TournamentSelector<>(3);

	// Population
	private int _populationSize = DEFAULT_POPULATION_SIZE;
	private Population<G, C> _population = new Population<>(_populationSize);
	private int _maximalPhenotypeAge = DEFAULT_MAXIMAL_PHENOTYPE_AGE;
	private volatile int _generation = 0;

	// Statistics
	private Statistics.Calculator<G, C> _calculator = new Statistics.Calculator<>();
	private Statistics<G, C> _bestStatistics = null;
	private Statistics<G, C> _statistics = null;
	private final AtomicInteger _killed = new AtomicInteger(0);
	private final AtomicInteger _invalid = new AtomicInteger(0);

	//Beberapa ukuran kinerja.
	private final Timer _executionTimer = new Timer("Execution time");
	private final Timer _selectTimer = new Timer("Select time");
	private final Timer _alterTimer = new Timer("Alter time");
	private final Timer _combineTimer = new Timer("Combine survivors and offspring time");
	private final Timer _statisticTimer = new Timer("Statistic time");
	private final Timer _evaluateTimer = new Timer("Evaluate time");


	/**
	 * Buat algoritma genetika baru.
	 *
	 *param GenotypeFactory pabrik genotipe GA ini bekerja dengan.
     *param FitnessFunction fungsi fitness GA ini menggunakan.
     *param FitnessScaler scaler kebugaran GA ini menggunakan.
     * Optimasiparam Tentukan apakah GA ini memaksimalkan atau meminimalkan
     * Fungsi fitness.
     *param Eksekutor {link java.util.concurrent.Executor} digunakan untuk
     * Mengeksekusi bagian parallelizable kode.
      *throws NullPointerException jika salah satu argumen adalah {code null}.
	 */
	public GeneticAlgorithm(
		final Factory<Genotype<G>> genotypeFactory,
		final Function<? super Genotype<G>, ? extends C> fitnessFunction,
		final Function<? super C, ? extends C> fitnessScaler,
		final Optimize optimization,
		final Executor executor
	) {
		_genotypeFactory = requireNonNull(genotypeFactory, "GenotypeFactory");
		_fitnessFunction = requireNonNull(fitnessFunction, "FitnessFunction");
		_fitnessScaler = requireNonNull(fitnessScaler, "FitnessScaler");
		_optimization = requireNonNull(optimization, "Optimization");
		_executor = requireNonNull(executor, "Executor");

		_phenotypeFactory = new Factory<Phenotype<G, C>>() {
			@Override public Phenotype<G, C> newInstance() {
				return Phenotype.of(
					_genotypeFactory.newInstance(),
					_fitnessFunction,
					_fitnessScaler,
					_generation
				);
			}
		};
	}

	/**
	 * Buat algoritma genetika baru.
     *
     *param GenotypeFactory pabrik genotipe GA ini bekerja dengan.
     *param FitnessFunction fungsi fitness GA ini menggunakan.
     *param FitnessScaler scaler kebugaran GA ini menggunakan.
     *Optimasiparam Tentukan apakah GA ini memaksimalkan atau meminimalkan
     *Fungsi fitness.
     *throws NullPointerException jika salah satu argumen adalah {code null}.
	 */
	public GeneticAlgorithm(
		final Factory<Genotype<G>> genotypeFactory,
		final Function<? super Genotype<G>, ? extends C> fitnessFunction,
		final Function<? super C, ? extends C> fitnessScaler,
		final Optimize optimization
	) {
		this(
			genotypeFactory,
			fitnessFunction,
			fitnessScaler,
			optimization,
			Concurrency.commonPool()
		);
	}

	/**
	* Buat algoritma genetika baru.
    *
    *param GenotypeFactory pabrik genotipe GA ini bekerja dengan.
    *param FitnessFunction fungsi fitness GA ini menggunakan.
    *Optimasiparam Tentukan apakah GA ini memaksimalkan atau meminimalkan
    *Fungsi fitness.
    *Param Eksekutor {link java.util.concurrent.Executor} digunakan untuk
    *Mengeksekusi bagian parallelizable kode.
    *throws NullPointerException jika salah satu argumen adalah {code null}.
	*/
	
	public GeneticAlgorithm(
		final Factory<Genotype<G>> genotypeFactory,
		final Function<? super Genotype<G>, ? extends C> fitnessFunction,
		final Optimize optimization,
		final Executor executor
	) {
		this(
			genotypeFactory,
			fitnessFunction,
			functions.<C>Identity(),
			optimization,
			executor
		);
	}

	/**
	 *Buat algoritma genetika baru.
     *
     *param GenotypeFactory pabrik genotipe GA ini bekerja dengan.
     *param FitnessFunction fungsi fitness GA ini menggunakan.
     *Optimasiparam Tentukan apakah GA ini memaksimalkan atau meminimalkan
     *Fungsi fitness.
     *throws NullPointerException jika salah satu argumen adalah {code null}.
	 */
	 
	public GeneticAlgorithm(
		final Factory<Genotype<G>> genotypeFactory,
		final Function<? super Genotype<G>, ? extends C> fitnessFunction,
		final Optimize optimization
	) {
		this(
			genotypeFactory,
			fitnessFunction,
			functions.<C>Identity(),
			optimization,
			Concurrency.commonPool()
		);
	}

	/**
	 *Buat algoritma genetika baru. Secara default GA mencoba untuk memaksimalkan
     *Fungsi fitness.
     *
     *param GenotypeFactory pabrik genotipe GA ini bekerja dengan.
     *param FitnessFunction fungsi fitness GA ini menggunakan.
     *param Eksekutor {link java.util.concurrent.Executor} digunakan untuk
     *Mengeksekusi bagian parallelizable kode.
     *throws NullPointerException jika salah satu argumen adalah {code null}.
	 */
	public GeneticAlgorithm(
		final Factory<Genotype<G>> genotypeFactory,
		final Function<? super Genotype<G>, ? extends C> fitnessFunction,
		final Executor executor
	) {
		this(
			genotypeFactory,
			fitnessFunction,
			functions.<C>Identity(),
			Optimize.MAXIMUM,
			executor
		);
	}

	/**
	 *Buat algoritma genetika baru. Secara default GA mencoba untuk memaksimalkan
     *Fungsi fitness.
      *
     *param GenotypeFactory pabrik genotipe GA ini bekerja dengan.
     *param FitnessFunction fungsi fitness GA ini menggunakan.
     *throws NullPointerException jika salah satu argumen adalah {code null}.
	 */
	 
	public GeneticAlgorithm(
		final Factory<Genotype<G>> genotypeFactory,
		final Function<? super Genotype<G>, ? extends C> fitnessFunction
	) {
		this(
			genotypeFactory,
			fitnessFunction,
			functions.<C>Identity(),
			Optimize.MAXIMUM,
			Concurrency.commonPool()
		);
	}

	/**
	 *Buat algoritma genetika baru. Secara default GA mencoba untuk memaksimalkan
     *Fungsi fitness.
     *
     *param GenotypeFactory pabrik genotipe GA ini bekerja dengan.
     *param FitnessFunction fungsi fitness GA ini menggunakan.
     *param FitnessScaler scaler kebugaran GA ini menggunakan.
     *param Eksekutor {link java.util.concurrent.Executor} digunakan untuk
     *Mengeksekusi bagian parallelizable kode.
      *throws NullPointerException jika salah satu argumen adalah {code null}.
	 */
	 
	public GeneticAlgorithm(
		final Factory<Genotype<G>> genotypeFactory,
		final Function<? super Genotype<G>, ? extends C> fitnessFunction,
		final Function<? super C, ? extends C> fitnessScaler,
		final Executor executor
	) {
		this(
			genotypeFactory,
			fitnessFunction,
			fitnessScaler,
			Optimize.MAXIMUM,
			executor
		);
	}

	 
	public GeneticAlgorithm(
		final Factory<Genotype<G>> genotypeFactory,
		final Function<? super Genotype<G>, ? extends C> fitnessFunction,
		final Function<? super C, ? extends C> fitnessScaler
	) {
		this(
			genotypeFactory,
			fitnessFunction,
			fitnessScaler,
			Optimize.MAXIMUM,
			null
		);
	}

	public void setup() {
		_lock.lock();
		try {
			prepareSetup();
			_population.fill(
				_phenotypeFactory,
				_populationSize - _population.size()
			);
			finishSetup();
		} finally {
			_lock.unlock();
		}
	}

	public void setup(final Collection<Genotype<G>> genotypes) {
		_lock.lock();
		try {
			prepareSetup();
			setGenotypes(genotypes);
			finishSetup();
		} finally {
			_lock.unlock();
		}
	}

	private void prepareSetup() {
		if (_generation > 0) {
			throw new IllegalStateException(
				"Metode GeneticAlgorithm.setup () harus dipanggil hanya sekali."
			);
		}

		++_generation;
		_executionTimer.start();
	}

	private void finishSetup() {
		//Mengevaluasi kebugaran.
		evaluate();

		//Valuasi pertama dari populasi awal.
		_statisticTimer.start();
		_statistics = _calculator.evaluate(
			_executor, _population, _generation, _optimization
		).build();

		_bestStatistics = _statistics;
		_statisticTimer.stop();

		_executionTimer.stop();

		setTimes(_statistics);
	}

	/**
	 * Berevolusi satu generasi.
	 *
	 */
	public void evolve() {
		_lock.lock();
		try {
			// Memeriksa keadaan setup.
			if (_generation == 0) {
				throw new IllegalStateException(
					"Call the GeneticAlgorithm.setup() method before " +
					"calling GeneticAlgorithm.evolve()."
				);
			}


			//Mulai timer eksekusi keseluruhan
			_executionTimer.start();

			//Kenaikan generasi dan generasi.
			++_generation;

			//Pilih selamat dan keturunannya.
			_selectTimer.start();
			final Array<Population<G, C>> selection = select();
			final Population<G, C> survivors = selection.get(0);
			final Population<G, C> offsprings = selection.get(1);
			_selectTimer.stop();

			//Alter keturunan (Rekombinasi, Mutasi ...).
			_alterTimer.start();
			_alterer.alter(offsprings, _generation);
			_alterTimer.stop();

			// Menggabungkan populasi baru (yang berisi korban dan keturunan diubah).
			_combineTimer.start();
			final int killed = _killed.get();
			final int invalid = _invalid.get();
			_population = combine(survivors, offsprings);
			_combineTimer.stop();

			//Mengevaluasi fitness
			evaluate();

			//Evaluasi statistik
			_statisticTimer.start();
			final Statistics.Builder<G, C> builder = _calculator.evaluate(
					_executor, _population, _generation, _optimization
				);
			builder.killed(_killed.get() - killed);
			builder.invalid(_invalid.get() - invalid);
			_statistics = builder.build();

			final int comp = _optimization.compare(
				_statistics.getBestPhenotype(),
				_bestStatistics.getBestPhenotype()
			);

			if (comp > 0) {
				_bestStatistics = _statistics;
			}

			_statisticTimer.stop();

			_executionTimer.stop();

			setTimes(_statistics);
		} finally {
			_lock.unlock();
		}
	}

	private void setTimes(final Statistics<?, ?> statistic) {
		statistic.getTime().execution.set(_executionTimer.getInterimTime());
		statistic.getTime().selection.set(_selectTimer.getInterimTime());
		statistic.getTime().alter.set(_alterTimer.getInterimTime());
		statistic.getTime().combine.set(_combineTimer.getInterimTime());
		statistic.getTime().evaluation.set(_evaluateTimer.getInterimTime());
		statistic.getTime().statistics.set(_statisticTimer.getInterimTime());
	}

	private void evaluate() {
		_evaluateTimer.start();
		try (Concurrency c = Concurrency.with(_executor)) {
			c.execute(_population);
		}
		_evaluateTimer.stop();
	}

	/**
	 * Berevolusi jumlah tertentu {generasicode}
	 *
	 */
	public void evolve(final int generations) {
		for (int i = 0; i < generations; ++i) {
			evolve();
		}
	}

	/**
	 * Berevolusi GA selama yang diberikan {link Fungsi} return {code true}.
	 *
	 */
	public void evolve(final Function<? super Statistics<G, C>, Boolean> until) {
		requireNonNull(until, "Termination condition");
		while (until.apply(getStatistics())) {
			evolve();
		}
	}

	private Array<Population<G, C>> select() {
		final Array<Population<G, C>> selection = new Array<>(2);
		final int numberOfSurvivors = getNumberOfSurvivors();
		final int numberOfOffspring = getNumberOfOffsprings();
		assert (numberOfSurvivors + numberOfOffspring == _populationSize);

		try (Concurrency c = Concurrency.with(_executor)) {
			c.execute(new Runnable() {
				@Override
				public void run() {
					final Population<G, C> survivors = _survivorSelector.select(
						_population, numberOfSurvivors, _optimization
					);

					assert (survivors.size() == numberOfSurvivors);
					selection.set(0, survivors);
				}
			});

			final Population<G, C> offsprings = _offspringSelector.select(
				_population, numberOfOffspring, _optimization
			);

			assert (offsprings.size() == numberOfOffspring);
			selection.set(1, offsprings);
		}

		return selection;
	}

	private Population<G, C> combine(
		final Population<G, C> survivors,
		final Population<G, C> offsprings
	) {
		assert (survivors.size() + offsprings.size() == _populationSize);
		final Population<G, C> population = new Population<>(_populationSize);

		try (Concurrency c = Concurrency.with(_executor)) {
			// Matikan yang sudah tua dan menggantinya dengan yang baru.
			c.execute(new Runnable() {
				@Override
				public void run() {
					for (int i = 0, n = survivors.size(); i < n; ++i) {
						final Phenotype<G, C> survivor = survivors.get(i);

						final boolean isTooOld =
							survivor.getAge(_generation) > _maximalPhenotypeAge;

						final boolean isInvalid = isTooOld || !survivor.isValid();

						// Maaf, terlalu tua atau tidak valid.
						if (isInvalid) {
							survivors.set(i, _phenotypeFactory.newInstance());
						}

						if (isTooOld) {
							_killed.incrementAndGet();
						} else if (isInvalid) {
							_invalid.incrementAndGet();
						}
					}
				}
			});

			// Dalam waktu yang berarti kita dapat menambahkan keturunan.
			population.addAll(offsprings);
		}

		population.addAll(survivors);

		return population;
	}

	private int getNumberOfSurvivors() {
		return _populationSize - getNumberOfOffsprings();
	}

	private int getNumberOfOffsprings() {
		return (int)round(
			_offspringFraction*_populationSize
		);
	}

	/**
	 * Kembali {code true} jika {link #setup ()} metode telah disebut,
	 */
	public boolean isInitialized() {
		_lock.lock();
		try {
			return _generation > 0;
		} finally {
			_lock.unlock();
		}
	}

	public Lock getLock() {
		return _lock;
	}

	/**
	 * Kembalikan digunakan genotipe {} Pabriklink dari GA. Pabrik genotipe
	 */
	 
	public Factory<Genotype<G>> getGenotypeFactory() {
		return _genotypeFactory;
	}
	
	public Function<? super Genotype<G>, ? extends C> getFitnessFunction() {
		return _fitnessFunction;
	}

	public void setFitnessScaler(final Function<? super C, ? extends C> scaler) {
		_fitnessScaler = requireNonNull(scaler, "FitnessScaler");
	}

	/**
	 * Kembalikan kebugaran scaler saat ini digunakan {}link Fungsi dari GA.
	 */
	public Function<? super C, ? extends C> getFitnessScaler() {
		return _fitnessScaler;
	}

	/**
	 * Kembali fraksi keturunan saat ini digunakan dari GA.
	 */
	public double getOffspringFraction() {
		return _offspringFraction;
	}

	/**
	 * Kembalikan saat ini digunakan keturunan {} Selectorlink dari GA.
	 */
	public Selector<G, C> getOffspringSelector() {
		return _offspringSelector;
	}

	/**
	 * Kembalikan saat ini digunakan survivor {} Selectorlink dari GA.
	 *
	 */
	public Selector<G, C> getSurvivorSelector() {
		return _survivorSelector;
	}

	/**
	 * Kembalikan saat ini digunakan {link Alterer} dari GA.
	 */
	public Alterer<G> getAlterer() {
		return _alterer;
	}

	/**
	 * Kembali generasi saat ini secara keseluruhan.
	 */
	public int getGeneration() {
		return _generation;
	}

	/**
	 * Kembali usia maksimal dari {link Fenotipe} s.
	 *
	 */
	public int getMaximalPhenotypeAge() {
		return _maximalPhenotypeAge;
	}

	/**
	 * Kembali yang terbaik {}link Fenotipe sejauh atau {code null} jika GA belum diinisialisasi belum.
	 */
	public Phenotype<G, C> getBestPhenotype() {
		return _bestStatistics != null ? _bestStatistics.getBestPhenotype() : null;
	}

	public Statistics<G, C> getStatistics() {
		return _statistics;
	}

	/**
	 * Mengatur pilihan keturunan.
	 *
	 */
	public void setOffspringSelector(final Selector<G, C> selector) {
		_offspringSelector = requireNonNull(selector, "Offspring selector");
	}

	/**
	 * Mengatur pilihan yang selamat
	 *
	 */
	public void setSurvivorSelector(final Selector<G, C> selector) {
		_survivorSelector = requireNonNull(selector, "Survivor selector");
	}

	/**
	 * Set kedua, pemilih keturunan dan pemilih yang selamat.
	 *
	 */
	public void setSelectors(final Selector<G, C> selector) {
		setOffspringSelector(selector);
		setSurvivorSelector(selector);
	}

	/**
	 * Mengatur fraksi keturunan.
	 *
	 */
	public void setOffspringFraction(final double offspringFraction) {
		_offspringFraction = checkProbability(offspringFraction);
	}
	public void setAlterer(final Alterer<G> alterer) {
		_alterer = requireNonNull(alterer, "Alterer");
	}

	@SafeVarargs
	public final void setAlterers(final Alterer<G>... alterers) {
		setAlterer(CompositeAlterer.of(alterers));
	}

	/**
	 * Mengatur usia maksimal fenotip dalam populasi.
	 *
	 */
	public void setMaximalPhenotypeAge(final int age) {
		if (age < 1) {
			throw new IllegalArgumentException(format(
				"Phenotype age must be greater than one, but was %s.", age
			));
		}
		_maximalPhenotypeAge = age;
	}

	/**
	 * Mengatur ukuran populasi yang diinginkan.
	 */
	public void setPopulationSize(final int size) {
		if (size < 1) {
			throw new IllegalArgumentException(format(
				"Population size must be greater than zero, but was %s.", size
			));
		}
		_populationSize = size;
	}

	public void setPopulation(final Collection<Phenotype<G, C>> population) {
		forEach(population, NonNull);
		if (population.size() < 1) {
			throw new IllegalArgumentException(format(
				"Population size must be greater than zero, but was %s.",
				population.size()
			));
		}

		final Population<G, C> pop = new Population<>(population.size());
		for (Phenotype<G, C> phenotype : population) {
			pop.add(phenotype.newInstance(
				_fitnessFunction, _fitnessScaler, _generation
			));
		}

		_population = pop;
		_populationSize = population.size();
	}

	
	public void setGenotypes(final Collection<Genotype<G>> genotypes) {
		forEach(genotypes, NonNull);
		if (genotypes.size() < 1) {
			throw new IllegalArgumentException(
				"Genotype size must be greater than zero, but was " +
				genotypes.size() + ". "
			);
		}

		final Population<G, C> population = new Population<>(genotypes.size());
		for (Genotype<G> genotype : genotypes) {
			population.add(Phenotype.of(
				genotype,
				_fitnessFunction,
				_fitnessScaler,
				_generation
			));
		}

		_population = population;
		_populationSize = genotypes.size();
	}

	/**
	 * Kembali salinan dari populasi saat ini.
	 *
	 */
	public Population<G, C> getPopulation() {
		return new Population<>(_population);
	}

	/**
	 * Kembali ukuran populasi yang diinginkan dari GA.
	 *
	 */
	public int getPopulationSize() {
		return _populationSize;
	}

	/**
	 * Kembali statistik fenotip terbaik.
	 */
	public Statistics<G, C> getBestStatistics() {
		return _bestStatistics;
	}

	/**
	 * Kembali jumlah fenotipe tewas, sejauh ini.
	 */
	public int getNumberOfKilledPhenotypes() {
		return _killed.get();
	}

	/**
	 * Kembali jumlah fenotip yang tidak valid, sejauh ini.
	 */
	public int getNumberOfInvalidPhenotypes() {
		return _invalid.get();
	}

	/**
	 * Mengatur kalkulator statistik untuk algoritma ini misalnya genetik.
	 */
	public void setStatisticsCalculator(
		final Statistics.Calculator<G, C> calculator
	) {
		_calculator = requireNonNull(calculator, "Statistic calculator");
	}

	/**
	 * Kembali arus statistik kalkulator.
	 */
	public Statistics.Calculator<G, C> getStatisticsCalculator() {
		return _calculator;
	}

	/**
	 * Kembali statistik waktu saat ini GA.
	 */
	public Statistics.Time getTimeStatistics() {
		_lock.lock();
		try {
			final Statistics.Time time = new Statistics.Time();
			time.alter.set(_alterTimer.getTime());
			time.combine.set(_combineTimer.getTime());
			time.evaluation.set(_evaluateTimer.getTime());
			time.execution.set(_executionTimer.getTime());
			time.selection.set(_selectTimer.getTime());
			time.statistics.set(_statisticTimer.getTime());
			return time;
		} finally {
			_lock.unlock();
		}
	}

	/**
	 * Metode ini memperoleh kunci untuk memastikan bahwa nilai yang dikembalikan konsisten.
	 */
	@Override
	public String toString() {
		Phenotype<G, C> phenotype = null;
		int generation = 0;

		_lock.lock();
		try {
			generation = _generation;
			phenotype = getStatistics().getBestPhenotype();
		} finally {
			_lock.unlock();
		}

		return format("%4d: (best) %s", generation, phenotype);
	}

}


Kode programnya lengkapnya akan dibahas pada artikel berikutnya.

Contoh Program Algoritma Genetika Source Code Java

Source Code Algoritma Genetika Source Code Java

Source Code Tutorial belajar Gratis download Flow Chart PDF ZIP RAR DOC Java C# Visual Basic VB PHP Matlab C++ Penerapan implementasi metode algoritma pemrograman

Tutorial belajar Algoritma Genetika Source Code Java

VB PHP Matlab C++ Penerapan implementasi metode algoritma pemrograman Source Code Tutorial belajar Gratis download Flow Chart PDF ZIP RAR DOC Java C# Visual Basic

Gratis download Algoritma Genetika Source Code Java

Chart PDF ZIP RAR DOC Java C# Visual Basic VB PHP Matlab C++ Penerapan implementasi metode algoritma pemrograman Source Code Tutorial belajar Gratis download Flow

Penerapan implementasi Algoritma Genetika Source Code Java Algoritma Genetika Source Code Java

Posted by: Project-G Contoh Program Algoritma Genetika Source Code Java Updated at : 00.04
Jika Anda perlu source code terkait dengan artikel di atas atau ada yang ingin di tanyakan anda bisa melakukan konsultasi gratis kepada kami, melalui form di bawah. Hasil konsultasi akan di kirimkan ke email Anda. Kami mohon supportnya dengan mengklik beberapa tombol berikut :


Contoh Program Algoritma Genetika Source Code Java

perhatian

Informasi Penting Untuk Mahasiswa !

Kami menawarkan layanan jasa konsultan bimbingan pembuatan program untuk Tesis Skripsi dan Tugas Akhir Informatika, Komputer, Elektro dan Teknik lainnya yang bidang minatnya mengarah ke teknologi informasi. BASED PROJECT :Mobile Development (Java, Adobe, AS3, Android, BB, iOS, WPhone dll), Web & Desktop Development (.Net, C#, MATLAB, PHP, Delphi, Visual Basic dll). BONUS : Di bimbing untuk penguasaan materi dan coding dan revisi.
detail
Label: , ,
Konsultasi gratis