Anda di halaman 1dari 11

Restu Suhendar / 10110014 Rhendy Febrian / 10110016 Kelas IF-1

PENCARIAN SOLUSI EIGHT QUEENS PUZZLE MENGGUNAKAN ALGORITMA GENETIKA


1. Latar belakang
Permainan Eight Queens Puzzle merupakan permainan logika yang sederhana, cukup menarik dan sangat populer. Permainan logika Eight Queens Puzzle ini menggunakan papan catur standar yang berukuran 88 dan hanya menggunakan bidak ratu sebanyak 8 buah, tanpa adanya bidak catur yang lain. Dalam papan permainan berukuran 88 ini pada masing-masing kolom, baris dan posisi diagonalnya tidak boleh meletakkan lebih dari satu ratu pada posisi yang sama, baik sama secara vertikal, secara horisontal maupun secara diagonal. Hal ini disebabkan karena satu ratu dapat menyerang ratu yang lain dalam posisi horisontal, posisi vertikal maupun posisi diagonal sebanyak satu petak sampai dengan sejumlah lebar petak (maksimal sejumlah 8 petak) dari papan catur tersebut. Atau dengan kata lain, solusi yang dicari adalah penempatan posisi 8 ratu sedemikian rupa sehingga satu ratu tidak dapat menyerang ratu-ratu yang lain dan ratu tersebut harus bebas dari serangan ratu-ratu lain yang telah ada dalam papan catur tersebut. Terdapat banyak cara untuk memecahkan masalah permainan logika Eight Queens Puzzle ini. Algoritma genetika adalah salah satu pendekatan yang baik untuk memecahkan masalah seperti ini. Algoritma genetika adalah algoritma komputasi yang diinspirasi oleh teori evolusi yang kemudian diadopsi menjadi algoritma komputasi untuk mencari solusi suatu

permasalahan dengan cara yang alamiah. Algoritma ini dikembangkan oleh Goldberg yang terinspirasi dari teori evolusi Darwin yang menyatakan bahwa kelangsungan hidup suatu makhluk dipengaruhi oleh aturan yang kuat adalah yang menang. Darwin juga mengatakan bahwa kelangsungan hidup suatu makhluk dapat dipertahankan melalui proses reduksi, crossover, dan mutasi. Sebuah solusi yang dibangkitkan dalam Algoritma Genetika disebut sebagai kromosom, sedangkan kumpulan kromosom-kromosom tersebut disebut sebagai populasi. Sebuah kromosom dibentuk dari komponen-komponen penyusun yang disebuat sebagai gen dan nilainya dapat berupa bilangan numerik, biner, simbol atau pun karakter tergantung dari permasalahan yang ingin diselesaikan. Kromosom-kromosom tersebut akan berevolusi secara berkelanjutan yang disebut dengan generasi. Dalam tiap generasi, kromosom-kromosom tersebut dievaluasi tingkat keberhasilan nilai solusinya terhadap masalah yang ingin diselesaikan menggunakan ukuran yang disebut fitness. Untuk memilih kromosom yang tetap dipertahankan untuk generasi selanjutnya, dilakukanlah proses seleksi. Kromosom dengan nilai fitness tinggi akan memiliki peluang lebih besar untuk terpilih lagi pada generasi selanjutnya. Offspring merupakan kromosom-kromosom baru yang dibentuk dengan cara melakukan perkawinan antar kromosom dalam satu generasi, atau sering disebut sebagai proses crossover. Jumlah kromosom yang mengalami crossover ditentukan oleh parameter Pcrossover. Mekanisme perubahan susunan unsur penyusun makhluk hidup akibat adanya faktor alam disebut dengan mutasi. Jadi, mutasi direpresentasikan sebagai suatu proses berubahnya satu atau leih nilai gen dalam kromosom dengan suatu nilai acak. Jumlah gen dalam populasi yang mengalami mutasi ditentukan oleh parameter Pmutasi. Setelah beberapa generasi akan dihasilkan kromosom-kromosom yang nilai gennya konvergen ke suatu nilai tertentu yang

