RSS

Var Mısın Yok Musun: Bilgisayar Bize Nasıl Para Kazandırabilir?

10 Nov

Bu yazıda bilgisayarda simülasyon yaparak gerçek hayata dair kararlar vermenin basit ve güzel bir örneğini göstereceğim. Günümüzde bilgisayarlar çok hızlandığı için bilgisayar modelleri ve simülasyonları ile günlük yaşantımızdaki olaylara dair ne tür seçimlerde ne kadar kârlı çıkabileceğimizi belirlemek kolayca yapılabilir hale gelmiştir ve yine bu tür modelleri kullanarak pek çok konuya dair bilgi aktarmak / edinmek matematik teoremleri geliştirmeye yahut mevcut matematik teoremlerini birine anlatmaya kıyasla daha kolay olabilmektedir.

O halde başlayalım: Daha önce FM’de epey bir tartıştığımız meşhur Monty Hall problemine, nam-ı diğer ‘Var mısın, yok musun?’ yarışmasının olasılıkla ilişkisine tekrar dönmek istiyorum. Ama bu sefer uzun uzun sözel açıklamalar yahut Bayes teoremi ile matematiksel ispatlar yapmak yerine bu konunun bilgisayarda modelleme ve simülasyon aracılığı ile çok daha kolay anlaşılabileceğini iddia edecek ve bunu göstermeye çalışacağım.

Yarışmanın temel halini ve meseleyi hatırlatalım: 3 kapı var. Birinde 1 milyon YTL ödül var. Yarışmacı olarak nerede ne var bilmiyorsunuz:

Acaba hangi kapıda ödül var?

Acaba hangi kapıda ödül var?

Bir tahminde bulunup kapılardan birini seçiyorsunuz sunucunun açması için:

Bir seçim yaptınız ve mesela bu kapıyı seçtiniz.

Bir seçim yaptınız ve mesela bu kapıyı seçtiniz.

Sunucu, nerede ne olduğu bilgisine sahip olarak, sizin seçtiğiniz kapı dışındaki yani geriye kalan iki kapıdan birini açıyor:

Sunucu geriye kalan iki kapıdan birini açar, açtığı kapıda ödül yoktur!

Sunucu geriye kalan iki kapıdan birini açar, açtığı kapıda ödül yoktur!

Görüyorsunuz ki sunucunun açtığı kapı boş. Bunun üzerine sunucu size soruyor: “Bir kapı seçtin ve ben de bir kapı açtım. Seçtiğin kapıyı değiştirmek ister misin? Yoksa kararında ısrarcı mısın, seçtiğin kapıyı mı açalım?”:

Acaba ödül için baştaki seçimimizden vazgeçmeli miyiz?

Acaba ödül için baştaki seçimimizden vazgeçmeli miyiz?

Kritik soru: Ne yapmalısınız? Başka bir deyişle, hangisinin olasılığı daha yüksektir, en başta seçtiğiniz kapıyı açtırmanız durumunda 1 milyon YTL kazanmanız mı yoksa diğer kapıyı seçip 1 milyon YTL kazanmanız mı? Dikkat: Bu soruya pek çok insan yanlış cevabı vermektedir ve bu kişiler arasında olasılık yahut istatistik ile işi icabı haşır neşir olan bilimciler de mevcuttur. Sezgileriniz yerine matematiğe mi güvenmelisiniz? Yahut bir bilgisayar modeline? 😉 Hem de kolayca kurabileceğiniz bir bilgisayar modeline!

Açmalı mı, açmamalı mı, yoksa hiç düşünmemeli mi? Ama biz düşünmezsek, biz olamayız ki!

Gelin şimdi çok basit ve programcı olmayanların dahi kolayca anlayabileceği kısacık bir bilgisayar kodu ile bu probleme açıklık getirelim.

İki stratejimiz olsun, birinci stratejimiz ne olursa olsun ilk seçtiğimiz kapıda ısrarcı olacağız ve onu açtıracağız. İkinci stratejimize göre ise ne olursa olsun seçtiğimiz kapıdan vazgeçip diğer kapıyı seçecek ve sunucuya onu açtıracağız.

Seçtiğimiz strateji hangisi olursa olsun kapıyı açtıktan sonra kazanacağız ya da kaybedeceğiz. Kazanırsak kazanç ile ilgili değişkenimizi 1 artırırız. Kazanmazsak ise artırmayız. Bu işlemi seçtiğimiz stratejilerden biri için mesela 100 kere yaparsak ve kaç kere kazandığımızı ilgili kazanç değişkenimizde depolarsak ve sonra bunu 100’e bölersek o zaman yüzde kaç olasılık ile söz konusu stratejimizin kazandığını hesaplamış oluruz.

