Bilgisayar Bilimleri -14- Problem Çözme

Bütün bilgisayar programlarının algoritmalar üzerine bina edildiğinden bahsetmiştik. Bu algoritmalar ise belli bir problemi çözmeye yönelik tasarlanmaktadır. Biz bir programı yazacağımız zaman öncelikle karşımıza bir problem çıkmaktadır. Bizim bu probleme getirebileceğimiz çözüm algoritmalara aktarılmakta , sonra programlama dillerine çevrilmekte ve en sonunda ise bilgisayarın anladığı makine kodu haline gelerek program halini almaktadır. Biz probleme doğru bir çözüm getiremezsek bütün bu süreç yanlış bir şekilde işleyecek ve bilgisayar problemi çözemeyecektir. Bilgisayarın çözebileceği problemler bizim günlük hayatta karşılaştığımız problemlerin tamamı değildir. En azından pek çok problemi bilgisayar doğrudan çözemez. Bilgisayların tamamen aptal bir makine olduğundan ve çalışması için bizim talimatlarımıza ihtiyacı olduğundan bahsetmiştik. O halde bizim karşımıza çıkan problemi doğrudan bilgisayara aktarmak ve problemi bizim yerimize çözmesini beklemek mümkün değildir. O halde programcı olarak programları biz yazdığımız gibi problemleri çözecek programlardan önce de problemleri bizim çözmemiz gereklidir.

1945 yılında G. Polya “How to Solve It: A New Aspect of Mathematical Method” adında bir kitap yayımlamıştır. Bu kitap bilgisayarların henüz deneysel olduğu zamanlarda bize nasıl problem çözüleceğini ve problem çözme aşamaları hakkında önemli noktaları vermektedir. Bu kitap matematik problemlerini çözmeye yönelik yazılmasına rağmen programcılıkta uygulanabilir olmasından dolayı bize yol gösterici niteliktedir.

Soru Sormak

Bizim karşımıza bir problem çıktığında öncelikle bu problemi çözümlememiz gereklidir. Eğer sorunu doğru anlayamazsak çözümü de doğru üretemeyiz. Bu yönde doğru soruları sormak bizi çözüme yaklaştıracaktır. Sorun karşısında bazı ayrıntılarda, bazı kelimelerde veya yöntemler konusunda kafamızda belirsizlik olabileceği gibi ikilemde de kalabiliriz. Sormamız gereken sorulardan bazıları şunlar olabilir.

  • Problem hakkında ne biliyorum?
  • Bunu çözmek için işlemem gereken bilgi nedir ?
  • Çözüm nasıl görünmektedir ?
  • Ne tür özel durumlar mevcuttur ?
  • Sorunu çözdüğümü nasıl bileceğim?

Benzer Noktalara Bakmak 

Kimse tekerleği yeniden icat etmek zorunda değildir. Eğer halihazırda bir çözüm mevcutsa onu kullanabilirsiniz. Eğer önceden bir probleme getirdiğiniz çözüm iyi işliyorsa bu çözümü bu probleme uyarlayabilirsiniz. Benzer durumları gözlemlemek ve benzer problemlere getirilen çözümleri saptamak bizim görevimizdir. Biz yumurta almak için de süt almak için de markete gideriz. Markete gitme işi hep aynı olsa da alınan ürün farklıdır. Bu durumda her probleme sıfırdan çözüm getirmek değil farklı noktaları saptamak da gerekebilir. Bu günlük hayatta olduğu gibi bilgisayar programcılığında da böyledir. Örneğin en yüksek ve en düşük sıcaklıkları tespit eden bir program ile en yüksek ve en düşük notları tespit eden program birbirinin aynıdır.  Problemler farklı ve dışarıdan bakıldığında yaptığı iş farklı görünse de bir değer listesindeki en yüksek ve en düşük değerleri ayırmaktan başka bir iş yapmamaktadır.

Böl ve Yönet

Karşımıza büyük bir sorun çıktığında bu sorunu tümüyle ele almak her zaman en zor yöntem olacaktır. Bu sorunu parçalara böldüğümüz zaman her biri bütüne göre daha ufak sorunlar haline gelecektir. Örneğin evin tamamını temizlemek gibi bir sorunla karşı karşıya kaldığımızda önce mutfak, banyo, salon, balkon, camlar, yerler diye işi bölümlere ayırırız ve her birini ayrı ayrı yürütürüz. Eğer bütün işleri problemi bütün olarak alıp birbirine karıştırarak yapmaya kalkarsak sorun yine çözülse de daha zahmetli ve zaman alıcı olacaktır.

