• Sonuç bulunamadı

Genetik Algoritma ile oda biçimlerinin belirlenmesi

5. GENETİK ALGORİTMAYA DAYALI KİTLESEL BİREYSELLEŞTİRME

5.2 Modelin Algoritması

5.2.1 Genetik Algoritma ile oda biçimlerinin belirlenmesi

Oda biçimlerinin belirlenmesi işleminde Genetik Algoritmanın rutinleri uygulanmıştır. Bu bağlamda oda biçimlerinin oluşturulması işlemini gerçekleştiren fonksiyonlara ilişkin akış diyagramı Şekil 5.3’te verilmiştir. Programın çalıştırılmasıyla Genetik Algoritmaya özgü parametreler belirlenir. Bunlar, Genetik Algoritmanın işleyişi sırasında kullanılan popülasyon boyutu, elitizm faktörü,

çaprazlama ve mutasyon oranı gibi parametreler olup deneyler sonucu en uygun değeri belirlenerek kaydedilmiştir. Ardından, ileri bölümlerde tanıtılacak olan kullanıcı arayüzü vasıtasıyla kullanıcıdan odaların alanları, yönleri ve komşuluk ilişkileri ile ilgili parametreler alınarak Genetik Algoritma tabanlı oda tasarım aracına iletilir. Aracın çalışması sonucu üretilen sonuçlar kullanıcıya sunulur ve kullanıcı müdahalesi ile veritabanına kaydedilirler. Bu döngü belirlenen kriterler sağlanana kadar veya kullanıcı elde edilen oda biçimlerinden memnun olup durdurana kadar devam eder. Oda biçimlerinin belirlenmesi ile ilgili tüm algoritmalar Genetik Algoritma tabanlı oda tasarım aracında toplanmıştır.

Genetik Algoritma kullanılarak konuta ait oda bileşenlerinin üretilmesi söz konusu olduğunda, algoritmanın en temel bileşenleri olan gen ve kromozomların belirlenmesi gerekir. Seçilen gen yapısı çalışılan tüm uzayda tanımlanabilir ve tek olmalıdır. Yani bir odanın en küçük bileşenine gen dersek, genlerin tüm varyasyonları yine bir gen yani odaya ilişkin bir bileşen tanımlamalı ve bir genin taşıdığı bilgiyi farklı bir gen taşımamalıdır. Ayrıca Genetik Algoritma yaklaşımında kromozomlar arası gen transferi, genlerin mutasyona uğraması kavramlarının sağlıklı bir biçimde işleyebilmesi için gen yapısının değişmemesi, tüm kromozomlarda korunması gerekir. Benzer şekilde, genlerin birleşiminden oluşan kromozomlar da çalışılan tüm uzayda tanımlanabilir ve tek olmalıdır. En küçük birimlerin birleşimi ile oluşan oda yapısı bir kromozom ile temsil edilecek olursa, kromozomun taşıdığı bilginin değişmesi farklı bir oda biçimine neden olacak, ayrıca bir odayı temsil eden kromozom tek olacak, yani aynı odanın farklı bir genotipi tanımlanamayacaktır.

Şekil 5.3 : Modelde oda biçimlerinin oluşturulmasına ilişkin akış diyagramı.

Her bir gen bir birim karelik bileşeni temsil etmek üzere, i’nci gen, birimin 2 boyutlu düzlemdeki konumunu belirten X ve Y koordinatları cinsinden şu şekilde tanımlanabilir:

Gen(i) = {Birim(i).Koordinat_X, Birim(i).Koordinat_Y}, i=1,2,…,N

Kromozom odaya ait genotipi temsil ettiğinden, N birim karelik bir odaya ait kromozom, N adet genin birleşiminden oluşmaktadır. Buna göre N birim kareden oluşan j’nci odaya ait kromozom yapısı şu şekilde olacaktır:

Kromozom(j) = {Gen(1); Gen(2); …; Gen(k)}

