<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bilgisayar Kavramları &#187; graf teorisi (graph theory, çizge kuramı)</title>
	<atom:link href="http://www.bilgisayarkavramlari.com/category/graf-teorisi/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bilgisayarkavramlari.com</link>
	<description>www.bilgisayarkavramlari.com</description>
	<lastBuildDate>Sun, 29 Jan 2012 21:38:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Yinelemeli Derinlik Araması (Iterative Deepining Search)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/11/08/yinelemeli-derinlik-aramasi-iterative-deepining-search/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/11/08/yinelemeli-derinlik-aramasi-iterative-deepining-search/#comments</comments>
		<pubDate>Tue, 08 Nov 2011 17:12:13 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[graf teorisi (graph theory, çizge kuramı)]]></category>
		<category><![CDATA[veri yapıları]]></category>
		<category><![CDATA[yapay zeka (artificial intelligence)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/?p=5983</guid>
		<description><![CDATA[Yazan :Şadi Evren ŞEKER Bilgisayar bilimlerinin çeşitli alanlarında (örneğin yapay zeka, veri yapıları veya şekil kuramı (graph theory) gibi) kullanılan arama algoritmalarından birsidir. &#160; Algoritma, derin öncelikli drama (depth first search) üzerine kurulu olduğu için, literatürde &#8220;iterative deepening depth first search (yinelemeli derinleşen, derin öncelikli arama)&#8221; olarak da geçmektedir. &#160; Algoritma basitçe derinlik değerini bir [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan :Şadi Evren ŞEKER</p>
<p>Bilgisayar bilimlerinin çeşitli alanlarında (örneğin yapay zeka, veri yapıları veya şekil kuramı (graph theory) gibi) kullanılan arama algoritmalarından birsidir.</p>
<p>&nbsp;</p>
<p>Algoritma, <a href="http://www.bilgisayarkavramlari.com/2008/11/13/derin-oncelikli-arama-depth-first-search/">derin öncelikli drama (depth first search) </a>üzerine kurulu olduğu için, literatürde &#8220;iterative deepening depth first search (yinelemeli derinleşen, derin öncelikli arama)&#8221; olarak da geçmektedir.</p>
<p>&nbsp;</p>
<p>Algoritma basitçe derinlik değerini bir değişkende tutmakta ve bu değeri her adımda arttırmaktadır.<br />
Yineleme yapısı (iteration) basit bir döngü (loop) olarak düşünülebilir ve her adımda derinliğin, bir döngü değişkeni (loop variable) gibi düşünülerek derinleştiği kabul edilebilir.</p>
<p>&nbsp;</p>
<p>Örneğin aşağıdaki şekli (graph) ele alalım:</p>
<p>&nbsp;</p>
<p><img title="cyclictree.png" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/cyclictree.png" alt="Cyclictree" width="361" height="221" border="0" /></p>
<p>Ağaçta görüldüğü üzere iki adet <a href="http://www.bilgisayarkavramlari.com/2008/08/01/basit-dongu-simple-cycle/">döngü (cycle)</a> bulunmaktadır. Iterative Deepening search algoritmasını bu ağaç üzerinde çalıştıracak olursak, algoritma öncelikle derinlik değerini (bundan sonra d değişkeni (variable) ile ifade edilecektir) 0&#8242;dan başlatarak her adımda bir ilerletecektir.</p>
<p>d=0 için arama:<br />
A<br />
d=1 için arama:<br />
A (tekrar A değerine bakar) B C (sanki ağacın en üstteki üç düğümü, şekilde gösterildiği gibi bağlanmış kabul edilebilir, daha alttaki derinliklerde bulunan DEFG düğümlerine hiç bakamaz)<br />
d=2 için arama:<br />
A B D E C F G (Bu aramada sanki sondaki daireler (cycle) bulunmuyormuş gibi kabul edilebilir, çünkü belirtilen derinlik bu dairelere kadar inemez)<br />
d=3 için arama:<br />
A B D B E C F G A<br />
d=4 için arama:<br />
A B D B D E B C F G A B C</p>
<p>Yukarıdaki arma işlemi, derinlik arttıkça devam etmektedir.</p>
<p>&nbsp;</p>
<p>Arama algoritmalarının değerlendirildiği bazı kriterler bulunmaktadır. Buna göre IDDFS (iterative deepening depth first search) algoriması &#8220;tam&#8221; algoritma olarak kabul edilebilir.<br />
<strong>Tamlık teriminin (completeness)</strong> anlamı aşağıdaki şekilde tanımlanabilir:</p>
<p>Bir arama algoritması, bütün düğümleri dolaşarak aranan düğümü bulmayı garanti ediyorsa bu algoritmaya tam arama algoritması ismi verilir.</p>
<p>Örneğin yine yukarıdaki şekil için klasik derin öncelikli arama (depth first search) algoritmasını ele alsaydık, bu algoritmanın tam olmadığını söyleyebilirdik. Bunun sebebi DFS algoritmasının dolaşması sırasında, aşağıdaki döngüye girmesidir:</p>
<p>A B D B D B D ( B D ikilisi sosuza kadar tekrar eder)</p>
<p>Kısacası A B D düğümleri dışındaki düğümlere asla bakmaz. Bu anlamda tam olmadığını söyleyebiliriz.</p>
<p><a href="http://www.bilgisayarkavramlari.com/2008/11/13/sig-oncelikli-arama-breadth-first-search/">BFS (breadth first search , yayılma öncelikli veya sığ öncelikli arama)</a> algoritması ise her zaman için tam kabul edilebilir, sebebi bir sonraki derinlik seviyesine inmeden önce, bulunduğu seviyedeki düğümleri bitirmesi ve bu sayede bütün ağaca bakmayı garanti etmesidir.</p>
<p><strong>Algoritmanın karmaşıklığına</strong> değinecek olursak. Aşağıdaki şekilde bir formül ile karşılaşırız.</p>
<p><img title="iddscompleks.png" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/iddscompleks.png" alt="Iddscompleks" width="454" height="27" border="0" /></p>
<p>Bu formülde görülen terimler şekil kuramında (graph theory) sıkça kullanılan bazı değerlere atıfta bulunur.<br />
d değerinin derinlik olduğunu daha önce belirtmiştik. b ile gösterilen değer ise dallanma katasyısıdır (branching factor).</p>
<p>Kısaca her<a href="http://www.bilgisayarkavramlari.com/2009/06/18/dugum-derecesi-order-of-node/"> düğümün kaç çocuğu olduğu (out order, kaç düğüme gidilebildiği)</a> olarak tutulur. Örneğin tam dolu <a href="http://www.bilgisayarkavramlari.com/2008/05/07/ikili-arama-agaci-binary-search-tree/">ikili arama ağacının (binary search tree)</a> b değeri 2&#8242;dir. Genelde en kötü durum analizinde bütün çocukların dolu olması ihtimali üzerinde durulur. Ayrıca istatistiksel olarak ortalamam çocuk sayısının da alındığı olur. Örneğin şehirlerin tutulduğu bir şekilde, her şehirden gidilebilecek şehir sayısı değişmektedir. Bu durumda b değeri ortalama değer olarak hesaplanabilir.</p>
<p>&nbsp;</p>
<p>Bu açıklama ardından yukarıdaki denkleme tekrar bakarak anlamaya çalışalım.</p>
<p>&nbsp;</p>
<p>IDDFS algoritmasında, en altta bulunan düğümlerin 1 kere (d sabitlendiğinde en altta kalan düğümler hangileri ise) dolaşıldığını, d-1 derinliğindeki düğümlerin ise 2 kere dolaşıldığını ve böylece <a href="http://www.bilgisayarkavramlari.com/2008/05/07/agaclar-tree/">kök düğüme (root)</a> kadar her düğümün, bulunduğu seviyeye göre kaç kere dolaşıldığını hesaplayabileceğimize göre yukarıdaki denklem çıkarılabilir.</p>
<p>&nbsp;</p>
<p>Diğer bir deyişle d=0 için kök 1 kere dolaşılırken d=1 olduğunda kök 2 ve kökün çocukları 1 kere dolaşılmış olur. d=3 olduğunda kök 3 kere ve çocukları 2 ve en alttaki çocuklar ise 1 kere dolaşılmış olur. Görüldüğü üzere derinliğin her artışında kök derinlik kadar altındaki her düğüm ise birer azalarak en nihayetinde<a href="http://www.bilgisayarkavramlari.com/2008/05/07/agaclar-tree/"> yapraklar (leaf)</a> tek bir kere dolaşılmış olmaktadır.</p>
<p>&nbsp;</p>
<p>Sonuç olarak Yukarıdaki formülün ilk terimi kök (d+1)1 (tek düğüm d+1 kere dolaşılmıştır) , ikinci terimi kökün çocukları (db (kökün çocukları (ki sayısı b&#8217;dir) derinlik kadar (ki d ile gösterilir) dolaşılmıştır).</p>
<p>&nbsp;</p>
<p>Yukarıdaki bu formülü daha toplu şekilde aşağıda gösterildiği gibi yazabiliriz:<br />
<img title="iddskompleks2.png" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/iddskompleks2.png" alt="Iddskompleks2" width="132" height="62" border="0" /></p>
<p>&nbsp;</p>
<p>Algoritmanın dolaşma (arama) zamanı karmaşıklığı yukarıda gösterildiği gibidir. Terimler birleştirildiğinde<a href="http://www.bilgisayarkavramlari.com/2008/12/22/en-kotu-durum-analizi-worst-case-analysis/"> en kötü durum analizi (worst case analysis) </a>için O(b<sup>d</sup>) gösterimi kullanılabilir.</p>
<p>&nbsp;</p>
<p>Hafıza karmaşıklığı ise O(bd) olarak ifade edilebilir. Bunun sebebi d derinliğindeki bir ağacın her seviyesinde b adet çocuğu bulunması durumunda bd kadar düğüm olacağıdır. Algoritma, çalışması sırasında ilave düğümlere ihtiyaç duymaz ve şeklin kendisi üzerinde dolaşarak sonuca ulaşır.</p>

<p class="sayac_bilgi">387 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/11/08/yinelemeli-derinlik-aramasi-iterative-deepining-search/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bin Packing (Kutulama Problemi)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/06/06/bin-packing-kutulama-problemi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/06/06/bin-packing-kutulama-problemi/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 07:50:05 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[Bilgisayar Kavramları]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[graf teorisi (graph theory, çizge kuramı)]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/06/06/bin-packing-kutulama-problemi/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER İyileştirme problemleri açısından klasik bir örnektir (optimisation problems). Problem basitçe bir kutunun içerisine en az boş alan bırakarak, eşyaların en iyi şekilde nasıl yerleştireceği olarak düşünülebilir. Aslında problemi boyutlara göre incelersek aşağıdaki şekilde bir liste yapılabilir: Tek boyutlu kutulama (1D bin packing) :Bu problemde amaç bir çizgi veya hat gibi [...]]]></description>
			<content:encoded><![CDATA[<div>
<p style="margin-bottom: 0cm;">Yazan : Şadi Evren ŞEKER</p>
<p style="margin-bottom: 0cm;">İyileştirme problemleri açısından klasik bir örnektir (optimisation problems). Problem basitçe bir kutunun içerisine en az boş alan bırakarak, eşyaların en iyi şekilde nasıl yerleştireceği olarak düşünülebilir.</p>
<p style="margin-bottom: 0cm;">Aslında problemi boyutlara göre incelersek aşağıdaki şekilde bir liste yapılabilir:</p>
<p style="margin-bottom: 0cm;"><strong>Tek boyutlu kutulama (1D bin packing)</strong> :Bu problemde amaç bir çizgi veya hat gibi görülebilecek yapının içerisine farklı boyutlardaki çizgileri yerleştirmek olarak düşünülebilir.</p>
<p style="margin-bottom: 0cm;">Örneğin zaman çizelgelemesinde, bir kişinin yapacağı işleri, zaman çizgisinin üzerine yerleştirmesi (ve her işin farklı miktarda zaman gerektirdiğini ve kişinin çalışma saatlerinin sınırlı olduğunu düşünürsek en fazla işi en az zamanda (örneğin 8 saatlik mesailer içinde) yapması ) bir problemdir. Buradaki hem kişinin yapacağı işler hem de bu işlerin yerleştirileceği zaman çizgisi tek boyutludur.</p>
<p style="margin-bottom: 0cm;">Daha basit olması açısından örneğin 100m uzunluğundaki bir ipi 7 ve 9m uzunluğundaki parçalara en az fire ile bölmek istiyoruz, en verimli bölme işleminde kaç adet 7 ve kaç adet 9 uzunluğunda ipimiz olur gibi soruları düşünebiliriz. Bu tip sorular tek boyutlu kutulama problemleridir.</p>
<p style="margin-bottom: 0cm;"><strong>İki boyutlu kutulama problemleri (2D bin packing optimization):</strong> Bu grupta bir tablodan ve iki boyuttan bahsedilebilir. Örneğin kot pantolon üreten bir tekstil firmasında farklı boyutlardaki Pantolon kalıplarının en az fire ile 5x5m büyüklüğündeki bir kare kumaştan kesilmesi isteniyor olsun. Bu problem iki boyutlu (x ve y boyutları) bir kutulama problemidir. Benzer bir problem, bir gazetedeki seri ilanların, en az fire ile sayfaya yerleştirilmesi olarak da düşünülebilir.</p>
<p style="margin-bottom: 0cm;"><strong>3 boyutlu kutulama (3D bin packing)</strong> problemin en zor şekli olarak tanımlanır ve 3 boyutlu bir kutunun içerisine konulan her şeklin farklı x,y ve z boyutlarında şekiller olması olarak düşünülebilir. Problemin genel tanımını yaptığımız için belirteyim, örneğin ev taşıma sırasında çıkan eşyaların kutulanması olarak düşünebilirsiniz. Bu durumu daha da karmaşık yapmaktadır çünkü kutular farklı boyut ve şekillerdedir (örneğin silindir bir varil veya küp veya dikdörtgenler prizması gibi kutuların içerisine yerleştirme yapılmakta) ve kutulanan şekillerde farklıdır ve hatta girintilidir (concave , non-convex) (örneğin avize, koltuk, sandalye gibi birbirinin içine girebilen nesneleri düşününüz). 2 ve 3 boyutlu paketleme, paketlenen nesnelerin girintili olup olmamasına göre ikiye ayrılmaktadır. Dış bükey nesnelerin paketlenmesi nispeten daha basit bir problemdir. Ancak nesnelerin iç bükey olması halinde problem biraz daha karmaşıklaşır.</p>
<p style="margin-bottom: 0cm;">Hatta literatürdeki kısıtlı aramalarım sonucunda ulaşabildiğim kadarıyla tam olarak iç bükey nesnelerin paketlenebildiği bir sonuç ne yazık ki bulamadım. Örneğin iki vidanın en verimlim paketlenmesi sırasında vidaların girinti çıkıntılarının üstüste gelmesi gerektiğini tecrübi olarak biliyoruz. N adet vida için bu durum birbirini tekrar eden bir hal alır. Gerçekten farklı boylarda ve adım sıklığında ve çaplarda vidalar verilse bu durumda en verimli paketlemeyi yapabilen bir algoritma henüz görmedim.</p>
<p style="margin-bottom: 0cm;"><strong>Paketlenen nesnelere göre problemin sınıflandırılması:</strong></p>
<p style="margin-bottom: 0cm;">Paketlenen nesne çeşitlerinin sabit olması ve ön tanımlı olması halinde problem homojen olarak tanımlanır. Örneğin tek boyutlu kutulama probleminin tanımı sırasında verilen ve “100m uzunluğundaki bir ipi 7 ve 9m uzunluğundaki parçalara en az fire ile bölmek” şeklinde geçen örnek bu tip homojen (homogenous) bir yapıdadır. Buna karşılık heterojen bir problemde, paketlenecek nesnelerin tipleri ya tamamen birbirlerinden farklıdır ya da aynı tipte çok az tekrar vardır. Yine tek boyutlu problem örneğinde verilen zaman çizgisi üzerinde farklı uzunluklardaki randevuların yerleştirilmesi bu tiptendir.</p>
<p style="margin-bottom: 0cm;">Bu anlamda aşağıdaki problemler, kutulama probleminin birer özel hali olarak düşünülebilir:</p>
<ul>
<li>
<p style="margin-bottom: 0cm;">kamyon yükleme problemi (truck loading),</p>
</li>
<li>
<p style="margin-bottom: 0cm;">konteyner yükleme problemi (Container loading problem, CLP)</p>
</li>
<li>
<p style="margin-bottom: 0cm;">şerit paketleme problemi (Strip Packing problem, SPP)</p>
</li>
</ul>
<p style="margin-bottom: 0cm;">Yukarıda, problemin tanımını yaptıktan sonra çözümlere bir göz atalım:</p>
<p style="margin-bottom: 0cm;"><strong>Homojen tek boyutlu problem çözümü</strong></p>
<p style="margin-bottom: 0cm;">Şayet problem tek boyutlu ise ve homojen nesnelerin paketlenmesi olarak problemin çözülmesi isteniyorsa problem oldukça basit demektir ve basit matematiksel hesaplamalar ile problemi çözebiliriz.</p>
<p style="margin-bottom: 0cm;">Örneğin tek nesne ve tek paket varsa işlem basitçe paketin nesneye bölümü olarak bulunur (zaten burada zor Bir şey de yok):</p>
<p style="margin-bottom: 0cm;">Örneğin 100m uzunluğundaki bir ipten kaç tane 5m uzunluğunda ip kesilebilir:</p>
<p style="margin-bottom: 0cm;">100 / 5 = 20</p>
<p style="margin-bottom: 0cm;">biraz daha zorlaştırıp ip sayısını 2 çeşide veya 3 çeşide çıkarırsak problem  <a href="http://www.bilgisayarkavramlari.com/2008/03/24/belirsiz-cokterimli-tam-np-complete-nondeterministic-polynomial-complete/">np-tam (np-complete)</a> bir hal alır. Örneğin aşağıdaki kodu inceleyelim:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307346697_0__.jpg" border="0" alt="" width="599" height="470" /></p>
<p style="margin-bottom: 0cm;">Kodda görüldüğü üzere bütün ihtimaller denenmektedir. Basitçe herhangi bir k değeri için, k-a ve k-b değerlerini denemekte ve denenen duruma göre a veya b değerini bir arttırmaktadır. Aslında kodumuz basit bir  <a href="http://www.bilgisayarkavramlari.com/2008/05/07/ikili-agac-binary-tree/">ikili ağaç (binary tree)</a> oluşturmaktadır:</p>
<p>Önce 9 veya 7 ile başlanması ihtimalleri:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307346697_1__.gif" alt="" width="275" height="149" /></p>
<p>Sonra bu ihtimallerin de 7 veya 9 azalma ihtimalleri:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307346697_2__.gif" alt="" width="416" height="225" /></p>
<p>Yukarıda gösterildiği gibi her düğümden yine ikişer ihtimal indirerek bir alt seviyeye geçilebilir. Neticede 0 olana kadar yapılan bir aramadır ve 0 sonucuna birden farklı yoldan ulaşılabilir.</p>
<p style="margin-bottom: 0cm;">Kodumuz çalıştırıldığında çözüm olarak aşağıdaki sonuçları üretmektedir:</p>
<p style="margin-bottom: 0cm;">cozum : 7*4 + 9*8</p>
<p style="margin-bottom: 0cm;">cozum : 7*13 + 9*1</p>
<p style="margin-bottom: 0cm;">Gerçekten de problemin iki farklı çözümü bulunmaktadır.</p>
<p style="margin-bottom: 0cm;">Yukarıdaki kod basit bir hesaplama ile, 2&#8242;nin üstlerinin toplamı kadar adım hesaplamaktadır.</p>
<p style="margin-bottom: 0cm;">Bu değer yukarıdaki ağaçtan çıkarılabilir:</p>
<p style="margin-bottom: 0cm;">ilk düğüm için tek ihtimal 2 <sup>0</sup></p>
<p style="margin-bottom: 0cm;">ikinci seviye için iki ihtimal: 2 <sup>1</sup></p>
<p style="margin-bottom: 0cm;">üçüncü seviye için dört ihtimal 2 <sup>2</sup></p>
<p style="margin-bottom: 0cm;">şeklinde gitmektedir ve örneğin problemimiz üçüncü seviyede çözülseydi (sonuç 0 olsaydı) o zaman karmaşıklığımız bu değerlerin toplamı olacaktı ve 2 <sup>0</sup> + 2 <sup>1</sup> + 2 <sup>2</sup> şeklinde hesaplanacaktı.</p>
<p style="margin-bottom: 0cm;">Bu değer, ikili ağaçlardan bilindiği üzere 2 <sup>n</sup>-1 şeklinde hesaplanabilir.</p>
<p style="margin-bottom: 0cm;">Görüldüğü üzere yukarıdaki algoritma O(2 <sup>n</sup>) değerinde bir karmaşıklığa sahiptir ve bu değer bir çok terimli (polynom) değildir yani algoritmanın karmaşıklık sınıfı <a href="http://www.bilgisayarkavramlari.com/2008/03/24/belirsiz-cokterimli-tam-np-complete-nondeterministic-polynomial-complete/">np-tam (NP-Complete)</a> olarak belirtilebilir. Ayrıca yukarıdaki k değeri için bir çözüm bulunmuştur ancak çözüm bulunamasaydı bu değer k terim için denenecekti. Yani 100 için çözüm yoksa bir yaklaşığı olan 99 için ardından iki yaklaşığı 98 için &#8230; Bu işlem hiç çözüm bulunamaması halinde k terim için denenecekti.</p>
<p>Yukarıdaki problem,  <a href="http://www.bilgisayarkavramlari.com/2007/12/03/dinamik-programlama-dynamic-programming/">dinamik programlama (dynamic programming)</a> kullanılarak iyileştirilebilir. Bunun sebebi arama işlemi sırasında bazı sonuçların tekrar etmesidir. Örneğin yukarıdaki ikili ağacı aşağıdaki şekilde çizebiliriz:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307346697_3__.gif" alt="" width="416" height="225" /></p>
<p>Farka dikkat ederseniz, 93 – 9 = 84 ve aynı zamanda 91-7 = 84 olduğu görülür. Bu durumda aslında 84 değeri bir önceki kodda iki farklı durum için aranmaktayken şimdi tek bir durum için aransın istiyoruz. Elbette 84 sadece bir örnektir ve buna bağlı olarak çok sayıda tekrar eden değer bulunmaktadır.</p>
<p style="margin-bottom: 0cm;">Hesaplanan bu değerleri bir  <a href="http://www.bilgisayarkavramlari.com/2007/05/04/array-dizi/">dizi (array)</a> içerisinde tutup tekrar hesaplanmasını engellemek istiyoruz:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307346697_4__.jpg" border="0" alt="" width="643" height="525" />Yukarıdaki yeni kodda, bir dizi içerisinde tek döngü ile sonucu hesaplattık. Buna göre algoritmamız iki elemanlı bir diziyi kullanmakta, dizinin 0. elemanları 7lerin sayısını ve 1. elemanları ile 9ların sayısını saymaktadır.</p>
<p style="margin-bottom: 0cm;">Kodumuz ilk başta 0 için 0 tane 7 ve 0 tane 9 gerektiği gerçeği ile çalışmaya başlıyor. 14-23. satırlar arasındaki döngü basitçe i. terim için i-a ve i-b değerlerine bakıyor. Şayet i. terim için i-a veya i-b değerinde bir çözüm varsa (nereden geldiğini önemsemeksizin) bu çözüme bulduğu koşulu ilave ederek mevcut i değeri için çözümü kaydediyor. Şayet bu iki terim de bulunmuyorsa o zaman bir sonraki i değerine geçiyor.</p>
<p style="margin-bottom: 0cm;">Ekran çıktısı aşağıdaki şekildedir:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307346697_5__.jpg" border="0" alt="" width="280" height="315" /></p>
<p>Son 20 satır görülmekle birlikte daha önceki satılar alıntılanmamıştır. Ayrıca son 20 satırda görüldüğü üzere, tamamına ait bir çözüm bulunmaktadır. Örneğin 88 sayısı için 7*10 + 9*2 = 88 sonucuna ulaşılmıştır. En son satırda ise 100 için 7*13 + 9*1 sonucu görülmektedir.</p>
<p style="margin-bottom: 0cm;">Görüldüğü üzere birden fazla sonuç olsa bile tek bir sonucu görmekteyiz bunun sebebi veri yapısının bir sonuç üretmek üzere tasarlanmış olmasıdır. Elbette daha farklı veri yapıları kullanılarak diğer çözümleri de gösteren sonuçlar elde edilebilir.</p>
<p style="margin-bottom: 0cm;">Yukarıdaki algoritmanın karmaşıklığı ise bir öncekine göre oldukça iyi sayılabilecek O(n) olarak bulunur. Bunun sebebi dizideki her elemanın üzerinden tek bir kere geçiyor olması ve dolayısıyla tek bir döngünün (koddaki 14-21 satırlar arası) çalışıyor olmasıdır.</p>
</div>

<p class="sayac_bilgi">569 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/06/06/bin-packing-kutulama-problemi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gomory-Hu Ağacı</title>
		<link>http://www.bilgisayarkavramlari.com/2011/04/18/gomery-hu-agaci/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/04/18/gomery-hu-agaci/#comments</comments>
		<pubDate>Sun, 17 Apr 2011 21:29:27 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[graf teorisi (graph theory, çizge kuramı)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/04/18/gomery-hu-agaci/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinde, şekil kuramında (graph theory) kullanılan en kısa kesim (minimum cut) problemine yönelik bir iyileştirme (optimization) ağacıdır. Algoritmanın amacı, bir ağaç (tree) oluşturmak ve oluşturulan ağaçta, bir şekildeki (graph) kesme ihtimallerini hesaplamaktır. Algoritmanın çalışmasını bir örnek üzerinden anlamaya çalışalım. Öncelikle en kısa kesimi bulacağımız şeklimiz (graph) aşağıdaki şekilde verilmiş [...]]]></description>
			<content:encoded><![CDATA[<div>
<p style="margin-bottom: 0cm;">Yazan : Şadi Evren ŞEKER</p>
<p style="margin-bottom: 0cm;">Bilgisayar bilimlerinde, şekil kuramında (graph theory) kullanılan  <a href="http://www.bilgisayarkavramlari.com/2009/03/08/graflarda-kesitler-cut-in-graphs-agaclarda-kesitler/">en kısa kesim (minimum cut)</a> problemine yönelik bir iyileştirme (optimization) ağacıdır.</p>
<p style="margin-bottom: 0cm;">Algoritmanın amacı,  <a href="http://www.bilgisayarkavramlari.com/2008/05/07/agaclar-tree/">bir ağaç (tree)</a> oluşturmak ve oluşturulan ağaçta, bir  <a href="http://bilgisayarkavramlari.com/2008/08/01/graf-sekil-graph/">şekildeki (graph)</a> kesme ihtimallerini hesaplamaktır.</p>
<p style="margin-bottom: 0cm;">Algoritmanın çalışmasını bir örnek üzerinden anlamaya çalışalım. Öncelikle en kısa kesimi bulacağımız şeklimiz (graph) aşağıdaki şekilde verilmiş olsun:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1303075775_0__.jpg" border="0" alt="" width="278" height="310" /></p>
<p>Yukarıda, yönsüz ve ağırlıklı bir şekil görülmektedir (undirected, weighted graph). Amacımız bu şekli düz bir şekilde kestiğimizde en az maliyetli kesiği bulmaktır. Konuyu anlamak için bir kesim örneği ele alalım:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1303075775_1__.jpg" border="0" alt="" width="251" height="305" /></p>
<p>Yukarıdaki kesim sırasında, A-B, A-D, E-D, F-D bağları kesilmiştir. Bu bağların toplam maliyeti 5+7+5+7 = 24 değerindedir.</p>
<p style="margin-bottom: 0cm;">İşte bizim amacımız farklı şekillerde yapılabilecek kesme eylemlerinden en az maliyete sahip olanını bulmaktır.</p>
<p style="margin-bottom: 0cm;">Algoritmamız ilk olarak bütün düğümlerin toparlandığı bir büyük düğüm ile başlıyor.</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1303075775_2__.jpg" border="0" alt="" width="532" height="368" /></p>
<p>Şekilde görüldüğü üzere, bütün düğümleri içerisine alan tek bir düğümümüz bulunuyor. Şimdi rast gele seçilen iki düğüm arasındaki en küçük kesimi buluyoruz.</p>
<p style="margin-bottom: 0cm;">Bu aşamada rast gele olarak B ve E düğümlerini aldığımızı düşünelim.</p>
<p style="margin-bottom: 0cm;">Bu iki düğüm arasındaki en düğük maliyetli kesme aşağıda verilmiştir.</p>
<p><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1303075775_3__.jpg" border="0" alt="" width="509" height="339" /></p>
<p style="margin-bottom: 0cm;">Yukarıdaki şekilde, görüldüğü üzere, A-B, B-D ve D-C kenarları kesilmiş ve bunun karşılığında 12 maliyetinde bir kesim elde edilmiştir. Algoritmamız, bu kesim işlemini düğümlerin tutulduğu grup üzerinde de uygular.</p>
<p style="margin-bottom: 0cm;">Aslında bu aşamada algoritma artık anlaşılmaktadır. Algoritmamız bu şekilde rast gele düğümler seçerek her grupta tek düğüm kalana kadar şekli parçalamaya devam edecek ve sonra en kısa maliyetli kenarı alacaktır.</p>
<p style="margin-bottom: 0cm;">Bu işlemi örnek üzerinde görmeye devam edelim.</p>
<p style="margin-bottom: 0cm;">Algoritmamızın şimdiki aşamasında, gruplardan birisini ve sonrada bu gruptaki düğümlerden iki tanesini seçeceğiz.</p>
<p style="margin-bottom: 0cm;">Örneğin B ve C düğümlerini seçtiğimizi düşünelim. (Bu aşamada farklı gruplardan iki düğüm seçemiyoruz. Örneğin B ve A düğümleri seçilemezdi. Ancak diğer gruptan iki düğüm seçebilirdik. Örneğin A ve D düğümleri olabilirdi).</p>
<p style="margin-bottom: 0cm;">B ve C düğümleri arasında tek bir kesme mümkündür ve bu da aşağıdaki şekilde işaretlenmiştir:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1303075775_4__.jpg" border="0" alt="" width="494" height="354" /></p>
<p>Yukarıdaki şekilde görüldüğü üzere, B-C ve C-D kenarları kesilmiş ve maliyet olarak 9 maliyetinde bir kesim elde edilmiştir. Bu durum algoritmamızın çalışmasını tutan resmin sağ tarafında gösterilmiştir. Yani bir önceki adımda beraber duran B ve C düğümleri ayrılmış ve iki ayrı düğüm olarak gomory-hu ağacında gösterilmiştir.</p>
<p style="margin-bottom: 0cm;">Bir sonraki adımda yine iki rast gele düğüm seçiyoruz. Bu sefer düğümlerimiz E ve F olsun.</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1303075775_5__.jpg" border="0" alt="" width="483" height="398" /></p>
<p>Yeni halimizde E düğümü de tek başına ağacımızda yerini almıştır (resmin sağ tarafı).</p>
<p style="margin-bottom: 0cm;">Rast gele düğüm seçimine devam ediyoruz ve bu sefer D ve F düğümlerini seçelim.</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1303075775_6__.jpg" border="0" alt="" width="495" height="387" /></p>
<p>D ve F düğümleri arasında, iki farklı kesim alınabilirdi. En düğük maliyetli olan alternatif yukarıda zaten gösterilmiştir, ayrıca E-D ve F-D kesimi de alınabilirdi, ancak daha önce de belirttiğimiz üzere, en düşük maliyetli olanını alıyoruz.</p>
<p style="margin-bottom: 0cm;">Gelelim son ayrıma, A-D kesimi aşağıdaki şekilde yapılmıştır:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1303075775_7__.jpg" border="0" alt="" width="496" height="391" /></p>
<p>Bu son kesimle birlikte, ağacımızı tamamlamış oluyoruz ve algoritmamız çalışmasını bitiriyor. Buna göre yukarıdaki ağaçta iki tane minimum kesim (minimum cut) olabilir. Bunlardan birincisi B-C arasındaki 9 maliyetindeki kesim, ikincisi ise A-E arasındaki 9 maliyetindeki kesim.</p></div>

<p class="sayac_bilgi">279 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/04/18/gomery-hu-agaci/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mealy ve Moore Makineleri (Mealy and Moore Machines)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/01/26/mealy-ve-moore-makineleri-mealy-and-moore-machines/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/01/26/mealy-ve-moore-makineleri-mealy-and-moore-machines/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 11:02:02 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Automata (otomatlar, özdevinirler)]]></category>
		<category><![CDATA[Bilgisayar Kavramları]]></category>
		<category><![CDATA[Derleyiciler]]></category>
		<category><![CDATA[Donanım ( Hardware )]]></category>
		<category><![CDATA[graf teorisi (graph theory, çizge kuramı)]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[veri yapıları]]></category>
		<category><![CDATA[yapay zeka (artificial intelligence)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/01/26/mealy-ve-moore-makineleri-mealy-and-moore-machines/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinde sıkça kullanılan sonlu durum makinelerinin (finite state machine, FSM veya Finite State Automaton , FSA) gösteriminde kullanılan iki farklı yöntemdir. Genelde literatürde bir FSM&#8217;in gösteriminde en çok moore makinesi kullanılır. Bu iki yöntem (mealy ve moore makinaları) sonuçta bir gösterim farkı olduğu için bütün mealy gösterimlerinin moore ve [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bilgisayar bilimlerinde sıkça kullanılan sonlu durum makinelerinin <a href="http://www.bilgisayarkavramlari.com/2007/12/25/sonlu-durum-makinasi-finite-state-machine-finite-state-automaton/">(finite state machine, FSM</a> veya <a href="http://www.bilgisayarkavramlari.com/2008/08/02/sonlu-ototmatlar-finite-automaton/">Finite State Automaton , FSA</a>) gösteriminde kullanılan iki farklı yöntemdir. Genelde literatürde bir FSM&#8217;in gösteriminde en çok moore makinesi kullanılır. Bu iki yöntem (mealy ve moore makinaları) sonuçta bir gösterim farkı olduğu için bütün mealy gösterimlerinin moore ve bütün moore gösterimlerinin mealy gösterimine çevrilmesi mümkündür.</p>
<p>Klasik bir FSM&#8217;de bir giriş bir de çıkış bulunur (input / output). Bu değerlerin nereye yazılacağı aslında iki makine arasındaki farkı belirler.</p>
<p>Moore makinelerinde çıkış değerleri <a href="http://www.bilgisayarkavramlari.com/2008/08/01/dugum-node/">düğümlere (node</a>) yazılırken, giriş değerleri kenarlar (edges) üzerinde gösterilir.</p>
<p>Mealy makinelerinde ise giriş ve çıkış değerleri kenarlar (edges) üzerinde aralarına bir taksim işareti (slash) konularak gösterilir. Örneğin 1/0 gösterimi, girişin 1 ve çıktının 0 olduğunu ifade eder.</p>
<p>Basit bir örnek olarak <a href="http://www.bilgisayarkavramlari.com/2008/03/13/ozel-veya-exclusive-or-farklilik-operatoru/">özel veya (exclusive or, <span style="font-family: Symbol;">Ä</span>)</a> işlemini ele alalım ve her iki makine gösterimi ile de çizmeye çalışalım.</p>
<div>
<table style="border-collapse: collapse;" border="0">
<colgroup>
<col style="width: 66px;"></col>
<col style="width: 57px;"></col>
<col style="width: 47px;"></col>
</colgroup>
<tbody>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border: solid 0.5pt;">Girdi 1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Girdi 2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Çıktı</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
</tr>
</tbody>
</table>
</div>
<p>Klasik bir XOR kapısı, yukarıdaki <a href="http://bilgisayarkavramlari.com/2007/12/08/dogruluk-cizelgesi-truth-table/">doğruluk çizelgesinde (truth table)</a> gösterildiği üzere iki giriş ve bir çıkıştan oluşur. Bizim makinemiz de ilk girdiden sonra ikinci girdiyi aldığında beklenen çıktıyı vermeli. Ayrıca makine sürekli olarak çalışmaya devam edecek. Örneğin 101011 şeklinde bir veri akışı sağlanması durumunda, sonuç olarak 1<span style="font-family: Symbol;">Ä</span>0<span style="font-family: Symbol;">Ä</span>1<span style="font-family: Symbol;">Ä</span>0<span style="font-family: Symbol;">Ä</span>1<span style="font-family: Symbol;">Ä</span>1 değerini hesaplamasını isteriz.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012611_1102_MealyveMoor1.png" alt="" /></p>
<p>Yukarıdaki gösterim bir mealy makinesidir. Makinede görüldüğü üzere 3 farklı durum arasındaki geçişler üzerine iki adet değer yazılmıştır. Bu değerlerden ilki giriş ikincisi ise çıkış değeridir.</p>
<p>Makineyi beraber okumaya çalışalım.</p>
<p>Makinenin boşluktan bir ok ile başlayan durumu, yani örneğimizdeki S0 durumu, başlangıç durumudur. Bu durumdan başlanarak gelen değerlere göre ilgili duruma geçilir.</p>
<p>Örneğimizi hatırlayalım. Giriş olarak 101011 <a href="http://www.bilgisayarkavramlari.com/2008/08/02/dizgi-string/">dizgisini (string)</a> almayı planlamıştık. Bu durumda ilk bitimiz 1 olarak geliyor ve S0 durumunda 1 girişi ile S2 durumuna geçiyoruz. Burada geçiş sırasında kullanılan kenarın üzerindeki değeri okuyalım: 1/0 bunun anlamı 1 geldiğinde geçilecek kenar olması ve çıktının 0 olmasıdır. Yani şu anda çıktımız 0</p>
<p>Ardından gelen değer 0 (yani şimdiye kadar 01 değerleri geldi). En son makinemizdeki durum, S2 durumuydu, şimdi yeni gelen değeri bu durumdaki kollardan takip ediyor ve S1&#8242;e giden 0/1 kenarını izliyoruz. Bu kolu izleme sebebimiz, S2 durumundan gidilen tek 0 girdisi kolu olmasıdır. Bu kol üzerindeki ikinci değer olan 1 ise, çıktının 1 olduğudur. Yani buraya kadar olan girdiyi alacak olsaydık 01 için 1 çıktısı alacaktık.</p>
<p>İşlemlere devam edelim ve durumları yazmaya çalışalım:</p>
<div>
<table style="border-collapse: collapse;" border="0">
<colgroup>
<col style="width: 56px;"></col>
<col style="width: 57px;"></col>
<col style="width: 41px;"></col>
<col style="width: 56px;"></col>
</colgroup>
<tbody>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border: solid 0.5pt;">Gelen Değer</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Durum</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Çıkış</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Yeni Durum</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S1</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S1</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
</tr>
</tbody>
</table>
</div>
<p>Yukarıdaki tablomuzun son halinde, çıkış değeri olarak 0 okunmuştur. Yani örneğimizin neticesi 0 olacaktır.</p>
<p>Aynı örneği moore makinesi olarak tasarlayacak olsaydık:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012611_1102_MealyveMoor2.png" alt="" /></p>
<p>Moore makinesinde, mealy makinesine benzer şekilde boşluktan gelen bir ok, başlangıç durumunu belirtir.</p>
<p>Makinenin, durumlarında, mealy makinesinde olmayan değerler eklenmiştir. Bu değerler, ilgili durumdaki çıktıyı gösterir. Örneğin makinemiz S1 durumundayken çıktı 0 olarak okunabilir.</p>
<p>Şimdi moore makinesinde, aynı örneği çalıştırıp sonucu karşılaştıralım.</p>
<p>Giriş olarak 101011 <a href="http://www.bilgisayarkavramlari.com/2008/08/02/dizgi-string/">dizgisini (string)</a> almayı planlamıştık. Bu durumda ilk bitimiz 1 olarak geliyor ve S0 durumunda 1 girişi ile S2 durumuna geçiyoruz. Bu geçiş sonucunda geldiğimiz S2 durumunda okunan çıktı değeri 0 yani sonuç şimdilik 0.</p>
<p>Ardından gelen 0 değeri ile S3 durumuna geçiyoruz ve çıktımız 1 oluyor. Çünkü S3 durumu 1 çıktısı veren durumdur. Bu şekilde durumları ve durumlar arasındaki geçişleri izlersek, aşağıdaki tabloyu çıkarabiliriz:</p>
<div>
<table style="border-collapse: collapse;" border="0">
<colgroup>
<col style="width: 56px;"></col>
<col style="width: 57px;"></col>
<col style="width: 41px;"></col>
<col style="width: 56px;"></col>
</colgroup>
<tbody>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border: solid 0.5pt;">Gelen Değer</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Durum</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Çıkış</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Yeni Durum</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S3</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S3</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S4</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S4</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S3</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S3</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S4</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S4</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
</tr>
</tbody>
</table>
</div>
<p>Görüldüğü üzere, makinemiz, örnek girdi için S2 durumunda sonlanıyor ve bu durumda çıktımız 0 olarak okunuyor.</p>

<p class="sayac_bilgi">812 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/01/26/mealy-ve-moore-makineleri-mealy-and-moore-machines/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Order Theory (Sıra Teorisi, Nazariyatül Tertib)</title>
		<link>http://www.bilgisayarkavramlari.com/2010/12/29/order-theory-sira-teorisi-nazariyatul-tertib/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/12/29/order-theory-sira-teorisi-nazariyatul-tertib/#comments</comments>
		<pubDate>Wed, 29 Dec 2010 09:59:01 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Bilgisayar Matematiği]]></category>
		<category><![CDATA[graf teorisi (graph theory, çizge kuramı)]]></category>
		<category><![CDATA[veri yapıları]]></category>
		<category><![CDATA[infix]]></category>
		<category><![CDATA[inorder]]></category>
		<category><![CDATA[order]]></category>
		<category><![CDATA[order theory]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[postorder]]></category>
		<category><![CDATA[prefix]]></category>
		<category><![CDATA[preorder]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/12/29/order-theory-sira-teorisi-nazariyatul-tertib/</guid>
		<description><![CDATA[Yazan : Yrd. Doç. Dr. Şadi Evren ŞEKER Bu yazının amacı, eğitimimiz sırasında sürekli olarak okuduğumuz bir teori olan tertip teorisi (sıralama teorisi , order theory) konusunda bulunan kavramları (preorder, postorder gibi) açıklamaktır. Osmanlıda bu konuya nazariyatül tertip ismi verilmektedir. Nazariyatül tertip, bilgisayar bilimleri de dahil olmak üzere pek çok matematiksel problemin çözümünde kullanılmaktadır. Örneğin [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Yrd. Doç. Dr. Şadi Evren ŞEKER</p>
<p>Bu yazının amacı, eğitimimiz sırasında sürekli olarak okuduğumuz bir teori olan tertip teorisi (sıralama teorisi , order theory) konusunda bulunan kavramları (preorder, postorder gibi) açıklamaktır. Osmanlıda bu konuya nazariyatül tertip ismi verilmektedir.</p>
<p>Nazariyatül tertip, bilgisayar bilimleri de dahil olmak üzere pek çok matematiksel problemin çözümünde kullanılmaktadır. Örneğin sıralama algoritmaları, arama algoritmaları gibi basit algoritmalar, bu nazariye üzerinden çalışmaktadır.</p>
<p>Her şeye en basitten başlayalım ve ilk okulda öğrendiğimiz &lt; veya &gt; işaretlerinin aslında bu nazariyenin en temel işlemleri olduğunu belirtelim. Buna göre biz tam sayılar arasında bir sıralama (tertip) işlemi yaparken aslında bu teorinin bir uygulamasını yapıyoruz.</p>
<p>Örneğin aşağıdaki tanımı ele alalım:</p>
<p><strong>Partially Ordered Sets (kısmi tertipli kümeler)<br />
</strong></p>
<p>Bir kümenin aşağıdaki özellikleri taşıması durumunda verilen isimdir:</p>
<p style="margin-left: 36pt;"><span style="font-family: Times New Roman; font-size: 12pt;"><em>a</em> ≤ <em>a</em> (<a href="http://www.bilgisayarkavramlari.com/2009/12/05/yansimareflexivity/">yansıma (reflexive) özelliği</a>)<br />
</span></p>
<p style="margin-left: 36pt;"><span style="font-family: Times New Roman; font-size: 12pt;"><em>a</em> ≤ <em>b</em> ve <em>b</em> ≤ <em>a</em> ise <em>a</em> = <em>b</em> (ters simetri özelliği (antisymmetry))<br />
</span></p>
<p style="margin-left: 36pt;"><span style="font-family: Times New Roman; font-size: 12pt;"><em>a</em> ≤ <em>b</em> ve <em>b</em> ≤ <em>c</em> ise <em>a</em> ≤ <em>c</em> (geçişlilik (transitivity)).<br />
</span></p>
<p>Örneğin yukarıdaki özelliklerin hepsi sayma sayıları kümesi için geçerlidir.</p>
<p>Bu kümeye İngilizcedeki partially ordered sets isminin ilk iki kelimesini birleştirerek poset ismi de verilir.</p>
<p><strong>Preorder (Öntertip)<br />
</strong></p>
<p>Bir değerin diğerinden önce gelmesi prensibine dayanır. Öntertip şartının sağlanması için, bir serideki değerler arasında <a href="http://www.bilgisayarkavramlari.com/2009/12/05/yansimareflexivity/">yansıma (reflexive)</a> ve geçişlilik (transitivity) özellikleri bulunmalıdır. Ancak ters simetri (Anti symmetry) bulunmak zorunda değildir.</p>
<p>Buna göre sadece a &lt; b &lt; c şeklindeki bir seri, öntertip olarak kabul edilebilir ve bu bağlantı özelliklerinde anti simetriden gelen eşitlik bulunmak zorunda değildir.</p>
<p><strong>İşlem Tertipleri<br />
</strong></p>
<p>Matematiksel olarak bütün gösterimleri bir dil olarak kabul etmek mümkündür. Bu anlamda işlemleri ifade eden matematiksel gösterimler de birer dildir ve bazı kurallara tabidir. Matematiksel işlemlerin gösteriminde kullanılan yazım şekilleri farklılık gösterebilir.</p>
<p>Örneğin klasik olarak kullanılan matematiksel işlemler, <span style="font-family: Symbol;"></span> herhangi bir işlem olmak ve a ve b birer <a href="http://www.bilgisayarkavramlari.com/2009/05/07/haber-predicate/">fiil (predicate</a>) olmak üzere, işlemler aşağıdaki şekillerde gösterilebilir:</p>
<ol>
<li>Inorder (iç tertip infix ): a <span style="font-family: Symbol;"></span> b</li>
<li>Preorder (Ön tertip, prefix ): <span style="font-family: Symbol;"></span> a b</li>
<li>Postorder (Son tertip, postfix): a b <span style="font-family: Symbol;"></span></li>
</ol>
<p>Yukarıdaki yazılımlardan iç tertip gösterimi, ülkemizde ilk okullardan beri öğretilen gösterimdir. Örneğin &#8221; 5 + 6 &#8221; gösteriminde + işlemi iki değerin arasında yer almaktadır.</p>
<p>&#8220;+ 5 6&#8243; ön tertbi veya &#8220;5 6 +&#8221; son tertibi de çeşitli matematiksel gösterimlerde kullanılmaktadır.</p>
<p>Örneğin programlama dillerinde de sıkça kullanılan fonksiyon çağırımı bir ön tertiptir.</p>
<p>F 4 5</p>
<p>Gösteriminde, F fonksiyonuna 4 ve 5 değerleri birer parametre olarak verilmiştir. Benzer bir kullanım komut satırında da programlara parametre verilirken geçerlidir.</p>
<p>cp a.txt b.txt</p>
<p>Yukarıdaki gösterimde a.txt dosyası, b.txt dosyası olarak kopyalanmış bu sırada, işleme (cp) parametreler prefix (öntertip) sırasıyla verilmiştir.</p>
<p><strong>Ağaç Dolaşma Algoritmaları (Tree Traverse Algorithms)<br />
</strong></p>
<p>Sıralama teorisinin diğer bir kullanım alanı da ağaçlardır. Herhangi bir ağacın dolaşılması sırasında yukarıda açıklanan sıralamalar kullanılabilir.</p>
<p>Konuyu en çok kullanılan <a href="http://www.bilgisayarkavramlari.com/2008/05/07/ikili-agac-binary-tree/">ikili ağaçlar (binary tree)</a> üzerinden açıklamaya çalışalım.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122910_0958_OrderTheory11.png" alt="" /></p>
<p>Yukarıdaki ağaç örneği, ikili ağaç olmanın yanında<a href="http://www.bilgisayarkavramlari.com/2008/05/07/ikili-arama-agaci-binary-search-tree/">, ikili bir arama ağacı (binary search tree)</a> olma özelliğini de taşır.</p>
<p>Buna göre her düğümün solundaki düğümler, kendisinden küçük ve sağındaki düğümler ise kendinden büyük değerler taşımak zorundadır.</p>
<p>Yukarıdaki herhangi bir düğümü aldığımızda aşağıdaki gibi bir durum ortaya çıkar.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122910_0958_OrderTheory21.png" alt="" /></p>
<p>Yukarıdaki gösterim, ikili arama ağacının bütün düğümleri için geçerlidir. Belki yaprak düğümler (leaf nodes, ağacın en altındaki düğümler) için bu durumun geçerli olmadığını düşünebilirsiniz ancak, en sondaki bu düğümlerin de sol ve sağında alt düğümler bulunmakta ancak bu düğümlerin değeri boş (null) olmaktadır. (daha detaylı bilgi için <a href="http://www.bilgisayarkavramlari.com/2008/05/07/ikili-arama-agaci-binary-search-tree/">ikili arama ağacının kodlamasına</a> bakabilirsiniz)</p>
<p>İkili arama ağaçlarında 6 farklı dolaşım mümkündür. Zaten bu değer 3!&#8217;dir. Bu dolaşımları yukarıda modellediğimi 3 düğümden oluşan ağaç için sıralayalım:</p>
<ol>
<li>NLR</li>
<li>NRL</li>
<li>LNR</li>
<li>RNL</li>
<li>LRN</li>
<li>RLN</li>
</ol>
<p>Yukarıdaki gösterimleri, N (ata) düğümün konumuna göre 3 sınıfta toplamak mümkündür.</p>
<ol>
<li>Infix (iç tertip , inorder) : LNR ve RNL</li>
<li>Prefix ( öntertip , preorder): NLR ve NRL</li>
<li>Postfix (sontertip, postorder): RLN ve LRN</li>
</ol>
<p>Yukarıdaki bu gösterimleri birer işlem ağacı olarak da düşünmek mümkündür. Örneğimizi aşağıda çizerek anlatmaya çalışalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122910_0958_OrderTheory31.png" alt="" /></p>
<p>Yukarıdaki ağaçta bulunan değerleri 6 farklı gösterim için okuyalım:</p>
<ol>
<li>NLR : + 5 7</li>
<li>NRL : + 7 5</li>
<li>LNR : 5 + 7</li>
<li>RNL : 7 + 5</li>
<li>LRN : 5 7 +</li>
<li>RLN : 7 5 +</li>
</ol>
<p>Bu gösterimlerden örneğin LNR gösterimi bizim klasik olarak ilk okuldan beri gördüğümüz toplama işlemini ifade eder.</p>
<p>Buna karşılık RNL gösterimi ise işlemin tersini ifade etmektedir ve toplama örneği için doğru olmakla birlikte, çıkarma (-) işleminde LNR ve RNL sırası fark etmektedir.</p>
<p>Şimdi örnek olarak aldığımız ilk ağaca dönelim ve 6 farklı dolaşmaya göre sayıları listeleyelim:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122910_0958_OrderTheory41.png" alt="" /></p>
<ol>
<li>NLR : 10 7 3 9 15 13 18</li>
<li>NRL : 10 15 18 13 7 9 3</li>
<li>LNR : 3 7 9 10 13 15 18</li>
<li>RNL : 18 15 13 10 9 7 3</li>
<li>LRN : 3 9 7 13 18 15 10</li>
<li>RLN : 18 13 15 9 3 7 10</li>
</ol>
<p>Yukarıdaki ağaç dolaşma algoritmalarından, 1. Ve 2. Sırada olanları (ikisi de öntertiptir (preorder)) literatürde, önce düğüme sonra altındaki düğümlere baktığı için <a href="http://www.bilgisayarkavramlari.com/2008/11/13/sig-oncelikli-arama-breadth-first-search/">sığ öncelikli dolaşma / arama (breadth first search)</a> olarak isimlendirilir.</p>
<p>Buna karşılık diğer 4 dolaşma sıralaması, önce derindeki bir düğüme sonra ataya baktığı için <a href="http://www.bilgisayarkavramlari.com/2008/11/13/derin-oncelikli-arama-depth-first-search/">derin öncelikli (depth first search)</a> olarak geçer.</p>
<p>Yine yukarıdaki sıralamalarda dikkat edilecek bir huşu, LNR gösteriminin, ağacı küçükten büyüğe, RNL gösteriminin ise ağacı büyükten küçüğe sıraladığıdır. Bu özellik, ağaç sıralaması (tree sort) olarak geçen sıralama algoritmasının temelini oluşturur.</p>
<p><strong>İşlem Tertiplerinin Dönüşümü<br />
</strong></p>
<p>Örneğin elimizde içtertip (infix) bir işlem bulunsun ve biz bu tertibi örneğin son tertip (postfix) olarak çevirmek isteyelim:</p>
<p>(3 + 5) + (7 + 8 )</p>
<p>Öncelikle yukarıdaki işlemin <a href="http://www.bilgisayarkavramlari.com/2008/12/09/parcalama-agaci-parse-tree/">parçalama ağacını (parse tree)</a> oluşturuyoruz.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122910_0958_OrderTheory51.png" alt="" /></p>
<p>Yukarıdaki ağaçta, işlem önceliğine göre parçalama yapılmıştır. Örneğin 3 ve 5 sayılarını birleştiren işlem + işlemidir. Benzer şekilde 7 ve 8 sayıları diğer bir toplama işlemi ile birleştirilmiş ve neticede (kökte) her iki işlem toplanmıştır.</p>
<p>Şimdi bu ağacı öğrendiğimiz ön tertip yöntemine göre dolaşalım:</p>
<p>NLR : + + 3 5 + 7 8</p>
<p>Yukarıdaki gösterim, verilen işlemin  son tertibe çevrilmiş halidir. Benzer durum son tertip için de geçerlidir:</p>
<p>LRN : 3 5 + 7  8 + +</p>
<p>Şayet örneğimiz aşağıdaki şekilde olsaydı:</p>
<p>3 + 5 + 7 + 8</p>
<p>Bu durumda parçalama ağacında bir belirsizlik oluşacaktı (ambiguity).</p>
<p>Örneğin, yukarıdaki bu yeni işlem, yukarıdaki parçalama ağacı gibi parçalanabilirken aynı zamanda aşağıdaki ağaçlardan birisi olarak da parçalabilir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122910_0958_OrderTheory61.png" alt="" /></p>
<p>Veya</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122910_0958_OrderTheory71.png" alt="" /></p>
<p>Yukarıdaki her iki gösterim de aslında matematiksel olarak işlemden çıkarılabilecek sonuçlardır.</p>
<p>Örneğin yukarıdaki işlemi şu 3 farklı şekilde parantezlere almak (veya 3 farklı sırada çözmek mümkündür)</p>
<p>(3+5)+(7+8)</p>
<p>3+(5+(7+8))</p>
<p>((3+5)+7)+8</p>
<p>Bu üç yaklaşımda doğrudur. Bu durumda, işlemin ön tertip çevirimi 3 farklı şekilde olabilecektir ve 3ü de doğrudur:</p>
<p>(3+5)+(7+8) <span style="font-family: Wingdings;">→</span> + + 3 5 + 7 8</p>
<p>3+(5+(7+8)) → + + + 7 8 5 3</p>
<p>((3+5)+7)+8 → + + + 3 5 7 8</p>
<p>Benzer durum son tertip için de geçerlidir:</p>
<p>(3+5)+(7+8) → 3 5 + 7 8 + +</p>
<p>3+(5+(7+8)) → 3 5 7 8 +  + +</p>
<p>((3+5)+7)+8 → 8 7 3 5 + + +</p>
<p>Yukarıdaki bu dönüşümlerden görüleceği üzere artık belirsizlik durumu kalkmıştır. Yani dönüşümlerden herhangi birisinin tercih edilmesi halinde iç tertip durumundaki belirsizlik kaybedilir. Bu anlamda tam bir dönüşüm olduğunu söylemek mümkün olmaz.</p>

<p class="sayac_bilgi">290 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/12/29/order-theory-sira-teorisi-nazariyatul-tertib/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bellman Ford Algoritması</title>
		<link>http://www.bilgisayarkavramlari.com/2010/05/26/bellman-ford-algoritmasi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/05/26/bellman-ford-algoritmasi/#comments</comments>
		<pubDate>Wed, 26 May 2010 19:32:54 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[graf teorisi (graph theory, çizge kuramı)]]></category>
		<category><![CDATA[veri yapıları]]></category>
		<category><![CDATA[bellman ford]]></category>
		<category><![CDATA[dijkstra]]></category>
		<category><![CDATA[En kısa yol]]></category>
		<category><![CDATA[shortest path]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/05/26/bellman-ford-algoritmasi/</guid>
		<description><![CDATA[UAYRI!: Bu yazıda hatalar bulunmaktadır (Uğur Bey&#8217;e teşekkürler). Bu yazıda anlatılan algoritma verilen örnekteki özel olarak sıralanmış kenarlar için doğru çalışmakta ancak farklı durumlarda hata yapabilmektedir. Bellman-Ford algoritmasının tam ve doğru anlatımı için http://www.bilgisayarkavramlari.com/2010/08/05/bellman-ford-algoritmasi-2/ adresindeki yazıyı okuyabilirsiniz. Yazan : Şadi Evren ŞEKER Bu algoritmanın amacı, bir şekil (graph) üzerindeki, bir kaynaktan (source) bir hedefe(target veya [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ff0000;"><strong>UAYRI!: Bu yazıda hatalar bulunmaktadır (Uğur Bey&#8217;e teşekkürler). Bu yazıda anlatılan algoritma verilen örnekteki özel olarak sıralanmış kenarlar için doğru çalışmakta ancak farklı durumlarda hata yapabilmektedir. Bellman-Ford algoritmasının tam ve doğru anlatımı için <a href="http://www.bilgisayarkavramlari.com/2010/08/05/bellman-ford-algoritmasi-2/">http://www.bilgisayarkavramlari.com/2010/08/05/bellman-ford-algoritmasi-2/</a> adresindeki yazıyı okuyabilirsiniz.</strong></span></p>
<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bu algoritmanın amacı, bir <a href="http://www.bilgisayarkavramlari.com/2008/08/01/graf-sekil-graph/">şekil (graph)</a> üzerindeki, bir kaynaktan (source) bir hedefe(target veya sink) giden en kısa yolu bulmaktır. Algoritma ağırlıklı şekiller (weighted graph) üzerinde çalışır ve bir anlamda <a href="http://www.bilgisayarkavramlari.com/2010/05/13/dijkstra-algoritmasi-2/">Dijkstra algoritmasının</a> iyileştirilmişi olarak düşünülebilir.</p>
<p>Algoritma aslında <a href="http://www.bilgisayarkavramlari.com/2010/05/13/dijkstra-algoritmasi-2/">Dijkstra algoritmasından</a> daha kötü bir performansa sahiptir ancak graftaki ağırlıkların eksi olması durumunda <a href="http://www.bilgisayarkavramlari.com/2010/05/13/dijkstra-algoritmasi-2/">Dijkstra&#8217;nın</a> tersine başarılı çalışır.</p>
<p>Algoritma Dijkstra algoritmasında olduğu gibi en küçük değere sahip olan kenardan gitmek yerine bütün graf üzerindeki kenarları test eder. Bu sayede <a href="http://www.bilgisayarkavramlari.com/2008/03/24/acgozlu-yaklasimi-greedy-approach/">aç gözlü yaklaşımının (greedy approach)</a> handikabına düşmez ve her düğüme sadece bir kere bakarak en kısa yolu bulmuş olur.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052610_1932_BellmanFord1.png" alt="" /></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/plugins/flash-video-player/default_video_player.gif" /></p>
<p>Algoritmanın çalışmasını yukarıdaki gibi eksi değerlere sahip bir şekil üzerinden anlamaya çalışalım.</p>
<p>Öncelikle düğümlere değer ataması yapılıyor. Başlangıç düğümüne 0, doğrudan erişilen düğümlere erişim değerleri ve erişilemeyen düğümlere <span style="font-family: Symbol;">¥</span> sonsuz değeri atanıyor.  Hedef düğüm olarak da E düğümünü tanımlayalım.</p>
<p>Yukarıdaki örnekte A düğümünden başlayacağımız düşünelim:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052610_1932_BellmanFord3.png" alt="" /></p>
<p>Şimdi şekilde kenarları sıralayalım:</p>
<p>AB 2</p>
<p>AC 1</p>
<p>BE -2</p>
<p>BF 5</p>
<p>CF 2</p>
<p>CD -1</p>
<p>DF 5</p>
<p>DE 7</p>
<p>Bellman ford algoritması işte bu kenarları teker teker dolaşması itibariyle dijkstradan ayrılır. Sırayla yukarıdaki kenarları (Edges) dolaşır ve graftaki değerleri günceller.</p>
<p>Yukarıda, rastgele sıra ile dizilen bu kenarları sırasıyla dolaşalım ve bu dolaşma sırasında şu işlemi yapalım.</p>
<p>Örneğin AB kenarı , A ve B düğümleri arasında. Bu düğümlerden düşük değere sahip olan düğüm üzerine kenar değeri eklenip yüksek değere sahip olan düğüm üzerine yazılıyor.</p>
<p>Sırayla gidecek olursak:</p>
<p>AB 2, min(A,B) = 0 <span style="font-family: Wingdings;">à</span> 0+ 2 = 2</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052610_1932_BellmanFord5.png" alt="" /></p>
<p>AC 1, min(A,C) = 0 =&gt; 0+1 = 1</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052610_1932_BellmanFord7.png" alt="" /></p>
<p>BE 2, min (B,E ) 2, =&gt; 2 + 2  = 4</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052610_1932_BellmanFord9.png" alt="" /></p>
<p>BF 5, min(B,F) = 2 =&gt; 2+5 = 7</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052610_1932_BellmanFord11.png" alt="" /></p>
<p>CF 2, min (C,F) = 1 =&gt; 1+2 = 3, bu değer 7&#8242;den küçük olduğu için güncelliyoruz:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052610_1932_BellmanFord13.png" alt="" /></p>
<p>CD -1, min(C,D) = 1=&gt; 1+(-1) = 0</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052610_1932_BellmanFord15.png" alt="" /></p>
<p>DF 5, min (D,F) = 0 =&gt; 0+5 = 5 F&#8217;nin değerinden daha büyük o yüzden güncellemiyoruz.</p>
<p>DE 7, min(D,E) = 0 =&gt; 0+7 = 7, yine E&#8217;nin değerinden büyük olduğu için güncellenmiyor.</p>
<p>Sonuçta graf aşağıdaki şekilde bitmiştir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052610_1932_BellmanFord17.png" alt="" /></p>
<p>Bu graftaki bütün düğümlerde, A düğümünden ne kadar maliyetle gidildiği bulunmuştur. Örnek hedef E düğümü ise, ulaşım maliyeti 4&#8242;dür.</p>
<p>Görüldüğü üzere eksi değere sahip düğümler olmasına rağmen herhangi bir problem yaşanmamıştır.</p>

<p class="sayac_bilgi">1,813 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/05/26/bellman-ford-algoritmasi/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Edmonds Karp Algoritması</title>
		<link>http://www.bilgisayarkavramlari.com/2010/05/22/edmonds-karp-algoritmasi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/05/22/edmonds-karp-algoritmasi/#comments</comments>
		<pubDate>Sat, 22 May 2010 08:54:02 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[graf teorisi (graph theory, çizge kuramı)]]></category>
		<category><![CDATA[veri yapıları]]></category>
		<category><![CDATA[edmonds karp]]></category>
		<category><![CDATA[graph]]></category>
		<category><![CDATA[maximum flow]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/05/22/edmonds-karp-algoritmasi/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu algoritmanın amacı, literatürde azami akış ( maximum flow ) olarak geçen ve düğümler (nodes) arasında akış kapasiteleri belirli bir şekildeki (graph) bir başlangıçtan bir hedefe en fazla akışın sağlandığı problemleri çözmektir. Azami akış (maximum flow) problemini örneğin şehirler arasında bağlı boru hattına veya tedarik zincirine benzetebiliriz. Örneğin aşağıdaki şekli [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bu algoritmanın amacı, literatürde azami akış ( maximum flow ) olarak geçen ve düğümler (nodes) arasında akış kapasiteleri belirli bir <a href="http://www.bilgisayarkavramlari.com/2008/08/01/graf-sekil-graph/">şekildeki (graph)</a> bir başlangıçtan bir hedefe en fazla akışın sağlandığı problemleri çözmektir.</p>
<p>Azami akış (maximum flow) problemini örneğin şehirler arasında bağlı boru hattına veya tedarik zincirine benzetebiliriz. Örneğin aşağıdaki şekli ele alalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0854_EdmondsKarp1.png" alt="" /></p>
<p>Buradaki düğümler, şehirleri ve düğümler arasındaki kenarlar (edges) ise şehirler arasındaki boru hatlarının kapasitesini belirtsin. Amacımız A düğümünden E düğüme azami miktarda akış sağlayabilmek olsun.</p>
<p>Ford-Fulkerson çözüm için yukarıdaki şekilde öncelikle hedef düğüme giden yolu bulur.  Algoritma bu arama işlemi sırasında şayet derin öncelikli arama (depth first search ,DFS) kullanıyorsa ford fulkerson olarak isimlendirilir. Şayet aynı algoritma bu arama işlemi sırasında <a href="http://www.bilgisayarkavramlari.com/2010/05/22/sekillerde-sig-oncelikli-arama/">sığ öncelikli arama (breadth first search, BFS)</a> kullanırsa bu durumda da edmonds karp algoritması olarak isimlendirilir.</p>
<p>Biz yazımızın konusu olan Edmonds Karp algoritmasını anlamak için sığ öncelikli olarak arama işlemini gerçekleştirelim:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0854_EdmondsKarp3.png" alt="" /></p>
<p>BFS (sığ öncelikli arama) sonucunda bulunan yollarımız aşağıda listelenmiş olsun:</p>
<ul>
<li>A-D-E</li>
<li>A-B-E</li>
<li>A-C-D-E</li>
<li>A-C-F-B-E</li>
<li>A-C-F-D-E</li>
<li>A-B-F-D-E</li>
</ul>
<p>İlk bulacağımız yol (path) A-D-E olsun bu durumda algoritma bu yol üzerindeki en küçük kapasiteyi bulmaya çalışır:</p>
<p>min(A-D,D-E) = min(5,7) = 5</p>
<p>bu bulunan sayı aslında bu yol üzerinden akabilecek maksimum değerdir. Dolayısıyla bu yoldan 5 kapasitesinde akış yapılmasına karar verilir ve şekil üzerinde bu durum işaretlenir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0854_EdmondsKarp5.png" alt="" /></p>
<p>Yukarıdaki şekilde buluna kırmızı sayılar, o yoldaki anlık akış miktarlarıdır.</p>
<p>Ardından  derin öncelikli arama işlemi devam eder ve örneğin A-B-E yolunu bulur.</p>
<p>min(A-B, B-E) = min(4,2) = 2</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0854_EdmondsKarp7.png" alt="" /></p>
<p>Bir sonraki yolumuz olan A-C-D-E yolunu hesaplayalım.</p>
<p>min(A-C,C-D,D-E) = min(1,1,2) = 1</p>
<p>Yukarıda dikkat edilecek bir nokta, D-E aralığının şeklin ilk halinde olan 7 olarak alınması yerine 2 olarak alınmasıdır. Bunun sebebi şeklin bu kenarındaki 5 miktarındaki kapasitenin şu anda kullanılıyor olması ve artık geriye 2 miktarında kapasite kalmasıdır.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0854_EdmondsKarp9.png" alt="" /></p>
<p>Bu adımsan sonra BFS algoritmamız ile bulduğumuz aşağıdaki yolları atlamamız gerekecektir:</p>
<ul>
<li>A-C-F-B-E</li>
<li>A-C-F-D-E</li>
</ul>
<p>Bunun sebebi bu yollarda bulunan A-C aralığının artık 0 kapasitesinin kalmış olması ve bu yollardan daha fazla akış elde edilememesidir.</p>
<p>Son olarak BFS algoritmamızın bulduğu A-B-F-D-E yolunu hesaplayalım:</p>
<p>min (A-B,B-F,F-D,D-E) = min ( 2,5,5,1) = 1</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0854_EdmondsKarp11.png" alt="" /></p>
<p>Yukarıdaki şekilde bütün düğümler arasındaki akışlar gösterilmiştir. Gerçekten de graftaki E düğümüne (hedef düğüme) gidebilen yollar maksimum kapasite ile doldurulmuştur.</p>

<p class="sayac_bilgi">338 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/05/22/edmonds-karp-algoritmasi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ford Fulkerson Algoritması</title>
		<link>http://www.bilgisayarkavramlari.com/2010/05/22/ford-fulkerson-algoritmasi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/05/22/ford-fulkerson-algoritmasi/#comments</comments>
		<pubDate>Sat, 22 May 2010 08:44:23 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[graf teorisi (graph theory, çizge kuramı)]]></category>
		<category><![CDATA[veri yapıları]]></category>
		<category><![CDATA[dfs]]></category>
		<category><![CDATA[graph]]></category>
		<category><![CDATA[maximum flow]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/05/22/ford-fulkerson-algoritmasi/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu algoritmanın amacı, literatürde azami akış ( maximum flow ) olarak geçen ve düğümler (nodes) arasında akış kapasiteleri belirli bir şekildeki (graph) bir başlangıçtan bir hedefe en fazla akışın sağlandığı problemleri çözmektir. Azami akış (maximum flow) problemini örneğin şehirler arasında bağlı boru hattına veya tedarik zincirine benzetebiliriz. Örneğin aşağıdaki şekli [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bu algoritmanın amacı, literatürde azami akış ( maximum flow ) olarak geçen ve düğümler (nodes) arasında akış kapasiteleri belirli bir <a href="http://www.bilgisayarkavramlari.com/2008/08/01/graf-sekil-graph/">şekildeki (graph)</a> bir başlangıçtan bir hedefe en fazla akışın sağlandığı problemleri çözmektir.</p>
<p>Azami akış (maximum flow) problemini örneğin şehirler arasında bağlı boru hattına veya tedarik zincirine benzetebiliriz. Örneğin aşağıdaki şekli ele alalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0844_FordFulkers1.png" alt="" /></p>
<p>Buradaki düğümler, şehirleri ve düğümler arasındaki kenarlar (edges) ise şehirler arasındaki boru hatlarının kapasitesini belirtsin. Amacımız A düğümünden E düğüme azami miktarda akış sağlayabilmek olsun.</p>
<p>Ford-Fulkerson çözüm için yukarıdaki şekilde öncelikle hedef düğüme giden yolu bulur.  Algoritma bu arama işlemi sırasında şayet derin öncelikli arama (depth first search ,DFS) kullanıyorsa ford fulkerson olarak isimlendirilir. Şayet aynı algoritma bu arama işlemi sırasında <a href="http://www.bilgisayarkavramlari.com/2010/05/22/sekillerde-sig-oncelikli-arama/">sığ öncelikli arama (breadth first search, BFS)</a> kullanırsa bu durumda da edmonds karp algoritması olarak isimlendirilir.</p>
<p>Biz yazımızın konusu olan ford fulkerson algoritmasını anlamak için derin öncelikli olarak arama işlemini gerçekleştirelim:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0844_FordFulkers3.png" alt="" /></p>
<p>İlk bulacağımız yol (path) A-D-E olsun bu durumda algoritma bu yol üzerindeki en küçük kapasiteyi bulmaya çalışır:</p>
<p>min(A-D,D-E) = min(5,7) = 5</p>
<p>bu bulunan sayı aslında bu yol üzerinden akabilecek maksimum değerdir. Dolayısıyla bu yoldan 5 kapasitesinde akış yapılmasına karar verilir ve şekil üzerinde bu durum işaretlenir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0844_FordFulkers5.png" alt="" /></p>
<p>Yukarıdaki şekilde buluna kırmızı sayılar, o yoldaki anlık akış miktarlarıdır.</p>
<p>Ardından  derin öncelikli arama işlemi devam eder ve örneğin A-C-D-E yolunu bulur.</p>
<p>min(A-C,C-D,D-E) = min(1,1,2) = 1</p>
<p>Yukarıda dikkat edilecek bir nokta, D-E aralığının şeklin ilk halinde olan 7 olarak alınması yerine 2 olarak alınmasıdır. Bunun sebebi şeklin bu kenarındaki 5 miktarındaki kapasitenin şu anda kullanılıyor olması ve artık geriye 2 miktarında kapasite kalmasıdır.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0844_FordFulkers7.png" alt="" /></p>
<p>Bir sonraki derin öncelikli arama yolumuz A-C-F-D-E olsun. Bu durumda yol üzerindeki kapasite hesabı aşağıdaki şekilde olacaktır:</p>
<p>min(A-C,C-F,F-D,D-E) = min (0,2,5,7) =0</p>
<p>Görüldüğü üzere bu yol artık kullanılamaz çünkü bu yoldaki kapasite 0&#8242;dır. Bunun sebebi bir önceki adımda bulunan yolun, A-C arasındaki kapasiteyi sonuna kadar kullanmış olmasıdır.</p>
<p>Sıradaki yolumuz A-B-F-D olsun:</p>
<p>min(A-B,B-F,F-D) = min( 4,5,5,1) = 1</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0844_FordFulkers9.png" alt="" /></p>
<p>Son olarak yolumuz A-B-E olarak verilsin :</p>
<p>min(A-B,B-E) = min (3,2) = 2</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0844_FordFulkers11.png" alt="" /></p>
<p>Yukarıdaki şekilde bütün düğümler arasındaki akışlar gösterilmiştir. Gerçekten de graftaki E düğümüne (hedef düğüme) gidebilen yollar maksimum kapasite ile doldurulmuştur.</p>

<p class="sayac_bilgi">704 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/05/22/ford-fulkerson-algoritmasi/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Şekillerde Sığ Öncelikli Arama</title>
		<link>http://www.bilgisayarkavramlari.com/2010/05/22/sekillerde-sig-oncelikli-arama/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/05/22/sekillerde-sig-oncelikli-arama/#comments</comments>
		<pubDate>Sat, 22 May 2010 07:33:13 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[graf teorisi (graph theory, çizge kuramı)]]></category>
		<category><![CDATA[veri yapıları]]></category>
		<category><![CDATA[şekil]]></category>
		<category><![CDATA[bfs]]></category>
		<category><![CDATA[breadth first search]]></category>
		<category><![CDATA[graph]]></category>
		<category><![CDATA[sığ öncelikli arama]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/05/22/sekillerde-sig-oncelikli-arama/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı genel amaçlı şekillerde (graphs) sığ öncelikli aramayı (breadth first search , BFS) açıklamaktır. Bu yazı, ağaçlardaki sığ öncelikli arama ile karıştırılmamalıdır. Ağaçlar (trees) bilindiği üzere yönlü dairesel olmayan şekillerdir (directed acyclic graph) dolayısıyla ağaçlar üzerinde bu yazıda anlatılan sıra (queue) yapısına ihtiyaç duyulmaz. Sığ öncelikli arama bir [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bu yazının amacı genel amaçlı <a href="http://www.bilgisayarkavramlari.com/2008/08/01/graf-sekil-graph/">şekillerde (graphs)</a> sığ öncelikli aramayı (breadth first search , BFS) açıklamaktır.</p>
<p>Bu yazı, <a href="http://www.bilgisayarkavramlari.com/2008/11/13/sig-oncelikli-arama-breadth-first-search/">ağaçlardaki sığ öncelikli arama</a> ile karıştırılmamalıdır<a href="http://www.bilgisayarkavramlari.com/2008/05/07/agaclar-tree/">. Ağaçlar (trees)</a> bilindiği üzere yönlü dairesel olmayan şekillerdir (directed acyclic graph) dolayısıyla ağaçlar üzerinde bu yazıda anlatılan <a href="http://www.bilgisayarkavramlari.com/2008/04/16/sira-queue/">sıra (queue)</a> yapısına ihtiyaç duyulmaz.</p>
<p>Sığ öncelikli arama bir başlangıç düğümünden başlayarak sıradaki komşuları dolaşan arama algoritmasıdır. Bu arama algoritmasında amaç önce başlangıç düğümüne yakın düğümlere bakmaktır.</p>
<p>Bu arama şekli suya atılan bir damlanın suda çıkardığı halkalara benzetilebilir. Başlangıç düğümüne en yakın halka sonra ikinci yakın halka ve sonra diğerleri şeklinde giden bir arama algoritmasıdır.</p>
<p>Bu durumu aşağıdaki örnek üzerinden anlamaya çalışalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0733_ekillerdeS1.png" alt="" /></p>
<p>Örnek olarak yukarıda bulunan şekli ele alalım. Örneğimizde başlangıç <a href="http://www.bilgisayarkavramlari.com/2008/08/01/dugum-node/">düğümü (node)</a> olarak A düğümünü seçtiğimizi ve aranan düğümün E düğümü olduğunu düşünelim .</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0733_ekillerdeS3.png" alt="" /></p>
<p>A düğümünün <a href="http://www.bilgisayarkavramlari.com/2008/11/13/komsuluk-listesi-adjacency-list/">komşuluk listesini (adjacency list)</a> çıkarıyoruz:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0733_ekillerdeS5.png" alt="" /></p>
<p>komşu(A) = {C,B}</p>
<p>Bu komşulara sırasıyla bakılıyor ve bu komşuların komşuluk listeleri çıkarılıyor:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0733_ekillerdeS7.png" alt="" /></p>
<p>bakılanlar: {A,B,C}</p>
<p>komşular = komşu (B) , komşu (C) = {D,F,E}</p>
<p>Arana düğüm E, bu adımda bulunmuştur.</p>
<p>Yukarıdaki örnekte görüldüğü üzere bir sonraki derinliğe inilmeden önce, o derinlikte olan (başlangıç düğümüne o uzaklıkta olan) bütün düğümler dolaşılıyor ve ardından bir alt seviyeye iniliyor.</p>
<p>Yukarıdaki örnekte bütün ağaç dolaşılmış gibi düşünülebilir. Örneğin şekil (graph) aşağıdaki gibi olsaydı:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0733_ekillerdeS9.png" alt="" /></p>
<p>Bu durumda Z düğümüne hiçbir zaman bakılmayacaktı çünkü aranan düğüm, Z düğümünden daha sığ bir derinlikte olacaktı.</p>
<p>Kısacası BFS arama algoritması ile aranan düğümün derinliğine kadar olan bütün düğümlere bakılır ancak bu derinlikten daha aşağıda olan düğümlere bakılmasına gerek yoktur.</p>

<p class="sayac_bilgi">438 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/05/22/sekillerde-sig-oncelikli-arama/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dijkstra Algoritması</title>
		<link>http://www.bilgisayarkavramlari.com/2010/05/13/dijkstra-algoritmasi-2/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/05/13/dijkstra-algoritmasi-2/#comments</comments>
		<pubDate>Thu, 13 May 2010 20:17:01 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[graf teorisi (graph theory, çizge kuramı)]]></category>
		<category><![CDATA[veri yapıları]]></category>
		<category><![CDATA[dijkstra]]></category>
		<category><![CDATA[En kısa yol]]></category>
		<category><![CDATA[graph]]></category>
		<category><![CDATA[shortest path]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/05/13/dijkstra-algoritmasi-2/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinde kullanılan ve algoritmayı literatüre kazandıran kişinin ismini taşıyan dijkstra algoritması, verilen bir şekilde (graph) en kısa yolu (shortest path) bulmak için kullanılır. Bu algoritmanın çalışmasını örnek bir şekil( graph ) üzerinden göstermeye çalışalım. Bu gösterimin ardından Dijkstra algoritmasının başarısını ve zafiyetlerini tartışabiliriz. Örnek olarak yukarıda bulunan şekli ele [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bilgisayar bilimlerinde kullanılan ve algoritmayı literatüre kazandıran kişinin ismini taşıyan dijkstra algoritması, verilen bir <a href="http://www.bilgisayarkavramlari.com/2008/08/01/graf-sekil-graph/">şekilde (graph)</a> en kısa yolu (shortest path) bulmak için kullanılır.</p>
<p>Bu algoritmanın çalışmasını örnek bir şekil( graph ) üzerinden göstermeye çalışalım. Bu gösterimin ardından Dijkstra algoritmasının başarısını ve zafiyetlerini tartışabiliriz.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg1.png" alt="" /> <img src="http://www.bilgisayarkavramlari.com/wp-content/plugins/flash-video-player/default_video_player.gif" /></p>
<p>Örnek olarak yukarıda bulunan şekli ele alalım. Dijkstra algoritması herhangi bir şekildeki bir düğümden diğer bütün düğümlere giden en kısa yolu hesaplar.</p>
<p>Örneğimizde başlangıç <a href="http://www.bilgisayarkavramlari.com/2008/08/01/dugum-node/">düğümü (node)</a> olarak A düğümünü seçtiğimizi düşünelim ve algoritmanın çalışmasını bu düğümden başlayarak gösterelim.</p>
<p>Algoritma başlangıçta bütün düğümlere henüz erişim olmadığını kabul ederek sonsuz (<span style="font-family: Symbol;">¥</span> ) değeri atar. Yani başlangıç durumunda henüz hiçbir düğüme gidemiyoruz.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg3.png" alt="" /></p>
<p>Ardından başlangıç düğümünün komşusu olan bütün düğümleri dolaşarak bu düğümlere ulaşım mesafesini günceller.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg5.png" alt="" /></p>
<p>Bu güncelleme işleminden sonra güncellenen düğümlerin komşularını günceller ve bütün düğümler güncellenene ve şekil üzerinde yeni bir güncelleme olmayana kadar bu işlem devam eder.</p>
<p>Örneğin yukarıda A düğümünün komşusu olan düğümler (B ve C) güncellendiler. Bir sonraki adımda bu düğümlerin komşuları güncellenecektir. İstediğimiz bir düğüm ile başlayalım. Örneğin önce B sonra C düğümünün komşularını güncelleyelim:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg7.png" alt="" /></p>
<p>Yukarıdaki şekilde, B düğümünün komşusu olan E ve F düğümleri güncellenmiştir. Bu güncelleme işlemi sırasında B düğümünün üzerindeki mevcut maliyet ile E ve F düğümlerine gidişten doğan maliyet toplanmıştır.</p>
<p>Örneğin E düğümü için 2 + 5 = 7 ve F düğümü için 2 + 2 = 4 değerleri bulunmuştur.</p>
<p>Şimdi bir sonraki düğüm olan C düğümünden güncelleme yapalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg9.png" alt="" /></p>
<p>Bu aşamada güncellenen düğümler, C düğümünün komşusu olan D ve F düğümleridir. Bu düğümlerden, F düğümü daha önce güncellenmişti ve değer olarak 7 taşımaktaydı, ancak yeni gelen değer, F için C üzerinden 1 + 2 = 3 olarak hesaplanmış ve bu değer daha önceden hesaplanan 7 değerinden düşük olduğu için 7&#8242;nin üzerine yazılarak 3 olmuştur.</p>
<p>Algoritmanın çalışmasını sonraki düğümlerin güncellenmesi ile sürdürelim. Bu sefer örneğin D düğümünün komşularını güncelleyelim ( şu anda D, F ve E düğümleri aynı derecede yeni güncellenmiştir bunlardan herhangi birisi ile başlanması Dijkstra algoritmasına uygundur. Ancak <a href="http://www.bilgisayarkavramlari.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/">recursive (özyineli)</a> bir kodlama yapılıyorsa koda göre elbette yakın olan komşular güncellenecektir)</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg11.png" alt="" /></p>
<p>D düğümünün hiçbir komşusu güncellenmemiştir bunun sebebi hesaplanan değerlerin mevcut değerlerden yüksek olması ve dolayısıyla daha iyi bir sonuç bulunamamasıdır.</p>
<p>F için 2 + 5 = 7 &gt; 3</p>
<p>E için 2 + 7 = 9 &gt; 4</p>
<p>Dolayısıyla bir sonraki düğümü seçerek devam ediyoruz</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg13.png" alt="" /></p>
<p>F düğümünün komşularında da bir değişiklik olmuyor ve son olarak E düğümü deneniyor:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg15.png" alt="" /></p>
<p>Son halimizde de bir değişiklik olmayarak şeklimiz (graph) kararlı bir halde ( daha fazla değişiklik olmadığı için) dolaşılmış ve bitmiş oluyor.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg17.png" alt="" /></p>
<p>Yukarıdaki bu grafta, düğümler üzerinde yazılı olan değerler, A düğümünden başlanarak her düğüme gidilebilen en kısa yol mesafesini vermektedir. Örneğin şekildeki F düğümüne ulaşma maliyeti 3 olarak hesaplanmıştır ve Dijkstra algoritması, A düğümünden F düğümüne daha kısa bir yol bulunamayacağını iddia eder ( eşit farklı yollar bulunabilir ama en kısa yol yine de 3 olur)</p>
<p><strong>Dijkstra algoritmasının zayıf yönü<br />
</strong></p>
<p>Algoritma ne yazık ki eksi (-) değer taşıyan bir kenar bulunması halinde başarılı çalışmaz. Bunun sebebi eksi (-) değerdeki kenarın sürekli olarak mevcut durumdan daha iyi bir sonuç üretmesi ve algoritmanın hiçbir zaman için kararlı hale gelememesidir.</p>
<p>Örneğin aşağıdaki basit şekli ele alalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg19.png" alt="" /></p>
<p>Yukarıdaki bu şekilde B-C kenarı (edge) -2 değerinde verilmiştir. Bu durumda A düğümünden başlayarak en kısa yolları hesaplamak istersek, öncelikli olarak A düğümünden komşusu olan düğümlere güncelleme yapılacaktır:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg21.png" alt="" /></p>
<p>Ardından bu düğümlerin komşuları güncellenecektir. İki düğümde birbirine -2 değerini ekleyerek daha kısa bir yol bulacak ve birbirlerini güncelleyerek daha kısa sonuçlara ulaşacaktır.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg23.png" alt="" /></p>
<p>Bu işlem ne yazık ki sonsuza kadar giden bir sürecin başlangıcıdır ve hiçbir zaman daha iyi bir sonuç bulma işlemi bitmez.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg25.png" alt="" /></p>
<p>Sürekli olarak mevcut durumdan daha iyi bir durum bulunacak ve daha küçük değerler güncellenecektir. Bu yüzden Dijkstra algoritması, eksi (-) değer taşıyan şekillerde (graph) başarılı çalışmaz.</p>

<p class="sayac_bilgi">4,309 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/05/13/dijkstra-algoritmasi-2/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
<enclosure url="http://www.bilgisayarkavramlari.com/wp-content/uploads/dijkstra.flv" length="8117170" type="video/x-flv" />
<enclosure url="http://www.bilgisayarkavramlari.com/wp-content/uploads/dijkstra.flv" length="8117170" type="video/x-flv" />
		</item>
	</channel>
</rss>