merupakan solusi terbaik yang dihasilkan oleh Algoritma Genetika terhadap permasalahan yang ingin diselesaikan. Algoritma Genetika sangat cocok untuk menyelesaikan masalah optimasi dengan ruang lingkup yang besar, karena Algoritma Genetika selalu bergerak dengan mencari sejumlah solusi sekaligus, selama solusi tersebut masih bersifat feasible (tidak melanggar constraint). Dengan seting parameter yang tepat, diharapkan salah satu dari sekian banyak solusi yang dibangkitkan oleh Algoritma Genetika merupakan solusi optimum global. Akan tetapi, Algoritma Genetika ini juga masih memiliki kelemahan yaitu ketidakpastian untuk menghasilkan solusi optimum global, karena sebagian besar dari algoritma ini berhubungan dengan bilangan random yang bersifat probabilistik.

2. Pengenalan sistem
Inputan yang bisa user isi adalah banyak maksimun populasi, banyak generasi, probabilitas crossover, probabilitas mutasi. Algoritma dieksekusi setelah menekan tombol start, jika terdapat proses yang memakan waktu lama diakibatkan dari jumlah generasi yang besar, prosesbar akan menunjukan sejauh mana proses sedang berlangsung. Setelah proses algoritma selesai di eksekusi semua kromosom dari generasi di tampilkan didalam tabel dan papan grafik memperlihatkan hasil terbaik.

3. Analisis sistem
Gen : Sebuah gen diberi nomor 0 hingga 7, nomor tersebut diasumsikan sebagai posisi di baris mana ratu berada. Sedangkan posisi gen didalam kromosom di asumsikan sebagai posisi di kolom mana ratu berada.

Kromosom : Kromosom terdiri dari 8 gen, dan tidak di perbolehkan ada nilai gen yang sama di dalam satu kromosom. Mutasi : Mutasi dilakukan dengan cara menukar gen dengan gen lain yang di pilih secara acak dari kromosom yang sama.

Crossover : Semua Gen diambil dari dua induk kromosom dengan probabilitas 0,5. Sebuah gen dari salah satu orang tua ditambahkan ke kromosom keturanan lalu gen dari orang tua lainnya di hilangkan. Langkah ini di ulang hingga orang tua kromosom habis dan keturunannya memiliki gen dari orang tuanya.

Fitness Function: tabrakan adalah dimana dua queen bisa menyerang satu sama lain. Ini berarti mereka berada dalam diagonal, baris atau kolom yang sama Karena kromosom tidak memiliki gen yang duplikat dan menjamin queen tidak berada dalam satu kolom, baris lainnya, hal yang diperlukan hanyalah menghindari tabrakan diagonal. Karena itu jumlah kemungkinan maksimal tabrakan adalah 28. Fungsi fitness memiliki aturan yaitu lebih besar lebih baik, jadi cara menghitungnya adalah dengan cara menghindari atau mengurangi jumlah tabrakan yang terjadi dari jumlah 28. Solusi yang optimal akan memiliki 0 kesamaan dan 28 nilai fitness.