= { Birim(i).Koordinat_X, Birim(i).Koordinat_Y}, i=1,2,…,N

Bir kromozomun bir oda biçimini temsil edebilmesi için boyut koşulunu sağlamasının yanı sıra birimlerin birbiri ile kesişmemesi ve birimler arası kesinti oluşmaması gerekir. Bu yüzden N birim karelik odayı temsil eden bir kromozomun oluşturulması N adet birbirinden bağımsız genin birleşimi şeklinde düşünülemez. Kromozoma eklenen her bir genin daha öncekiler ile yukarıda belirtilen uyumu sağlaması gerekir. İlk popülasyonu oluşturacak N uzunluklu kromozomun oluşumunu sağlayan kod parçası aşağıda sunulmuştur. Fonksiyonun girdisi birim kare cinsinden oda alanı, çıktısı ise N birim karelik bir odayı oluşturan her birimin koordinatları ile odanın dış duvarlarının koordinatlarıdır. Dış duvarlar, kendisini oluşturan tüm birim uzunluklu doğru parçalarının iki uçlarındaki noktaların koordinatları ile aşağıdaki kod parçasındaki gibi tanımlanmıştır.

function [kenar_ust, kenar_sag, kenar_alt, kenar_sol, merkez]=odaOlusturma(odaboyu)

% merkezde bulunan ilk blok [0,0] için kenar tanımlamaları kenar_ust=[0,1,1,1]; kenar_sag=[1,0,1,1]; kenar_alt=[0,0,1,0]; kenar_sol=[0,0,0,1]; for cc=1:odaboyu-1 tmp=randperm(4); tmp_yon=tmp(1); … tmp_boy=randperm(tmp); tmp_boy=tmp_boy(1);

% rastgele seçilen bir bloğa rastgele bir yönde blok ekleme

[kenar_ust kenar_sag kenar_alt kenar_sol]=blokEkle(kenar_ust, kenar_sag, kenar_alt, kenar_sol,tmp_yon,tmp_boy);

% kenar çizgilerinden merkez koordinatların çıkarılması merkez=kenar2merkez(kenar_ust, kenar_alt);

end

Şekil 5.4’te görüldüğü gibi örnek bir kromozomun oluşum adımları fenotipler ile

olduğundan dört adet komşu kare ve bunlara ilişkin genotipler tanımlanabilir. Bir sonraki aşamada bu dört genden rastgele bir tanesi seçilerek mevcut gen kümesine eklenir. Gen kümesine yeni bir gen eklendiğinde, fenotipte mevcut kenar sayısı 3 artar, dolayısıyla muhtemel komşular kümesine 3 yeni komşu eklenir. Ayrıca yeni eklenen birim muhtemel komşular kümesinden çıkarılır. Özel bir durum olarak yeni eklenen birimin diğer başka bir birime komşu olması durumunun da sorgulanması gerekir. Aksi takdirde bu durum kromozomda aynı genlerin tekrarına neden olur ve kromozom yapısı daha önce verilen eşsiz olma koşulunu sağlamaz. Gen kümesine yeni gen ekleme işlemi, istenen kromozom uzunluğuna ulaşılıncaya dek devam eder.

Şekil 5.4 : Bir oda oluşumunun fenotipler ve genotipleriyle açıklanması.

Bir kromozomun oluşturulması için gerçekleştirilen işlemler ilk popülasyon boyutuna ulaşılıncaya kadar tekrar eder. Kromozom oluşumunun her adımı rastgelelik içerdiğinden sonuçta oluşan kromozomlar çeşitlilik gösterir ve yeterince

büyük ilk popülasyon seçimlerinde tüm olası sonuçların elde edilmesi mümkündür. Ancak büyük işlem yükü ve gereksiz sonuçların üretilmesi gibi dezavantajlardan ötürü bu çalışmada, ilk popülasyon boyutu kısıtlı tutularak Genetik Algoritmanın çaprazlama ve uygunluk fonksiyonuna göre değerlendirme aşamalarında çeşitlilik ve iyileşme hedeflenmiştir.