1. stratejiyi çok basit bir Python kod parçası olarak yazalım:


    kapilar = [1, 2, 3]
    odullu_kapi = random.choice(kapilar)
    yarismacinin_secimi = random.choice(kapilar)

    if yarismacinin_secimi == odullu_kapi:
        kazanc = kazanc + 1

2. stratejiyi çok basit bir Python kod parçası olarak yazalım:


    kapilar = [1, 2, 3]
    odullu_kapi = random.choice(kapilar)

    yarismacinin_secimi = random.choice(kapilar)

    if yarismacinin_secimi == odullu_kapi:
        kapilar.remove(odullu_kapi)
        kapilar.remove(random.choice(kapilar))
        yarismacinin_yeni_secimi = kapilar[0]
    else:
        yarismacinin_yeni_secimi = odullu_kapi

    if yarismacinin_yeni_secimi == odullu_kapi:
        kazanc = kazanc + 1

Her iki durumda da kazanç değişkenimizi nasıl hesapladığımızı yukarıda gösterdik. Alışık olmayanlar için çok kısa birkaç açıklama yapmak gerekirse, random.choice(kapilar) ifadesi kapilar dizisindeki elemanlardan birini rastgele seçmektedir (her elemanın seçilme olasılığı eşittir, buna güvenebilirsiniz). random.remove(odullu_kapi) gibi bir ifade ise kapilar dizisi içinden ilgili kapıyı çıkarmakta yani diziyi küçültmektedir.

Şimdi bunca açıklamadan sonra gelelim işin özüne, her iki stratejiyi de 100 kere çalıştırıp çıkan kazanç sayıyı 100’e bölerek her iki stratejinin de kazanma olasılığını hesaplayabileceğimizi söylemiştik. Lakin burada okurun aklına birkaç soru gelebilir:

  • Bu model gerçekçi midir?
  • 100 kere denemek yeterli midir?

Model gerçekçidir çünkü bilgisayar bir kapı seçerken tamamen gelişigüzel bir seçim yapmaktadır. Her iki stratejiyi 100 kere denemek pek gerçekçi gelmedi ise o zaman rahatlıkla bu rakamı 1 milyona çıkarabiliriz, ne de olsa işin ucunda 1 milyon YTL ödül var demiştik, değil mi? 😉 Her iki stratejiyi de bu yarışmaya ayrı ayrı 1 milyon kere sokalım, her ikisinde kaç kere kazandığımızı kazanc değişkenimizde biriktirelim ve çıkan sonucu 1 milyona bölüp 100 ile çarpalım, böylece % cinsinden olasılığı hesaplayalım:


$ python sec-bakalim.py
1. strateji ile kazanma olasiligi = %33.249
2. strateji ile kazanma olasiligi = %66.958

Görülen o ki ikinci strateji yani kapıyı değiştirmek çok daha anlamlı, 1 milyon kere denedik ve bu denemelerin yaklaşık %67’sinde bu strateji kazandı. Programı bir kez daha çalıştırıp bir kez daha milyonluk bir deneme yapalım bakalım sonuç değişecek mi:


$ python sec-bakalim.py
1. strateji ile kazanma olasiligi = %33.566
2. strateji ile kazanma olasiligi = %66.752

Hemen hemen aynı! Üstelik bu denemeleri yapmak orta karar bir bilgisayarda her seferinde hemen hemen yaklaşık 1 saniye sürdü yani modelimizi kurduktan sonra çalıştırmamız, bir tür simülasyon yapıp sonuçları öğrenmemiz çok düşük maliyetli.

Modelimiz bize her halükârda başlangıçta seçtiğimiz kapıdan vaz geçip geriye kalan kapıyı seçmemizin daha kârlı olduğunu, başka bir deyişle 2. stratejiyi takip etmemiz halinde 1 milyon YTL’lik ödülü kazanma olasılığımızın %66 küsur olduğunu söylemektedir.

Bu problemin Bayes teoremi kullanarak analiz edilmiş ve benzer sonuca varılmış şeklini çeşitli yerlerde bulup inceleyebilirsiniz. Sembolik matematiksel analiz bu durumda daha güçlü bir araçtır, bunu kabul ediyorum ancak sizce hangisini anlamak daha kolaydır, buna da siz karar verin.

Külyutmaz Bilgisayarcılar İçin Notlar

1. Programın tüm kaynak kodu aşağıdadır, bunu Ubuntu GNU/Linux üzerinde Python 2.5.2, MS Windows XP üzerinde de Python 2.6 ile denedim, yani komut satırında python sec-bakalim.py diyerek çalıştırdım.

sec-bakalim.py
--------------


import random

###
### "Kapiyi degistirmem stratejisi
###
kazanc = 0