Implementasi
Inisialisasi Population private List<chromosome> GetInitialPopulation(int population) { List<chromosome> initPop = new List<chromosome>(); GeneticAlgo RandomGen = new GeneticAlgo(); for (int i = 0; i < population; i++) { List<int> genes = new List<int>(new int[] {0, 1, 2, 3, 4, 5, 6, 7});

Chromosome chromosome = new Chromosome(); chromosome.genes = new int[8]; for (int j = 0; j < 8; j++) { int geneIndex = (int)(RandomGen.GetRandomVal (0,genes.Count-1)+0.5);//randomly select a gene chromosome.genes[j] = genes[geneIndex]; genes.RemoveAt(geneIndex);//remove selected gene } initPop.Add(chromosome); } return initPop; }

Fungsi ini membutuhkan nilai banyaknya populasi sebagai parameter dan mengembalikan daftar kromosom yang mengandung gen secara acak. Nilai-nilai gen yang dipilih secara acak dari daftar 0 sampai 7. Setelah membuat populasi awal menggunakan fungsi ini, populasi dikirimkan ke fungsi DoMating.

Skema pengkodean public void DoMating(ref List<Chromosome> initPopulation, int generations, double probCrossver, double probMutation) { int totalFitness = 0; CalcFitness(ref initPopulation, ref totalFitness); for (int generation = 0; generation < generations; generation++) { PrepareRuletteWheel(ref initPopulation,totalFitness); Crossover(ref initPopulation, probCrossver); Mutate(ref initPopulation, probMutation); CalcFitness(ref initPopulation, ref totalFitness); if (initPopulation[initPopulation.Count - 1].fitness == 28) break; if (progress != null) { progress(generation + 1); } } initPopulation.Sort(new FitnessComparator()); }

Fungsi ini mengambil daftar kromosom sebagai populasi awal, jumlah generasi yang ingin kita gandakan dalam algoritma, probabilitas crossover dan probabilitas mutasi sebagai parameternya. Fungsi lain nya terlibat fungsi ini untuk menangani propagasi ke generasi yang diperlukan dengan menerapkan fungsi CalcFitness, PrepareRuletteWheel, Crossover dan Mutate. o Menghitung Nilai fitness
public void CalcFitness(ref List<Chromosome> chromosome, ref int totalFitness) { int collisions = 0; totalFitness = 0; for (int k = 0; k < chromosome.Count; k++) { for (int i = 0; i < chromosome[k].genes.Length - 1; i++) { int x = i; int y = chromosome[k].genes[i]; for (int j = i + 1; j < chromosome[k].genes.Length; j++) { if (Math.Abs(j - x) == Math.Abs (chromosome[k].genes[j] - y)) collisions++; } } Chromosome temp = chromosome[k]; temp.fitness = MAX_FIT - collisions; chromosome[k] = temp; totalFitness += chromosome[k].fitness; collisions = 0; } }

Fungsi ini menghitung fitness dari setiap kromosom dan memberikan nilai fitness untuk fitness yang milik masing-masing kromosom. Fitness dihitung dengan cara menghitung jumlah kesamaan dan mengurangi dari jumlah maksimum kesamaan karena dalam kode ini fitness adalah fungsi yang lebih tinggi lebih baik. Saat menghitung fitness untuk setiap kromosom, fungsi ini juga menghitung total fitness dari populasi karena

kita membutuhkannya pada langkah berikutnya untuk menghitung rasio fitness setiap kromosom.

Seleksi metode mesin roullete private void PrepareRuletteWheel(ref List<Chromosome> parents,int total) { int currentTotalFitness=0; for (int i = 0; i < parents.Count; i++) { currentTotalFitness += parents[i].fitness; Chromosome temp = parents[i]; temp.cumAvgFitness = currentTotalFitness / (double)total; parents[i] = temp; } }

Fungsi ini bertanggung jawab untuk mempersiapkan rullette dan dibutuhkan daftar kromosom sebagai populasi saat ini. Fungsi ini menghitung rasio fitness setiap kromosom terhadap total fitness dan kemudian menghitung kumulatif untuk mengisi nilai cumAvgFitness yang dimilik kromosom. o Cross over
public void Crossover(ref List<Chromosome> parents, double probability) { List<Chromosome> offspring = new List<Chromosome>(); for (int i = 0; i < parents.Count; i++) { if (Assay(probability)) //if the chance is to crossover { Chromosome parentX = AssayRuletteWheel(parents); Chromosome parentY = AssayRuletteWheel(parents); List<int> child = new List<int>(); for (int j = 0; j < 8; j++) { if (Assay(0.5)) //select from parentX

{ for (int k = 0; k < parentX.genes.Length; k++) { if (!child.Contains (parentX.genes[k]))//instead of //deleting the similar genes //from parents select the //next noncontained number { child.Add(parentX.genes[k]); break; } } } else //select from parentY { for (int k = 0; k < parentY.genes.Length; k++) { if (!child.Contains (parentY.genes[k]))//instead of //deleting the similar genes from //parents select the next //non-contained number { child.Add(parentY.genes[k]); break; } } } } Chromosome offSpr = new Chromosome(); offSpr.genes = child.ToArray(); offspring.Add(offSpr); } else //else the chance is to clone { Chromosome parentX = AssayRuletteWheel(parents); offspring.Add(parentX); } } while (offspring.Count > parents.Count) { offspring.RemoveAt((int)GetRandomVal(0, offspring.Count - 1)); } parents = offspring; }

Kawin silang (crossover) adalah operator dari algoritma genetika yang melibatkan dua induk untuk membentuk kromosom baru. Pindah silang menghasilkan titik baru dalam ruang pencarian yang siap untuk diuji.

o
if (Assay(probability)) //if the chance is to crossover { Chromosome parentX = AssayRuletteWheel(parents); Chromosome parentY = AssayRuletteWheel(parents); List<int> child = new List<int>(); for (int j = 0; j < 8; j++) { if (Assay(0.5)) //select from parentX { for (int k = 0; k < parentX.genes.Length; k++) { if (!child.Contains(parentX.genes[k]))//instead of //deleting the similar genes from parents //select the next non-contained number { child.Add(parentX.genes[k]); break; } } } else //select from parentY { for (int k = 0; k < parentY.genes.Length; k++) { if (!child.Contains(parentY.genes[k]))//instead of //deleting the similar genes from parents //select the next non-contained number { child.Add(parentY.genes[k]); break; } } } } Chromosome offSpr = new Chromosome(); offSpr.genes = child.ToArray(); offspring.Add(offSpr); }

Ini bagian dari kode dari fungsi cross over dan bertanggung jawab untuk mengawin silahkan dua orang tua parentX dan parentY. Dalam rangka untuk

menciptakan keturunan, gen memilih dari dua orang tua dengan probabilitas 0,5 serta menghindari duplikasi gen dalam kromosom.

Dalam pengoprasianya, salah satu orangtua langsung dibawa ke generasi berikutnya. o Mutasi public void Mutate(ref List<Chromosome> parents, double probability) { List<Chromosome> offsprings = new List<Chromosome>(); for (int i = 0; i < parents.Count; i++) { Chromosome offspring = parents[i]; for (int mutatePosition = 0; mutatePosition < 8; mutatePosition++) { if (Assay(probability)) //if the chance is to mutate { int newGeneIndex = (int)(GetRandomVal(0,6)+0.5); if (newGeneIndex>=mutatePosition) { newGeneIndex += 1; } int swapTemp = offspring.genes[mutatePosition]; offspring.genes[mutatePosition] = offspring.genes[newGeneIndex]; offspring.genes[newGeneIndex] = swapTemp; } } offsprings.Add(offspring); } parents = offsprings; }

Mutasi dilakukan dengan cara menukar gen satu dengan gen lain yang di pilih secara acak dari kromosom yang sama. Sesuai dengan probabilitas mutasi.

4. Kesimpulan dan saran


Algoritma Genetika bisa menjadi solusi dan bekerja dengan baik untuk permasalahan Eight Queens Puzzle. Mengetahui ke optimalan suatu algoritma dalam menyelesaikan kasus tertentu perlu di adakannya perbandingan antar algoritma lain. Kami rasa dalam kasus ini untuk lebih mengetahui hasil optimasi baik atau buruk nya disarankan untuk membandingkannya dengan algoritma lain.

5. Referensi
http://www.codeproject.com/Articles/207144/Solve-Eight-Queens-Puzzle-with-GeneticAlgorithm-i,Ravimal Bandara, Sri Lanka, diakses:10 November 2013

6. Lampiran

Anda mungkin juga menyukai