İlk populasyonun oluşturulmasının ardından bireyler bir uygunluk fonksiyonuna göre

değerlendirilir. Kullanılacak uygunluk fonksiyonu matematiksel olarak ifade edilebilir ve genel olarak bir fonksiyonun sahip olması beklenen özellikleri sağlaması gerekir. Kısaca tek bir giriş parametre kümesi için tek bir çıkış üretmeli ve tanım kümesi içinde tüm girişlere yanıt verebilmelidir. Söz konusu oda biçimi üretimi olduğunda uygunluk fonksiyonu olarak çevre/alan oranı kullanılabilir ve uygunluk fonksiyonu şu şekilde tanımlanır:

UygunlukFonksiyonu= min( Σ(BirimKenarSayısı) / Σ (BirimAlanSayısı) )

Burada verilen uygunluk fonksiyonu her odayı tanımlayan kromozom için tektir ve değişkenlik göstermez. Popülasyonda bulunan tüm bireylerin dolayısıyla kromozomların uygunluk fonksiyonuna göre değerlendirilmesi ve sıralanması gerekir. Yukarıda verilen uygunluk fonksiyonuna göre bir sıralama söz konusu olduğunda bireylerin en küçük çevre/alan oranına sahip olması hedeflenir. Bu uygunluk fonksiyonunun optimum çözümüne bireylerin şekilleri düzgünleştikçe ve iç açıları toplamı azaldıkça, bir başka deyişle en/boy oranları 1’e yaklaştıkça ulaşılır. K2 birim karelik alana sahip bir oda için uygunluk fonksiyonuna göre,

Optimum Çözüm = 4 x K / K2 = 4 / K

olarak hesaplanır. Ancak Genetik Algoritmanın yapısı gereği amaç optimum çözüme en yakın yoldan ulaşmak değil, optimum çözüme ulaşmaya çalışırken diğer çözümleri de değerlendirmek ve bunların da çözüme katkıda bulunmasını sağlamaktır. Bu özellik gereği algoritmanın adımları ilerledikçe optimum çözüme doğru gidilir iken aykırı çözümler de meydana çıkabilir ve bu da popülasyondaki çeşitliliği arttırır. Kromozomların uygunluk fonksiyonuna göre değerlendirilmesi işini gerçekleştiren kod parçası şöyledir:

kromozom=shiftdim(populasyon(i,:,:)); [k1, k2, k3, k4]=merkez2kenar(kromozom); % bir odanın çevresi hesaplanıyor.

cevre=size(k1,1)+size(k2,1)+size(k3,1)+size(k4,1); % bir odanın alanı hesaplanıyor.

alan=length(kromozom); % çevre/alan oranı y(i)=cevre/alan; end

% uygunluk fonksiyonuna göre tüm popülasyonun sıralanması [y, index]=sort(y);

İlk popülasyondaki her bir bireyin uygunluk fonksiyonuna göre değerlendirip

derecelendirilmesinin ardından Genetik Algoritmanın elitizm seçim operatörü uygulanır. Bu adımda uygunluk fonksiyonundan en yüksek değeri alan, en uygun bireylerin bir kısmı yeni popülasyona, Genetik Algoritmanın çaprazlama ve mutasyon adımlarına maruz bırakılmadan doğrudan aktarılır. Aktarılacak kromozom sayısı algoritmanın başında tanımlanır ve bu sayı uygulamaya göre değişkenlik gösterir. Elitizm seçim işlemi yoluyla hedeflenen amaç, diğerlerine göre daha iyi bireylerin bozulmadan gelecek nesillere aktarılmasını sağlamaktır. Elitizm işlemini gerçekleştiren kod parçası şu şekildedir:

% sıralı populasyondan ilk kaç tanesinin elit olarak seçildiği bilgisidir. elit=floor(size(index,1)*elitizim_faktor);