Şimdi yazının başında bahsettiğimiz matematikçi Polya’nın “Nasıl Çözülür” listesine bir göz atalım.

  1. Problemi anlamak zorundasınız. 
    Bilinmeyen nedir? Veri nedir? Şart nedir? Şartı karşılamak mümkün mü ? Şart bilinmeyeni belirleyebilir mi ? Ya da yetersiz, gereksiz ve ya çelişkili olanlar nelerdir? Bir şekil çizin. Şartın çeşitli parçalarını ayırın. Bunu yazabiliyor musunuz?
  2. Bir Plan Tasarlamak 
    Veri ile bilinmeyen arasındaki bağlantıyı saptayın. Eğer doğru bir bağlantı saptanamazsa diğer problemleri düşünmek zorundasınız. En sonunda çözümün planını elde etmelisiniz. Daha önce bu problemi veya benzerini gördünüz mü ? Benzer bir problemi biliyor musunuz? Kullanışlı olacak bir kuram biliyor musunuz? Bilinmeyene bakın ve bu aynı bilinmeyene veya benzerine sahip bir problemi düşünün. Benzer birini bulduğunuzda bunu kullanabileceğinize bakın. Bu çözümün sonucu kullanılabilir mi? Bunu kullanmak için dış bir element eklemeniz gerekir mi ? Eğer karşınızdaki problemi çözemediyseniz benzerlerini çözmeye çalışın. Benzer problemlerin ve ana problemin arasındaki farkları gözlemleyin. Problemin bir parçasını çözebildiniz mi? Veriden kullanışlı bir bilgi çıkarabildiniz mi ? Öteki verinin bilinmeyeni bulmada daha uygun olduğunu düşündünüz mü ? Bilinmeyen ile veriyi değiştirebildiniz mi bunlar birbirine yaklaştı mı ? Bütün veriyi kulandınız mı ? Bütün şartı kullandınız mı ? Problemle ilgili gerekli kavramları hesaba kattınız mı ?
  3. Planı Yürütmek
    Çözüm için getirdiğiniz planı yürütürken her adımı takip edin. Her adımın doğru olduğundan emin olun. Bunu kanıtlayabilmeniz gerekir.
  4. Geriye Bakmak 
    Elde edilen çözümü inceleyin. Sonuç ve argümanları denetleyebiliyor musunuz? Farklı sonuçlar elde edebiliyor musunuz? Bir bakışta görebiliyor musunuz? Bu çözümü ya da metodu başka bir problemde kullanabiliyor musunuz?

Yukarıdaki listede ünlü matematikçi ikinci adımda çözüm için bir plan tasarlamamız gerektiğinden bahseder. Programlamada bu çözüm planının algoritmalar olduğunu anlamış olmalısınız. Bunu çözmek için algoritmalar sınırlı veriyi sınırlı zamanda işlemek zorundadır. Programlamada bu problem çözme işlemi üç aşamada gerçekleşir. Algoritma geliştirme aşaması, uygulama aşaması ve test aşaması. 

Algoritma geliştirme aşamasının sonucu çözüm getirecek bir algoritmadır. Uygulama aşamasında bu algoritma programlama diline çevrilir ve program haline gelir. Bakım aşaması dediğimiz test aşaması ise programda saptanan hataları ve eksiklikleri bize çıkış olarak verir. Eğer program düzgünse herhangi bir şey alınmaz. Şimdi bu aşamalardan kısaca bahsedelim.

Algoritma Geliştirme Aşaması

            Çözümle : Problemi anla ve tanımla.

           Algoritma oluştur: Problemi çözecek talimatları sırala.            

           Algoritmayı dene : Algoritma adımlarını takip ederek problemi çözüp çözmediğini gör. 

Uygulama Aşaması 

          Programı yaz : Tasarladığın algoritmayı uygun platformda ve programlama dili ile yaz. 

         Dene : Bilgisayarın komutları doğru işlettiğinden ve girdi ve çıktıların doğru olduğundan emin ol. 

Test Aşaması 

       Kullan : Programı kullan. 

       Onar   : Programdaki eksiklikleri ve hataları gider. 

 

Yukarıdan Aşağıya Tasarım 

Bizim karşımıza bir problem çıktığında ilk önce bu problem parçalara bölünebiliyorsa parçalara bölmeliyiz. Bunu yaparken öncelikle problemi başa yazar ve oklar vasıtasıyla parçalara ayırırız. Buna yukarıdan aşağıya tasarım (top-down design) adı verilmektedir. Şemadan kolaylıkla anlayabileceğimiz bir yöntemdir.

Burada problem olarak bizden bir şekil çizmek isteniyor. Bu şekil için öncelikle problemleri bölümlere ayırmak gerekli. Bu şekli meydana getirmek için bir daire ile bir üçgen çizip bir de kesişen hatları çizeceğiz. Üçgen çizmek ise yine iki ayrı işe ayrılabilir. Öncelikle taban çizilir ve sonrasında kesişen hatlar çizilebilir. Karşımıza çıkan “büyük” problemleri böyle bölmek işimizi kolaylaştırır.

Bizi Facebook grubumuzda takip etmeyi unutmayın. Bilgili ve öğrenmeye hevesli bir topluluk oluşturmak istiyoruz.

https://www.facebook.com/groups/1233336523490761/

Gökhan Dökmetaş

"Arduino Eğitim Kitabı" ve "Arduino ve Raspberry PI ile Nesnelerin İnterneti" kitaplarının yazarı. Başkent Teknoloji ve Dedektör Merkezi'nde Ar-ge Sorumlusu. Araştırmacı-Yazar.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.