Kombinasyon ve Karşılaşma Problemi

Kombinasyon, bir nesne grubu içerisinden, sıra gözetmeksizin yapılan seçimlerdir. Örnek olarak mavi, sarı ve kırmızı topların bulunduğu torbadan çekilen topların seçilmesi olayının kaç farklı şekilde olabileceğinin hesaplanması kombinasyon ile hesaplanır.

Kombinasyonun formülü

alt text

Ayrıca kombinasyonu pythonda yazalım ve ilgi çekici bir karşılaşma problemini çözelim.

Soru:

Evlendiğiniz kişinin, evlenmek istediğiniz kişi olmasının olasılığı ne olabilir ?

Çözüm:

Aslında başta uyarmam gereken birkaç durum var.

  • Evlenmek istediğiniz kişi sayısı 1'den fazla ise bu bizim hesaplayacağımız olasılıktan daha yüksek çıkacaktır. Çünkü belli başlı kuralları kabul ettiğimiz zaman ortaya çıkan sonucu sizinle paylaşıyorum. Bu örneğin sorusuna ruh eşinizi bulma olasılığı da diyebilirsiniz.
  • Her kişi ile karşılaşma için eşit şans verilmektedir.
  • Bir insanın ömründe ortalama 80.000 insan ile karşılaştığını varsayalım.
  • Türkiye'de bulunan nüfus için değerlendirme yapalım. Türkiye nüfusunda örnekteki insanın ömrü boyunca aynı nüfus oranında olduğunu, kadın-erkek sayısının eşit ve ikisinin toplamının 80.000.000 olduğunu varsayalım. Yaş ile ilgili ise herkesin reşit yaşta olduğunu varsayalım.

Eğer tüm durumlardan, bir insanın ömrü boyunca tanıştığı kişilerin dışında kalan nüfusun kombinasyonunun, tüm nüfusta karşılaşılanların nüfusunun kombinasyonunun 1'den çıkarılımı bir insanın evlendiği kişinin hayatındaki evlenmek istediği kişi olma olasılığının sonucunu verecektir.

Bu durumda belirlenmesi gerekenler şunlardır;

  1. Olay uzayı : Bu insanın ömrü boyunca tanıştığı kişilerin dışında kalan nüfusun seçilmesi
  2. Örnek uzay :Tüm nüfustan karşılaşılanların nüfusunun seçilmesi

Değişkenlerimizi tanımlamak gerekirse;

  • P (Toplam nüfus) = 40.000.000 // Kadın-Erkek olarak ayrıldı
  • S (Toplam evlenilecek kişi sayısı) = 1
  • F (Bir insanın ömrü boyunca tanıştığı kişi sayısı) = 80.000

Şimdi kodlamaya geçelim.

In [0]:
import math
P = 40000000
S = 1
F = 80000
In [0]:
def faktoriyelHesapla(i):
    
    if i==1:       
        return 1
    
    else: 
        return i * faktoriyelHesapla(i-1)
In [0]:
def kombinasyonHesapla(n,r):
    
    if r==0 or n == r:       
        return 1
    else: 
        return faktoriyelHesapla(n) / (faktoriyelHesapla(n - r) * faktoriyelHesapla(r))
In [0]:
def karsilasmaProblemi(P,S,F):
    
    return 1- (kombinasyonHesapla(P-F,S)/kombinasyonHesapla(P,S))
In [5]:
karsilasmaProblemi(P,S,F)
---------------------------------------------------------------------------
RecursionError                            Traceback (most recent call last)
<ipython-input-5-8af97acc5d68> in <module>()
----> 1 karsilasmaProblemi(P,S,F)

<ipython-input-4-c6ebc030159b> in karsilasmaProblemi(P, S, F)
      1 def karsilasmaProblemi(P,S,F):
      2 
----> 3     return 1- (kombinasyonHesapla(P-F,S)/kombinasyonHesapla(P,S))

<ipython-input-3-a89adc1add34> in kombinasyonHesapla(n, r)
      4         return 1
      5     else:
----> 6         return faktoriyelHesapla(n) / (faktoriyelHesapla(n - r) * faktoriyelHesapla(r))

<ipython-input-2-915f446c5eaf> in faktoriyelHesapla(i)
      5 
      6     else:
----> 7         return i * faktoriyelHesapla(i-1)

... last 1 frames repeated, from the frame below ...

<ipython-input-2-915f446c5eaf> in faktoriyelHesapla(i)
      5 
      6     else:
----> 7         return i * faktoriyelHesapla(i-1)

RecursionError: maximum recursion depth exceeded in comparison

Çok fazla rekürsif işlemi olduğu için optimize edilmiş kombinasyon hesaplama fonksiyonu yazmalıyız. O yüzden yeni bir fonksiyon oluşturuyorum.

In [0]:
def optimizedSolution(P,S,F):
    
    return 1 - ((P-F) / P)

Bu işlemin buna dönüşmesindeki neden şudur, kombinasyonu hesaplarken S=1 olduğu için işlemi sadeleştirerek yaptım bu normal şartlarda kombinasyon fonksiyonunu hesaplarken de eklenebilirdi.

In [7]:
optimizedSolution(P,S,F)
Out[7]:
0.0020000000000000018

Çıkan sonuç yaklaşık olarak %0,002 olmuş oldu. Oldukça küçük bir oran.