% ilk elit adet kromozom cocuk populasyonuna katılıyor. for i=1:elit

cocuk_populasyon(i,:,:)=populasyon(index(i),:,:); end

Elitizm işleminden arta kalan bireylerden çaprazlama işlemi yoluyla yeni popülasyon üretilir. Az önce de bahsedildiği üzere çocuk popülasyonun ilk birkaç bireyi elitizm seçim yoluyla belirlenirken diğer bireyler çaprazlama sonucu üretilir. Ancak çaprazlama işleminde popülasyon bireyleri seçicilik adımındaki gibi uygunluk fonksiyonuna göre değil rastgele olarak eşlenirler. Çaprazlama işlemi, bu uygulamaya özgü olarak şu şekilde tekrar yorumlanmıştır. Öncelikle çaprazlanacak aynı boydaki iki kromozomun ortak genleri her iki çocuğa da aynen aktarılır. Birbirinden farklı olan genlerden ise hangilerinin çocuk kromozomlara aktarılacağı rastgele olarak belirlenir. Ancak buradaki kritik nokta, ortak genlerin belirlenmesinin ardından seçilen rastgele genler belirlenen ortak genlere komşu olmayabilir. Bu

durumda şekilsel açıdan bir bütünlük sağlanamaz, üretilen çocuk kromozomların fenotipleri bir odayı ifade edemez. Çaprazlama sonucu ortaya çıkan her kromozomun yine bir odayı ifade edebilmesi için ortak genler belirlendikten sonra bu genlerin komşu genleri hesaplanır. Ardından çaprazlanan iki kromozomdan rastgele biri seçilir ve bu kromozomun rastgele bir geninin komşu genler arasında olup olmadığı kontrol edilir. Eğer bu gen komşu genler arasında değil ise, tekrar bir kromozom rastgele seçilir ve rastgele bir geni belirlenir ve karşılaştırılır. Eğer gen komşu genler arasında ise çocuk kromozoma eklenir. Bu işlem, çocuk kromozom boyu, çaprazlanan kromozomların boyuna eşitlenene kadar devam eder. Çaprazlama işlemini gerçekleştiren fonksiyona ait kod parçası şöyle sunulmuştur:

% elitler harici tüm ilk populasyon ikişerli çaprazlamaya giriyor if rem((popboyu-elit),2) ilk=elit; else ilk=elit+1; end for i=ilk:2:popboyu-1 m=0;

ata1(:,:)=populasyon(i,:,:); % ilk ata ata2(:,:)=populasyon(i+1,:,:); % ikinci ata

% iki atanın kesişen elemanları çocuğa aynen aktarılıyor for j=1:odaboyu

for k=1:odaboyu

if ata1(j,1)==ata2(k,1) && ata1(j,2)==ata2(k,2) m=m+1; cocuk_populasyon(i,m,1)=ata1(j,1); cocuk_populasyon(i,m,2)=ata1(j,2); end end end

% kesişen elemanlar iki çocukta da mevcut

cocuk_populasyon(i+1,:,:)=cocuk_populasyon(i,:,:); end

% çocukların elemanlarının bir kısmı ataların kesişen kısımlarından % oluşuyor. Diğer elemanları ise çocuğun mevcut elemanlarına rastgele % komşular seçilerek bunların hangi ataya ait olduğu kontrol ediliyor % ve herhangi bir ataya aitse çocuğa ekleniyor. Çocuğun mevcut

% elemanlarından hangisine, hangi yönden komşuluğuna bakılacağı tamamen % rastsal olduğundan oluşan çocukların iki atadan gelen elemanları % harici rastlantısal oluşacaktır.

m_global=m;

for c=1:2 % iki çocuk için işlemler tekrarlanıyor m=m_global;

while(m<odaboyu) komsu_degil=0; tmp=randperm(m);

secilen_birim=tmp(1); % çocuğa ait kromozomdan rastgele gen seçiliyor

