27 Mayıs 2025

Nüfus Simülasyonu

Merhaba,

Ali Nesin Hocanın instada sorduğu bir soruyu paylaşayım öncelikle.

Bir kabile bir karar veriyor. Her kadın 'erkek çocuk' doğurana kadar doğum yapacak. Erkek çocuk yaptıktan sonra bir daha çocuk sahibi olmayacak. Bu kabilede bir süre sonra kız çocuğu mu daha fazla olur, erkek çocuğu mu?

Çözüm ile matematiksel olarak uğraşmayıp, bunun bilgisayar programını yapsam nasıl olur diye düşündüm. p5.js üzerinde aşağıdaki özelliklerde bir program yazdım.


Toplumda ilk başta rastgele sayıda ve rastgele yaşta kadın ve erkek bireyler olacak. Kadınlar 20 yaşından önce doğum yapamayacak ve her iki doğum arası 5 sene bekleyecekler. Soruda söylendiği gibi, kız çocuk doğurdukları sürece tekrar doğum hakları olacak. Eğer erkek çocuk doğururlarsa bir daha doğum yapmayacaklar. İstisnasız herkes 80 yaşına kadar yaşayacak ve sonra ölecek.

Haydi bunu simüle edelim.

Başlangıç değişkenlerimizi tanımlayalım.

let yil = 0;
let ilkDogumYasi = 20;
let dogumAraligi = 5;
let olumYasi = 80;
let ilkNufus = 100;
let toplum = [];
let erkek = 0;
let kadin = 1;

Yıl değişkeni iterasyon için gerekli bir zaman değişkeni. ilkDoğumYaşı, kadınların ilk doğum yapabilecekleri yaşın değeri. doğumAralığı ise bir kadının iki doğum arasında beklemesi gereken süre. Bunu 1 yaparsak her sene pıtır pıtır doğum yaparlar. Diğer değişkenlerin adlandırmaları sanırım anlaşılıyordur.

Önce İnsan Olmak Lazım

İnsan isminde bir class yapısı kurdum. İki parametre ile kuruyoruz. Yaş ve cinsiyet.

class insan{
  constructor(cins, yas){
    this.cinsiyet = cins;
    this.yas = yas
    this.dogumBosluk = dogumAraligi;
    if (this.cinsiyet === kadin){
      this.dogurganlik = true;
    } else {
      this.dogurganlik = false;
    }
  }

İnsanı tanımlayan 4 parametre var. Yaş, Cinsiyet, Doğurganlık, Doğum Boşluk değerleri. Erkekler ilk başta Doğurganlık = False olarak başlıyor. Kadınlar ise True olarak başlıyor.

Programın setup kısmında toplumu oluşturalım.

function setup() {
  for (let i = 0; i < ilkNufus; i++){
    let cinsiyet = random([erkek, kadin]);
    let yas = floor(random(0,olumYasi));
    toplum.push(new insan(cinsiyet, yas));
  }
}

Toplumu Oluşturan Bireydir

Başlangıç parametrelerinde tanımlanmış olan ilk nüfus değeri kadar insanı toplum dizisine ekliyoruz.

İnsan Ne Yapar?

İnsan nesnesine ait iki tane olay tanımladım. Birincisi grafik amaçlı kullanılacak olan Ciz() olayı. Bunu sona bırakıyorum. Bir diğeri Yasam() olayı. Yaşam olayı, birey her yeni yaşa girdiğinde kazanacağı yeni durumları hazırlayacak. Yaşamdan başlayalım.

 yasam(){
    this.yas++;
 }

İlk yapacağımız şey yaşam olayı tetiklendiğinde bireyin yaşını 1 arttırmak. Sonra yaşı artmış bireyin durumunu analiz edeceğiz.

Önce ölümden başlayalım. Ölüm yaşına gelmiş bireyi toplumdan çıkarıyoruz. Acı ama gerçek!

if (this.yas >= olumYasi){
   let index = toplum.indexOf(this);
   if(index > -1){
      toplum.splice(index, 1);
   }
 } else {
 }

Ölüm yaşına ulaşmamış bireyleri ELSE kısmına alıyoruz. Burada cinsiyet sorgulamaları yapılacak. Erkek bireyler için hayat kolay. Onlara hiçbir işlem yapmıyoruz. Kafalarına göre yaşayıp gidiyorlar. Yine her zaman olduğu gibi toplumun yükü kadının sırtında.

if (this.cinsiyet == kadin && this.yas >= 20 && this.dogurganlik){

   // doğum dönemi gelmiş mi
   if (this.dogumBosluk == 0){
      let bebek = random([erkek, kadin]);
      toplum.push(new insan(bebek0));
      
this.dogumBosluk = 5;

     
      if (bebek == erkek){
         this.dogurganlik = false;
      }
           
     } else {
      this.dogumBosluk--;
    }

}

Doğum yapabilmek o kadar kolay değil. Kadın olacak. Yaşı 20 ve üzeri olacak. Doğurganlığı TRUE olacak ve doğum boşluğu diye tanımladığımız iki doğum arasındaki süreyi geçirmiş olacak. Eğer bu şartları sağlayan bir birey varsa rastgele cinsiyet oluşturup, sıfır yaşında bir bireyi topluma ekliyoruz. Sonra doğum yapan annenin dogum boşluğu periyodunu başa alıyoruz. Eğer doğmuş bireyin cinsiyeti erkek ise bu annenin doğurganlık değerini FALSE ile işaretliyoruz. Artık bir daha doğum yapamaz. Eğer kadının doğum dönemi gelmemişse bu değeri 1 eksiltiyoruz.

Bireyin hayatı bu kadar işte. Bunlar ne yer, ne içer? Umurumuzda değil!

Zaman Aksın

draw() fonksiyonu içerisinde ilk önce yıl değişkenini 1 artırırız. Sonrasında toplumdaki her bireyi tek tek ele alıp, hayat fonksiyonunu çağırırız. Bu fonksiyon sürekli çalışacağı için bireyler yıla bağlı olarak yaşlanacak ve hayat olaylarında tanımlı faaliyetlerle ya doğum yapacaklar ya da ölecekler.

function draw() {
  yil++;
  for(let i = 0; i < toplum.length; i++){
    toplum[i].yasam();
  }
}

Grafik için, toplumu ekrana yan yana dizmeyi düşündüm. Kadınlar için ellipse, erkekler için rect şekiller çizdirdim. Tek boyutlu bir diziden okunan indeks numaralarını yatay ve düşey koordinatlara çevirip ekrana bastırdım. Onları buraya eklersem kodlar çok karışacaktı. Hazır programın kodlarını inceleyebiliriniz.

 Peki Cevap Ne?

Ali Nesin Hoca sorunun çözümünü yapıyor ve cevabın yarı yarıya olacağını söylüyor. Fiziksel değişiklikler olmadığı sürece her iki cinsiyet de toplumda eşit oranlarla temsil edilmekte. Programı yukarıdaki parametrelerle çalıştırdığımda 600 yıl boyunca eşitliğin hep aynı kaldığını gördüm. Nüfus azalma veya artma yönünde gidiyor ama cinsiyetler arasında hep eşitlik veya eşitliğe çok yakın küçük farklar görülüyor.

Program Hakkında

Aşağıda görmüş olduğunuz simülasyonda erkek bireyler kare, kadın bireyler daire ile temsil edilmekte. Bireyler yaşlandıkça renkleri koyulaşmakta. Listenin sonuna eklenen mavi ve kırmızı kareler sıfır yaşındaki bebekler. Yıllar ilerledikçe yeni bebekler liste sonuna ekleniyor. Yaşı ölüm yaşına gelenler listeden çıkıyor.

Eğik Atış, Yerçekimi ve Rüzgar Hareketi Verme

Bir eğik atış uygulaması yazmak için gerekli olan temel adımları anlatacağım. p5.js editörünü kullanacağım için uygulamayı buna göre kodlay...