for i in range(100000):
    # 3 kapi var, bunlardan sadece bir tanesinin arkasinda odul var
    # hangi kapinin arkasina yerlestirilecegine gelisiguzel karar veriliyor
    kapilar = [1, 2, 3]
    odullu_kapi = random.choice(kapilar)

    # Yarismaci, odulun nerede oldugunu bilmeden bir kapi seciyor.
    yarismacinin_secimi = random.choice(kapilar)

    # Sunucu yarismacinin sectigi kapi haricindeki iki kapiya bakiyor
    # ve bunlarin icinden odul icermeyen bir tanesini secip aciyor ve
    # yarismaciya fikrini degistirip degistirmeyecegini soruyor
    # Var sayalim ki yaristirmaci fikrini degistirmesin. Bu durumda
    # eger secmis oldugu kapi odullu kapi ise kazanmis olur:

    # Son seciminden sonra yarismaci kazandi mi?
    if yarismacinin_secimi == odullu_kapi:
        kazanc = kazanc + 1

olasilik = kazanc / 100000.0
print '1. strateji ile kazanma olasiligi = %' + str(olasilik * 100)


###
### "Kapiyi degistiririm stratejisi
###
kazanc = 0

for i in range(100000):
    # 3 kapi var, bunlardan sadece bir tanesinin arkasinda odul var
    # hangi kapinin arkasina yerlestirilecegine gelisiguzel karar veriliyor
    kapilar = [1, 2, 3]
    odullu_kapi = random.choice(kapilar)

    # Yarismaci, odulun nerede oldugunu bilmeden bir kapi seciyor.
    yarismacinin_secimi = random.choice(kapilar)

    # Sunucu yarismacinin sectigi kapi haricindeki iki kapiya bakar
    # ve bunlarin icinden odul icermeyen bir tanesini secip acar.
    # Yarismaciya fikrini degistirip degistirmeyecegini sorar.
    # Var sayalim ki yaristirmaci fikrini degistirsin ve geriye kalan
    # kapilardan birini secsin


    # Eger yarismaci odullu kapiyi secti ise sunucu geriye kalan odulsuz iki
    # kapidan birini acar, sectigi stratejiden oturu yarismaci ilk basta sectigi
    # ve az once sunucunun acmis oldugu kapinin disinda kalan yegane kapiyi secmek
    # durumundadir.
    if yarismacinin_secimi == odullu_kapi:
        kapilar.remove(odullu_kapi)
        kapilar.remove(random.choice(kapilar))
        yarismacinin_yeni_secimi = kapilar[0]

    # Eger yarismaci odulsuz bir kapi secti ise, sunucu odulsuz diger kapiyi acar
    # ve yarismaci sectigi stratejisinden oturu kapiyi degistirir yani geriye kalan
    # tek kapiyi, odullu kapiyi secer ve kazanir
    else:
        yarismacinin_yeni_secimi = odullu_kapi

    # Son seciminden sonra yarismaci kazandi mi?
    if yarismacinin_yeni_secimi == odullu_kapi:
        kazanc = kazanc + 1

olasilik = kazanc / 100000.0
print '2. strateji ile kazanma olasiligi = %' + str(olasilik * 100)

2. Yazıdaki grafikleri GNU pic programlama dili ile kodlayıp GNU groff aracından faydalanarak oluşturdum ve bunun için “Making Pictures With GNU PIC” başlıklı belgeden faydalandım. Aşağıda son grafiğin kodunu görebilirsiniz (diğerlerinin tahmin edilmesi egzersiz olarak okura bırakılmıştır):

monty-hall-opened-select-which.pic
----------------------------------


.PS
## Some setup before we start drawing
scale = 2.54
golden_ratio = 1.61803399

box_width = 3
box_height = box_width * golden_ratio

box width box_width height box_height;

line < - dashed "Secmeli" above "mi?" below;
box same "X";
move;

box same "Sunucu acti ve bos!";
.PE

Yukarıdaki dosyadan bir .png dosyası elde edebilmek için önce aşağıdaki komutu verdim:


gpic monty-hall-opened-select-which.pic | groff -Tps > monty-hall-opened-select-which.ps


Daha sonra da oluşan .ps uzantılı dosyayı (PostScript dosyasını) GIMP grafik düzenleme programı ile açarak bir PNG dosyası olarak kaydettim.

Advertisements
 
7 Comments

Posted by on November 10, 2008 in General, Programlama, python

 

