Python Ile Evlenmek Istediginiz Kisiyle Evlenme Olasiliginiz
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ü
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;
- Olay uzayı : Bu insanın ömrü boyunca tanıştığı kişilerin dışında kalan nüfusun seçilmesi
- Ö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.
import math
P = 40000000
S = 1
F = 80000
def faktoriyelHesapla(i):
if i==1:
return 1
else:
return i * faktoriyelHesapla(i-1)
def kombinasyonHesapla(n,r):
if r==0 or n == r:
return 1
else:
return faktoriyelHesapla(n) / (faktoriyelHesapla(n - r) * faktoriyelHesapla(r))
def karsilasmaProblemi(P,S,F):
return 1- (kombinasyonHesapla(P-F,S)/kombinasyonHesapla(P,S))
karsilasmaProblemi(P,S,F)
Ç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.
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.
optimizedSolution(P,S,F)
Çıkan sonuç yaklaşık olarak %0,002 olmuş oldu. Oldukça küçük bir oran.