tmp=randperm(4);

if secilen_yon==1 komsu=[cocuk_populasyon(i+c-1,secilen_birim,1) cocuk_populasyon(i+c- 1,secilen_birim,2)+1]; elseif secilen_yon==2 komsu=[cocuk_populasyon(i+c-1,secilen_birim,1)+1 cocuk_populasyon(i+c-1,secilen_birim,2)]; elseif secilen_yon==3 komsu=[cocuk_populasyon(i+c-1,secilen_birim,1) cocuk_populasyon(i+c-1,secilen_birim,2)-1]; elseif secilen_yon==4 komsu=[cocuk_populasyon(i+c-1,secilen_birim,1)-1 cocuk_populasyon(i+c-1,secilen_birim,2)]; end

% Belirlenen komşu genin çocuğun bir geni olup olmadığı kontrol

ediliyor.Çocuğun bir %geni ise komşu olamaz, yeni komşu seçmek için döngüden çıkılır. for s=1:m if (cocuk_populasyon(i+c-1,s,1)==komsu(1,1) && cocuk_populasyon(i+c-1,s,2)==komsu(1,2)) komsu_degil=1; break end end

% seçilen gen komşu değil ise bu genin herhangi bir ataya sahip

% olup olmadığına bakılır. Hiçbir atada bulunmayan gen çocukta da

% bulunamaz. Herhangi bir atada bu gen varsa çocuğa eklenir. Genin

% hangi atadan geleceği rastsaldır ve çocuğun gen çeşitliliğini

% arttırır. if not(komsu_degil) for j=1:odaboyu

if (komsu(1,1)==ata1(j,1) && komsu(1,2)==ata1(j,2)) || (komsu(1,1)==ata2(j,1) && komsu(1,2)==ata2(j,2))

m=m+1; cocuk_populasyon(i+c-1,m,1)=komsu(1,1); cocuk_populasyon(i+c-1,m,2)=komsu(1,2); break end end end end end

Popülasyona yeni çocuk bireyler üretmek için kullanılan çaprazlama işlemi Şekil 5.5’te bir örnek üzerinden gösterilmiştir.

Şekil 5.5 : Bir çaprazlama işlemcisinin fonksiyonunun oda oluşturma örneği üzerinden gösterimi.

Elitizm ve çaprazlama yoluyla ilk popülasyon kümesinden aynı boyda çocuk popülasyonu üretilmiş olur. Çocuk popülasyonunun üretimi tamamlandıktan sonra popülasyon belirlenen bir kritere göre sınanır ve algoritmanın devam edip etmeyeceğine karar verilir. Bu aşamada kullanılacak ölçüt maksimum döngü sayısına

tanımlanabilir. Koşulun sağlanmaması durumunda çocuk popülasyon üzerinden seçicilik adımı ile algoritma devam eder. Şekil 5.6’da algoritmanın ilk birkaç adımı boyunca ortaya çıkan çocuk popülasyonlardan örnekler gösterilmiştir.

Şekil 5.6 : Genetik Algoritmalar ile üretilen 9 birim karelik çocuk popülasyon örnekleri.

Algoritmanın gereği olarak tüm bireyler kısa sürede optimum çözüme ulaşmamakta, her adımda ortaya çıkan çözümler çeşitliliğe neden olmaktadır. Belirlenen sonlanma koşuluna bağlı olarak algoritmanın sonlanması durumunda ortaya çıkan popülasyonda birbiri ile aynı bireylerin ortaya çıkma olasılığı da vardır. Bu yüzden daha sonra kullanılmak üzere veritabanına saklanacak bireyler öncelikle karşılaştırılarak birbirleri ile eş olmamaları sağlanır. Kullanıcı, en yüksek uygunluk değerine sahip, dilediği sayıdaki bireyi veritabanına gönderebileceği gibi, uygunluk değerine bakmaksızın seçtiği herhangi bir bireyi de veritabanında saklayabilir.