7 responses to “Var Mısın Yok Musun: Bilgisayar Bize Nasıl Para Kazandırabilir?

  1. Emre Sevinc

    November 10, 2008 at 23:18

    Not: Bu yazıyı yazmama vesile olan Ridley Scott’a, NUMB3RS isimli şahane dizisinden ötürü teşekkürü bir borç bilirim. Özel olarak bu yazıyı tetikleyen 1. sezonun son bölümü olan ‘Man Hunt’ bölümüdür:

    http://numb3rs.wolfram.com/season1.html

     
  2. Özgür

    November 11, 2008 at 13:58

    Bulabildiğim en yalın açıklama şu:
    İlk seçimimizin doğru çıkma olasılığı 1/3 olduğuna göre doğru çıkmama olasılığı 2/3’tür. Diğer kapıyı seçmemiz durumunda kazanma şansı doğru çıkmama olasılığıyla eşit olduğu(*) için 2/3’e eşit olur.

    (*) Bunu göstermek için basit bir küme diyagramı yeterli oalcaktır.

     
  3. Emre Sevinc

    November 11, 2008 at 14:17

    Açıklama için teşekkürler.

    Benim burada vurgulamaya çalıştığım şeylerden biri de, durum biraz daha karmaşıklaştığında, kapı sayısı arttığında, kurallar değiştiğinde, vs. yahut bambaşka bir olasılık problemini incelediğimizde benzer yöntemin yani bilgisayarda basitçe bir model kurup bunun simülasyonunu yapmanın karar vermede bize faydalı olabileceği.

     
  4. simon templar

    November 30, 2008 at 07:23

    tüm mantık sunucunun nasıl hareket ettiğinde. sunucu dolu kapıyı açmayacağına göre size bir bilgi vermiş oluyor. ödül sizdeyse (1/3 olasılıkla) diğer ikisinden birini açacaktır. bunu da rastgele yapacaksa sağdaki kapıyı açması olasılığı 1/6’dır. eğer ödül soldaki kapıdaysa (yine 1/3 olasılık) kesin sağdakini açacaktır. bayes teoremini uygulayıp ‘sağdakini açtığına göre ödülün solda olma olasılığı nedir’ deyip bulabiliriz: 1/3 bölü (1/3+1/6) = 2/3.

    burada kritik olan sunucunun ödül sizdeyken hangi kapıyı açacağının rastgele olup olmaması. elimizde bir veri olmadığından rastgele diyoruz. oysa o önceden belirlemişse açacağı kapıyı, bu hesap geçersiz olur.

    (simülasyon tamamen bu mantık üzerine olduğundan kendi kendini doğrular gibi oluyor.
    o yüzden 3 kapı için simülasyona ve yazılıma gerek yok bence. özellikle kanıtlamak istemiyorsanız tabi. genel bir çözüm bulmak iyi tabi, ama sanırım kapı sayısı artsa da aynı şekilde kolayca hesaplanabilir olasılık. hem mantığı kaçırmamış olur insan hem de kafayı çalıştırmak iyidir:)

    özgür beyin açıklaması yeterince doyurucu olmamış. çünkü sunucunun taktiği farklıysa o cevap yanlış olur. bu soruyu çok yıllar önce asistanlığını yaptığım bir sınıfa ödev olarak sormuştum, bu cevabı doğru kabul etmezdim sanırım:)

     
  5. simon templar

    November 30, 2008 at 19:05

    aslında aynı cevap linkteki wikipedia’da da verilmiş, görmemişim (gerçi, onlar biraz uzatmış:).

    yalnız, birşeye katılmıyorum. var mısın yok musun’daki durum bir monty hall problemi değil. o bahsettiğiniz forumda da öyle demiş biri. oysa var mısın yok musun’da sunucu (ya da müdür) müdahale etmiyor. başta her kutuda büyük ödül olma olasılığı 1/24 iken (tek büyük ödül varsayarsak) son iki kutu kaldığında kalan büyük paranın sizin kutunuzda olma olasılığı 1/2 olur. bu, diğer kutu için de 1/2’dir. monty hall’daki gibi bunu değiştirecek ek bir bilgi yok bu yarışmada.

     
  6. Mehmet

    December 2, 2008 at 16:07

    🙂 güzel bir analiz , yazıyı hazırlarken numbers dizisi tetiklemis olsada dün 21 Blackjack isimli filmi izleyen biri olarak aynı sahnenin tekrarlandıgını söyleyebilirim. ama var msın yok musunda sunucunun hiçbir sekilde kutularda neler oldugunu bilmedigini hesaba katıcak olursak yaptıgı yönlendirmeler ve ya tanıdıgı yeni bir seçim sansı ile oynayan kişinin olasılıgını ne derece değiştirir orası tartısılır .

     
  7. Hasso

    December 14, 2008 at 06:28

    bu da başka bir çözümmüş

    http://ozgursehuhu.googlepages.com/ipucu42222

     

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: