<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://program.sonsuz.us/feed.xml" rel="self" type="application/atom+xml" /><link href="https://program.sonsuz.us/" rel="alternate" type="text/html" /><updated>2026-11-02T06:05:57+00:00</updated><id>https://program.sonsuz.us/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">James Webb’in Veri Mutfağı: Ham Fotonlardan Bilimsel Görüntülere</title><link href="https://program.sonsuz.us/posts/james-webbin-veri-mutfagi-ham-fotonlardan-bilimsel-goruntulere/" rel="alternate" type="text/html" title="James Webb’in Veri Mutfağı: Ham Fotonlardan Bilimsel Görüntülere" /><published>2026-11-02T00:00:00+00:00</published><updated>2026-11-02T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/james-webbin-veri-mutfagi-ham-fotonlardan-bilimsel-goruntulere</id><content type="html" xml:base="https://program.sonsuz.us/posts/james-webbin-veri-mutfagi-ham-fotonlardan-bilimsel-goruntulere/"><![CDATA[<p>James Webb Uzay Teleskobu’nun büyüleyici görüntüleri, uzaydan hazır duvar kâğıdı olarak gelmez. İlk veriler; dedektör izleri, kozmik ışın etkileri ve ölçüm belirsizlikleriyle doludur. Bilimsel veri işleme hattı, bu karmaşayı fiziksel olarak anlamlı ölçümlere dönüştürür. Gelin, kozmik mutfağın tezgâhına yaklaşalım: Burada filtre değil, kalibrasyon pişiyor!</p>

<p>``</p>

<h2 id="önce-teori-dedektör-aslında-ne-ölçer">Önce teori: Dedektör aslında ne ölçer?</h2>

<p>Webb’in dedektörleri, poz boyunca biriken sinyali birden fazla kez okur. Bu okumalar, <strong>rampa</strong> denilen bir zaman dizisi oluşturur. İdeal, doğrusal bölgedeki bir pikseli şöyle düşünebiliriz:</p>

\[D(t)=b+rt+\epsilon(t)\]

<p>Burada $b$ başlangıç seviyesi, $r$ sinyalin birikme hızı, $\epsilon(t)$ ise gürültüdür. Amaç yalnızca son okumaya bakmak değil, geçerli okumaların eğiminden güvenilir bir hız ölçmektir. Doygunluk ve kozmik ışın sıçramaları, bu hesabı sıradan bir doğru uydurmaktan daha zor hâle getirir.</p>

<p>Gürültünün iki önemli bileşeni fotonların istatistiksel değişkenliği ve elektronik okuma gürültüsüdür. Kalibrasyon, bunları sihirli biçimde yok etmez; etkilerini modeller ve belirsizlikleri sonraki aşamalara taşır.</p>

<table>
  <thead>
    <tr>
      <th>Aşama</th>
      <th>Temel girdi</th>
      <th>Tipik görüntüleme çıktısı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Detector1</td>
      <td>Ham okumalar: <code class="language-plaintext highlighter-rouge">uncal</code></td>
      <td>Sinyal hızı: <code class="language-plaintext highlighter-rouge">rate</code></td>
    </tr>
    <tr>
      <td>Image2</td>
      <td>Hız görüntüsü</td>
      <td>Kalibreli görüntü: <code class="language-plaintext highlighter-rouge">cal</code></td>
    </tr>
    <tr>
      <td>Image3</td>
      <td>İlişkilendirilmiş pozlar</td>
      <td>Birleşik mozaik: <code class="language-plaintext highlighter-rouge">i2d</code></td>
    </tr>
  </tbody>
</table>

<p><img src="/img/james-webbin-veri-63.svg" alt="james-webbin-veri-63" /></p>

<h2 id="1-dedektör-düzeltmeleri-elektroniğin-izlerini-temizlemek">1. Dedektör düzeltmeleri: Elektroniğin izlerini temizlemek</h2>

<p>İlk aşamada veri kalite bayrakları hazırlanır; doygun pikseller belirlenir ve dedektöre uygun düzeltmeler uygulanır. Referans piksel düzeltmesi, doğrusal olmayan tepkinin giderilmesi ve karanlık akım düzeltmesi bunlar arasındadır. MIRI ile yakın kızılötesi dedektörlerinin ihtiyaçları aynı olmadığından, adımlar cihaz ve gözlem moduna göre değişir.</p>

<p>Kozmik ışınlar rampada ani sıçramalar bırakabilir. İşlem hattı bu sıçramaları işaretleyerek geçerli rampa parçalarını değerlendirebilir. Böylece tek bir darbe yüzünden bütün poz çöpe gitmez. Rampa uydurması sonucunda, görüntüleme için genellikle DN/s cinsinden bir hız görüntüsü elde edilir.</p>

<h2 id="2-fiziksel-kalibrasyon-pikselden-gökyüzüne">2. Fiziksel kalibrasyon: Pikselden gökyüzüne</h2>

<p>İkinci aşama, ölçümü gökyüzüyle ilişkilendirir. <strong>WCS</strong>, piksel koordinatlarını göksel koordinatlara dönüştüren modeli taşır; optik bozulmalar da bu modelin parçasıdır. Düz alan düzeltmesi, piksellerin farklı duyarlılıklarını dengeler. Fotometrik kalibrasyon ise sayısal sinyali fiziksel birimlere çevirir; görüntüleme ürünlerinde yaygın birim MJy/sr’dir.</p>

<p>Basitleştirilmiş bir ilişki şöyle yazılabilir:</p>

\[I=C\frac{R-B}{F}\]

<p>$R$ hız ölçümü, $B$ arka plan, $F$ göreli duyarlılık ve $C$ dönüşüm katsayısıdır. Bu denklem kavramsaldır; gerçek hattın bütün adımlarını veya kesin işlem sırasını temsil etmez. Özellikle arka planın nerede çıkarılacağı gözleme bağlıdır.</p>

<h2 id="3-birleştirme-kozmik-yapbozu-tamamlamak">3. Birleştirme: Kozmik yapbozu tamamlamak</h2>

<p>Webb aynı alanı küçük konum kaymalarıyla, yani <strong>dither</strong> uygulayarak gözlemleyebilir. Üçüncü aşamada uygun pozlar hizalanır, gerektiğinde arka plan seviyeleri eşleştirilir, aykırı örnekler belirlenir ve ortak bir koordinat ızgarasına yeniden örneklenir.</p>

<p>Drizzle yaklaşımı, bu birleştirmede örneklemeyi ve kapsama alanını iyileştirebilir. Ancak yeni fiziksel ayrıntılar yaratmaz; yeniden örnekleme komşu pikseller arasında gürültü korelasyonu oluşturabilir. Bu nedenle mozaikteki belirsizlikleri bağımsız piksel varsayımıyla yorumlamak her zaman doğru değildir.</p>

<h2 id="python-ile-hattı-çalıştırmak">Python ile hattı çalıştırmak</h2>

<p>STScI’nin <code class="language-plaintext highlighter-rouge">jwst</code> paketini <code class="language-plaintext highlighter-rouge">pip install jwst</code> ile kurabilirsiniz. Aşağıdaki örnek, iki görüntüleme pozunu işler. Dosya adları temsilidir; son çağrı, oluşan <code class="language-plaintext highlighter-rouge">cal</code> dosyalarını üye olarak tanımlayan geçerli bir <code class="language-plaintext highlighter-rouge">goruntu_asn.json</code> ilişkilendirme dosyası gerektirir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">os</span>

<span class="n">os</span><span class="p">.</span><span class="n">environ</span><span class="p">.</span><span class="nf">setdefault</span><span class="p">(</span><span class="sh">"</span><span class="s">CRDS_PATH</span><span class="sh">"</span><span class="p">,</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="nf">abspath</span><span class="p">(</span><span class="sh">"</span><span class="s">crds_cache</span><span class="sh">"</span><span class="p">))</span>
<span class="n">os</span><span class="p">.</span><span class="n">environ</span><span class="p">.</span><span class="nf">setdefault</span><span class="p">(</span><span class="sh">"</span><span class="s">CRDS_SERVER_URL</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">https://jwst-crds.stsci.edu</span><span class="sh">"</span><span class="p">)</span>

<span class="kn">from</span> <span class="n">jwst.pipeline</span> <span class="kn">import</span> <span class="n">Detector1Pipeline</span><span class="p">,</span> <span class="n">Image2Pipeline</span><span class="p">,</span> <span class="n">Image3Pipeline</span>

<span class="n">os</span><span class="p">.</span><span class="nf">makedirs</span><span class="p">(</span><span class="sh">"</span><span class="s">urunler</span><span class="sh">"</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>

<span class="k">for</span> <span class="n">raw</span> <span class="ow">in</span> <span class="p">[</span><span class="sh">"</span><span class="s">jw_ornek01_uncal.fits</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jw_ornek02_uncal.fits</span><span class="sh">"</span><span class="p">]:</span>
    <span class="n">root</span> <span class="o">=</span> <span class="n">raw</span><span class="p">.</span><span class="nf">removesuffix</span><span class="p">(</span><span class="sh">"</span><span class="s">_uncal.fits</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">Detector1Pipeline</span><span class="p">.</span><span class="nf">call</span><span class="p">(</span>
        <span class="n">raw</span><span class="p">,</span> <span class="n">save_results</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">output_dir</span><span class="o">=</span><span class="sh">"</span><span class="s">urunler</span><span class="sh">"</span>
    <span class="p">)</span>
    <span class="n">Image2Pipeline</span><span class="p">.</span><span class="nf">call</span><span class="p">(</span>
        <span class="sa">f</span><span class="sh">"</span><span class="s">urunler/</span><span class="si">{</span><span class="n">root</span><span class="si">}</span><span class="s">_rate.fits</span><span class="sh">"</span><span class="p">,</span>
        <span class="n">save_results</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">output_dir</span><span class="o">=</span><span class="sh">"</span><span class="s">urunler</span><span class="sh">"</span>
    <span class="p">)</span>

<span class="n">Image3Pipeline</span><span class="p">.</span><span class="nf">call</span><span class="p">(</span>
    <span class="sh">"</span><span class="s">goruntu_asn.json</span><span class="sh">"</span><span class="p">,</span> <span class="n">save_results</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">output_dir</span><span class="o">=</span><span class="sh">"</span><span class="s">urunler</span><span class="sh">"</span>
<span class="p">)</span>
</code></pre></div></div>

<p>CRDS, gözleme uygun kalibrasyon referanslarını seçer. Tekrarlanabilirlik için paket sürümünü, işlem parametrelerini ve kullanılan <code class="language-plaintext highlighter-rouge">CRDS_CONTEXT</code> değerini kaydedin. Spektroskopide ikinci ve üçüncü aşamalar için <code class="language-plaintext highlighter-rouge">Spec2Pipeline</code> ve <code class="language-plaintext highlighter-rouge">Spec3Pipeline</code> kullanılır; dalga boyu kalibrasyonu ve tayf çıkarımı gibi işlemler devreye girer.</p>

<h2 id="son-kontrol-güzel-görünmek-yetmez">Son kontrol: Güzel görünmek yetmez</h2>

<p>Bilimsel analizden önce çıktıların <code class="language-plaintext highlighter-rouge">SCI</code>, <code class="language-plaintext highlighter-rouge">ERR</code> ve <code class="language-plaintext highlighter-rouge">DQ</code> uzantılarını birlikte inceleyin: Bunlar sırasıyla ölçümü, belirsizliği ve kalite bayraklarını taşır. Hizalama hatalarını, arka plan kalıntılarını ve maskelenmiş bölgeleri kontrol edin. Birleşik ürünlerin kapsama ve ağırlık haritaları da hangi bölgelerin daha güvenilir olduğunu gösterir.</p>

<p>Son olarak, renkli sunum görüntülerindeki kontrast ayarlarını bilimsel kalibrasyonla karıştırmayın. İyi bir Webb görüntüsü yalnızca etkileyici görünmez; birimleri, belirsizlikleri ve işlem geçmişiyle savunulabilir bir ölçüm sunar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="jwst" /><category term="james-webb" /><category term="astronomi" /><category term="veri-isleme" /><category term="python" /><category term="kalibrasyon" /><summary type="html"><![CDATA[James Webb Uzay Teleskobu’nun büyüleyici görüntüleri, uzaydan hazır duvar kâğıdı olarak gelmez. İlk veriler; dedektör izleri, kozmik ışın etkileri ve ölçüm belirsizlikleriyle doludur. Bilimsel veri işleme hattı, bu karmaşayı fiziksel olarak anlamlı ölçümlere dönüştürür. Gelin, kozmik mutfağın tezgâhına yaklaşalım: Burada filtre değil, kalibrasyon pişiyor!]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/james-webbin-veri-63.png" /><media:content medium="image" url="https://program.sonsuz.us/img/james-webbin-veri-63.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Meydanlardan Stadyumlara: Yaya Simülasyonlarıyla Kalabalığın Akışını Tasarlamak</title><link href="https://program.sonsuz.us/posts/meydanlardan-stadyumlara-yaya-simulasyonlariyla-kalabaligin-akisini-tasarlamak/" rel="alternate" type="text/html" title="Meydanlardan Stadyumlara: Yaya Simülasyonlarıyla Kalabalığın Akışını Tasarlamak" /><published>2026-11-02T00:00:00+00:00</published><updated>2026-11-02T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/meydanlardan-stadyumlara-yaya-simulasyonlariyla-kalabaligin-akisini-tasarlamak</id><content type="html" xml:base="https://program.sonsuz.us/posts/meydanlardan-stadyumlara-yaya-simulasyonlariyla-kalabaligin-akisini-tasarlamak/"><![CDATA[<p>Bir stadyumun kapısını birkaç metre genişletmek gerçekten tahliyeyi hızlandırır mı? Meydandaki büfeyi başka yere taşımak sıkışıklığı azaltır mı? Yaya hareketliliği simülasyonları, bu soruları inşaat başlamadan araştırmamızı sağlar. Üstelik mesele ekranda yürüyen sevimli noktalar değildir: Her nokta, kararları ve fiziksel sınırları olan bir insanı temsil eder.</p>

<p>``</p>

<h2 id="kalabalık-tek-bir-büyük-karakter-değildir">Kalabalık, tek bir büyük karakter değildir</h2>

<p>Ajan tabanlı modellerde her yaya bağımsız bir hesaplama birimidir. Konumu, hızı, hedefi ve tercihleri bulunur. Kalabalığın genel davranışı, bu küçük birimlerin etkileşiminden doğar. Karşılıklı yürüyen insanların kendiliğinden şerit oluşturması, bunun güzel örneklerinden biridir.</p>

<p>Yaygın yaklaşımlardan <strong>sosyal kuvvet modeli</strong>, hareketi hedefe ilerleme isteği ve çevreden gelen etkilerle açıklar:</p>

\[m_i a_i=\frac{m_i(v_i^0 e_i-v_i)}{\tau_i}+\sum_{j\ne i}F_{ij}+F_{i,\mathrm{duvar}}\]

<p>Burada $v_i^0$ istenen sürat, $e_i$ hedef yönü, $\tau_i$ tepki süresidir. Diğer terimler, yayaların ve duvarların etkisini temsil eder. Bunlar psikolojik davranışın birebir fizik yasaları değil, ölçümlerle ayarlanması gereken model bileşenleridir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Temel mantık</th>
      <th>Tasarımdaki kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sosyal kuvvet</td>
      <td>Sürekli konum ve etkileşim</td>
      <td>Kapı çevresindeki hareket</td>
    </tr>
    <tr>
      <td>Hücresel otomat</td>
      <td>Izgarada hücre değiştirme</td>
      <td>Çok sayıda senaryoyu tarama</td>
    </tr>
    <tr>
      <td>Hız engelleri</td>
      <td>Çarpışma oluşturacak hızlardan kaçınma</td>
      <td>Yerel hareket planlama</td>
    </tr>
  </tbody>
</table>

<h2 id="geniş-kapı-neden-her-zaman-çözüm-değildir">Geniş kapı neden her zaman çözüm değildir?</h2>

<p>Akış yalnızca kapının genişliğine bağlı değildir. Yoğunluk arttığında insanlar daha yavaş ilerleyebilir. Birim genişlik başına akış için temel ilişki şöyledir:</p>

\[J_s=\rho v,\qquad Q=wJ_s\]

<p>Burada $\rho$ kişi/metrekare, $v$ metre/saniye, $w$ geçiş genişliğidir; $Q$ kişi/saniye olarak ölçülür. Bu ilişki muhasebe açısından yararlıdır, ancak hızın yoğunlukla nasıl değiştiğini ayrıca modellemek gerekir. Geniş kapının arkasındaki dar koridor, darboğazı sadece birkaç metre ileri taşıyabilir. Kalabalık, tasarım hatasını sihirli biçimde buharlaştırmaz!</p>

<h2 id="python-ile-küçük-bir-hareket-çekirdeği">Python ile küçük bir hareket çekirdeği</h2>

<p>Aşağıdaki NumPy kodu, hedefe yönelme ve yayalar arasında uzaklaşma eğilimini hesaplar. <code class="language-plaintext highlighter-rouge">pos</code>, <code class="language-plaintext highlighter-rouge">vel</code> ve <code class="language-plaintext highlighter-rouge">goals</code>, her satırı bir yayaya karşılık gelen <code class="language-plaintext highlighter-rouge">(N, 2)</code> dizileridir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>


<span class="k">def</span> <span class="nf">step</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="n">vel</span><span class="p">,</span> <span class="n">goals</span><span class="p">,</span> <span class="n">dt</span><span class="o">=</span><span class="mf">0.05</span><span class="p">):</span>
    <span class="n">target</span> <span class="o">=</span> <span class="n">goals</span> <span class="o">-</span> <span class="n">pos</span>
    <span class="n">distance</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">linalg</span><span class="p">.</span><span class="nf">norm</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
    <span class="n">direction</span> <span class="o">=</span> <span class="n">target</span> <span class="o">/</span> <span class="p">(</span><span class="n">distance</span><span class="p">[:,</span> <span class="bp">None</span><span class="p">]</span> <span class="o">+</span> <span class="mf">1e-9</span><span class="p">)</span>
    <span class="n">desired_speed</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">minimum</span><span class="p">(</span><span class="mf">1.3</span><span class="p">,</span> <span class="n">distance</span> <span class="o">/</span> <span class="mf">0.5</span><span class="p">)</span>
    <span class="n">desired</span> <span class="o">=</span> <span class="n">direction</span> <span class="o">*</span> <span class="n">desired_speed</span><span class="p">[:,</span> <span class="bp">None</span><span class="p">]</span>

    <span class="n">delta</span> <span class="o">=</span> <span class="n">pos</span><span class="p">[:,</span> <span class="bp">None</span><span class="p">,</span> <span class="p">:]</span> <span class="o">-</span> <span class="n">pos</span><span class="p">[</span><span class="bp">None</span><span class="p">,</span> <span class="p">:,</span> <span class="p">:]</span>
    <span class="n">gap</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">linalg</span><span class="p">.</span><span class="nf">norm</span><span class="p">(</span><span class="n">delta</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
    <span class="n">normal</span> <span class="o">=</span> <span class="n">delta</span> <span class="o">/</span> <span class="p">(</span><span class="n">gap</span><span class="p">[:,</span> <span class="p">:,</span> <span class="bp">None</span><span class="p">]</span> <span class="o">+</span> <span class="mf">1e-9</span><span class="p">)</span>
    <span class="n">strength</span> <span class="o">=</span> <span class="mf">2.0</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="nf">exp</span><span class="p">(</span>
        <span class="n">np</span><span class="p">.</span><span class="nf">clip</span><span class="p">((</span><span class="mf">0.5</span> <span class="o">-</span> <span class="n">gap</span><span class="p">)</span> <span class="o">/</span> <span class="mf">0.3</span><span class="p">,</span> <span class="o">-</span><span class="mi">30</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
    <span class="p">)</span>
    <span class="n">np</span><span class="p">.</span><span class="nf">fill_diagonal</span><span class="p">(</span><span class="n">strength</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">)</span>
    <span class="n">repulsion</span> <span class="o">=</span> <span class="p">(</span><span class="n">strength</span><span class="p">[:,</span> <span class="p">:,</span> <span class="bp">None</span><span class="p">]</span> <span class="o">*</span> <span class="n">normal</span><span class="p">).</span><span class="nf">sum</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>

    <span class="n">acceleration</span> <span class="o">=</span> <span class="p">(</span><span class="n">desired</span> <span class="o">-</span> <span class="n">vel</span><span class="p">)</span> <span class="o">/</span> <span class="mf">0.5</span> <span class="o">+</span> <span class="n">repulsion</span>
    <span class="n">new_vel</span> <span class="o">=</span> <span class="n">vel</span> <span class="o">+</span> <span class="n">acceleration</span> <span class="o">*</span> <span class="n">dt</span>
    <span class="n">speed</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">linalg</span><span class="p">.</span><span class="nf">norm</span><span class="p">(</span><span class="n">new_vel</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
    <span class="n">new_vel</span> <span class="o">*=</span> <span class="n">np</span><span class="p">.</span><span class="nf">minimum</span><span class="p">(</span><span class="mf">1.0</span><span class="p">,</span> <span class="mf">2.0</span> <span class="o">/</span> <span class="p">(</span><span class="n">speed</span> <span class="o">+</span> <span class="mf">1e-9</span><span class="p">))[:,</span> <span class="bp">None</span><span class="p">]</span>
    <span class="k">return</span> <span class="n">pos</span> <span class="o">+</span> <span class="n">new_vel</span> <span class="o">*</span> <span class="n">dt</span><span class="p">,</span> <span class="n">new_vel</span>
</code></pre></div></div>

<p>İlk bölüm hedef yakınında yavaşlamayı sağlar. İkinci bölüm, yakın komşuların uzaklaşma etkisini toplar; son bölüm hareketi günceller. Sabitler örnek parametrelerdir, güvenlik sınırları değildir. Kod duvarları, fiziksel teması ve rota planlamasını içermez; çarpışmasız hareket garantilemez. Ayrıca tüm çiftleri karşılaştırdığı için maliyeti $O(N^2)$ olur. Büyük kalabalıklarda uzamsal indeksleme gerekir.</p>

<h2 id="tasarımı-karşılaştırmalı-bir-deneye-dönüştürmek">Tasarımı karşılaştırmalı bir deneye dönüştürmek</h2>

<p>Meydan veya stadyum geometrisini modele aktardıktan sonra tek bir animasyona bakıp karar vermeyin. Aynı koşullarda farklı tasarımları karşılaştırın:</p>

<ol>
  <li><strong>Başlangıcı tanımlayın:</strong> Giriş hızlarını, hedef dağılımını ve yürüme hızlarındaki çeşitliliği belirleyin. Arkadaş gruplarını ve erişilebilir güzergâhları unutmayın.</li>
  <li><strong>Alternatifler üretin:</strong> Kapı genişliği, bariyer yerleşimi ve büfe konumu gibi değişkenleri ayrı ayrı değiştirin.</li>
  <li><strong>Ölçün:</strong> Tahliye süresini, yerel yoğunluğu, bekleme sürelerini ve çıkış çizgisini geçen kişi sayısını kaydedin.</li>
  <li><strong>Tekrarlayın:</strong> Farklı başlangıç dağılımlarıyla çoklu koşular yapın; yalnızca ortalamayı değil, sonuçların değişkenliğini de raporlayın.</li>
</ol>

<p>Rota seçimi için en kısa yol her zaman en hızlı yol değildir. Algoritma, mesafeyle birlikte beklenen sıkışıklığı değerlendirebilir. Ancak çok sık rota değiştirmek kararsızlığa yol açabilir; karar güncellemelerini yumuşatmak faydalıdır.</p>

<h2 id="animasyon-güzel-doğrulama-daha-güzel">Animasyon güzel, doğrulama daha güzel</h2>

<p>Modeli gerçek sayımlar, anonimleştirilmiş hareket ölçümleri ve geçiş süreleriyle kalibre edin. Parametre duyarlılığını ve zaman adımı küçültüldüğünde sonuçların değişip değişmediğini inceleyin. Simülasyon, tasarımlar arasındaki farkları görünür kılan güçlü bir deney aracıdır; mevzuatın, saha incelemesinin veya uzman güvenlik değerlendirmesinin yerine geçmez.</p>

<p><img src="/img/meydanlardan-stadyumlara-yaya-16.svg" alt="meydanlardan-stadyumlara-yaya-16" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="simülasyon" /><category term="kalabalık yönetimi" /><category term="python" /><category term="ajan tabanlı modelleme" /><category term="şehir tasarımı" /><summary type="html"><![CDATA[Bir stadyumun kapısını birkaç metre genişletmek gerçekten tahliyeyi hızlandırır mı? Meydandaki büfeyi başka yere taşımak sıkışıklığı azaltır mı? Yaya hareketliliği simülasyonları, bu soruları inşaat başlamadan araştırmamızı sağlar. Üstelik mesele ekranda yürüyen sevimli noktalar değildir: Her nokta, kararları ve fiziksel sınırları olan bir insanı temsil eder.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/meydanlardan-stadyumlara-yaya-16.png" /><media:content medium="image" url="https://program.sonsuz.us/img/meydanlardan-stadyumlara-yaya-16.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Şehrin Geleceğini Önce Simüle Edelim: Katılımcı Planlamada Karar Destek Araçları</title><link href="https://program.sonsuz.us/posts/sehrin-gelecegini-once-simule-edelim-katilimci-planlamada-karar-destek-araclari/" rel="alternate" type="text/html" title="Şehrin Geleceğini Önce Simüle Edelim: Katılımcı Planlamada Karar Destek Araçları" /><published>2026-11-02T00:00:00+00:00</published><updated>2026-11-02T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/sehrin-gelecegini-once-simule-edelim-katilimci-planlamada-karar-destek-araclari</id><content type="html" xml:base="https://program.sonsuz.us/posts/sehrin-gelecegini-once-simule-edelim-katilimci-planlamada-karar-destek-araclari/"><![CDATA[<p>Mahallenizdeki otoparkın parka dönüştürülmesini önerdiniz. Harika! Peki trafik, erişilebilirlik ve belediye bütçesi bundan nasıl etkilenir? Katılımcı şehir planlamasında simülasyon tabanlı karar destek araçları, vatandaş fikirlerini ölçülebilir senaryolara dönüştürür. Böylece tartışma, “Bence güzel olur” seviyesinden “Hangi koşullarda, kimler için güzel olur?” seviyesine taşınır. Şehir, pahalı değişikliklerden önce dijital bir prova yapar.</p>

<p><img src="/img/sehrin-gelecegini-once-74.svg" alt="sehrin-gelecegini-once-74" /></p>

<p>``</p>

<h2 id="vatandaş-fikrinden-çalıştırılabilir-senaryoya">Vatandaş fikrinden çalıştırılabilir senaryoya</h2>

<p>Yazılım, “Daha yaşanabilir bir sokak istiyoruz” cümlesini doğrudan hesaplayamaz. Önce önerinin konumu, kapsamı ve beklenen davranış değişikliği tanımlanmalıdır. Örneğin bir bisiklet yolu önerisi; yol kapasitesi, bisiklete geçiş oranı, kavşak düzeni ve yatırım maliyeti gibi parametrelere ayrılır.</p>

<p>Burada vatandaş yalnızca fikir veren kişi değildir: Senaryonun varsayımlarını doğrulayan bir ortak tasarımcıdır. “Bu güzergâh okul saatinde kalabalıklaşıyor” bilgisi, günlük ortalamaların gizlediği önemli bir ayrıntıyı ortaya çıkarabilir.</p>

<table>
  <thead>
    <tr>
      <th>Vatandaş önerisi</th>
      <th>Modeldeki karşılığı</th>
      <th>İzlenecek gösterge</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bisiklet yolu açılsın</td>
      <td>Kapasite ve ulaşım tercihi değişimi</td>
      <td>Yolculuk süresi, güvenlik</td>
    </tr>
    <tr>
      <td>Otobüs seferleri artırılsın</td>
      <td>Sefer aralığı ve araç kapasitesi</td>
      <td>Bekleme, erişilebilirlik</td>
    </tr>
    <tr>
      <td>Otopark parka dönüşsün</td>
      <td>Arazi kullanımı değişimi</td>
      <td>Yeşil alana erişim, maliyet</td>
    </tr>
  </tbody>
</table>

<h2 id="simülasyonun-teorik-motoru">Simülasyonun teorik motoru</h2>

<p>Bir simülasyon; sistemin durumunu, aktörlerini ve zaman içindeki değişimini temsil eder. Ajan tabanlı modellerde insanlar farklı tercihlerle hareket ederken, trafik modelleri araç akışını ve kuyruk oluşumunu hesaplayabilir. SUMO ulaşım simülasyonu, Mesa ise ajan tabanlı deneyler için değerlendirilebilecek araçlardır.</p>

<p>Basitleştirilmiş bir yol bağlantısında seyahat süresi, BPR fonksiyonuyla modellenebilir:</p>

\[t=t_0\left[1+\alpha\left(\frac{v}{c}\right)^\beta\right]\]

<p>Burada $t_0$ serbest akış süresi, $v$ araç akışı, $c$ kapasitedir. $\alpha$ ve $\beta$ yerel ölçümlerle kalibre edilmelidir. Temel fikir şudur: Kapasiteye yaklaşırken gecikme doğrusal artmak zorunda değildir. Ancak bu formül tek başına kavşakları, kuyruk taşmasını veya bütün ulaşım ağını açıklamaz.</p>

<h2 id="veriden-deney-düzenine">Veriden deney düzenine</h2>

<p>Önce mevcut durum modeli kurulur; yol ağı, nüfus, seferler ve anonimleştirilmiş sayımlar birleştirilir. Model, ayrı tutulan gözlemlerle doğrulanır. Ardından her öneri aynı başlangıç koşullarıyla karşılaştırılır. Aksi hâlde yağmurlu pazartesi ile güneşli pazar gününü yarıştırmış oluruz!</p>

<p>Talep belirsizliğini incelemek için Monte Carlo yaklaşımıyla çok sayıda olası gün üretilebilir. Aynı rastgele talepleri bütün senaryolarda kullanmak, karşılaştırmadaki gereksiz gürültüyü azaltır.</p>

<h2 id="python-ile-küçük-bir-senaryo-laboratuvarı">Python ile küçük bir senaryo laboratuvarı</h2>

<p>Aşağıdaki örnek, bisiklet yatırımı sonrasında otomobil tercihinin azalabileceği varsayımını test eder. Tam bir şehir modeli değildir; yalnızca tek bağlantının gecikmesini hesaplayan öğretici bir prototiptir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">dataclasses</span> <span class="kn">import</span> <span class="n">dataclass</span>
<span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="nd">@dataclass</span><span class="p">(</span><span class="n">frozen</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Scenario</span><span class="p">:</span>
    <span class="n">capacity</span><span class="p">:</span> <span class="nb">float</span>  <span class="c1"># araç/saat
</span>    <span class="n">car_share</span><span class="p">:</span> <span class="nb">float</span>

<span class="n">rng</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">default_rng</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
<span class="n">demand</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">clip</span><span class="p">(</span><span class="n">rng</span><span class="p">.</span><span class="nf">normal</span><span class="p">(</span><span class="mi">1800</span><span class="p">,</span> <span class="mi">180</span><span class="p">,</span> <span class="mi">1000</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="n">scenarios</span> <span class="o">=</span> <span class="p">{</span>
    <span class="sh">"</span><span class="s">mevcut</span><span class="sh">"</span><span class="p">:</span> <span class="nc">Scenario</span><span class="p">(</span><span class="mi">1200</span><span class="p">,</span> <span class="mf">0.70</span><span class="p">),</span>
    <span class="sh">"</span><span class="s">bisiklet</span><span class="sh">"</span><span class="p">:</span> <span class="nc">Scenario</span><span class="p">(</span><span class="mi">1000</span><span class="p">,</span> <span class="mf">0.55</span><span class="p">),</span>
<span class="p">}</span>

<span class="k">def</span> <span class="nf">travel_time</span><span class="p">(</span><span class="n">scenario</span><span class="p">:</span> <span class="n">Scenario</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">np</span><span class="p">.</span><span class="n">ndarray</span><span class="p">:</span>
    <span class="c1"># Talep kişi/saat; doluluk 1.2 kişi/araç varsayılıyor.
</span>    <span class="n">flow</span> <span class="o">=</span> <span class="n">demand</span> <span class="o">*</span> <span class="n">scenario</span><span class="p">.</span><span class="n">car_share</span> <span class="o">/</span> <span class="mf">1.2</span>
    <span class="k">return</span> <span class="mi">12</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="mf">0.15</span> <span class="o">*</span> <span class="p">(</span><span class="n">flow</span> <span class="o">/</span> <span class="n">scenario</span><span class="p">.</span><span class="n">capacity</span><span class="p">)</span> <span class="o">**</span> <span class="mi">4</span><span class="p">)</span>

<span class="n">baseline</span> <span class="o">=</span> <span class="nf">travel_time</span><span class="p">(</span><span class="n">scenarios</span><span class="p">[</span><span class="sh">"</span><span class="s">mevcut</span><span class="sh">"</span><span class="p">])</span>
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">scenario</span> <span class="ow">in</span> <span class="n">scenarios</span><span class="p">.</span><span class="nf">items</span><span class="p">():</span>
    <span class="n">times</span> <span class="o">=</span> <span class="nf">travel_time</span><span class="p">(</span><span class="n">scenario</span><span class="p">)</span>
    <span class="n">delta</span> <span class="o">=</span> <span class="n">times</span> <span class="o">-</span> <span class="n">baseline</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="p">{</span>
        <span class="sh">"</span><span class="s">ortalama_dakika</span><span class="sh">"</span><span class="p">:</span> <span class="nf">round</span><span class="p">(</span><span class="nf">float</span><span class="p">(</span><span class="n">times</span><span class="p">.</span><span class="nf">mean</span><span class="p">()),</span> <span class="mi">2</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">p95_dakika</span><span class="sh">"</span><span class="p">:</span> <span class="nf">round</span><span class="p">(</span><span class="nf">float</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">percentile</span><span class="p">(</span><span class="n">times</span><span class="p">,</span> <span class="mi">95</span><span class="p">)),</span> <span class="mi">2</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">iyilesme_orani</span><span class="sh">"</span><span class="p">:</span> <span class="nf">round</span><span class="p">(</span><span class="nf">float</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">mean</span><span class="p">(</span><span class="n">delta</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)),</span> <span class="mi">3</span><span class="p">),</span>
    <span class="p">})</span>
</code></pre></div></div>

<p>Kod, bin talep örneğinde ortalama süreyi, yüzde 95’lik dilimi ve mevcut duruma göre iyileşme oranını raporlar. Buradaki yüzde 95’lik dilim bir güven aralığı değildir. Otomobil payları, doluluk ve kapasite değerleri varsayımsaldır; sonuçlar gerçek bir yatırımın başarısını kanıtlamaz. Özellikle otomobilden bisiklete geçiş oranı farklı değerlerle tekrar denenmelidir. Ayrıca hesaplanan süre yalnızca otomobillerin bu bağlantıdaki süresidir.</p>

<h2 id="tek-puan-mı-şeffaf-karşılaştırma-mı">Tek puan mı, şeffaf karşılaştırma mı?</h2>

<p>Karar desteği trafik hızından ibaret olmamalıdır. Çevresel fayda, erişilebilirlik, dağıtımsal adalet ve bütçeye uygunluk birlikte değerlendirilebilir:</p>

\[S=0.35E+0.25A+0.25D+0.15K\]

<p>Burada bütün göstergeler $[0,1]$ aralığına dönüştürülür ve yüksek değer daha iyi durumu gösterir. Ağırlıklar teknik gerçek değil, toplumsal tercihtir. Bu yüzden katılımcılar ağırlıkları değiştirebilmeli; uygulama toplam puanın yanında ham ölçümleri, mahalle bazındaki etkileri ve hangi seçeneğin hangi ölçütte üstün olduğunu göstermelidir.</p>

<h2 id="güvenilir-katılımın-kontrol-listesi">Güvenilir katılımın kontrol listesi</h2>

<p>Çevrim içi öneriler bütün nüfusu temsil etmeyebilir. Yüz yüze toplantılar, erişilebilir arayüzler ve farklı mahallelerden katılım bu açığı azaltır. Sonuçlar gelir, yaş ve engellilik açısından dağıtımsal etkilerle incelenmeli; hassas bilgiler korunmalıdır. Varsayımlar, veri tarihleri ve model sürümleri kaydedilmelidir. Ayrıca inşaat dönemi gibi geçici etkiler unutulmamalıdır.</p>

<p>Sonuçta iyi bir karar destek aracı belediye başkanı rolüne soyunmaz. Alternatifleri görünür kılar, belirsizliği açıklar ve vatandaşların gerekçeli tartışmasını güçlendirir. En değerli çıktı, tek bir kazanan değil; birlikte anlaşılmış bir karar sürecidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="şehir planlama" /><category term="katılımcı tasarım" /><category term="simülasyon" /><category term="python" /><category term="karar destek" /><category term="açık veri" /><summary type="html"><![CDATA[Mahallenizdeki otoparkın parka dönüştürülmesini önerdiniz. Harika! Peki trafik, erişilebilirlik ve belediye bütçesi bundan nasıl etkilenir? Katılımcı şehir planlamasında simülasyon tabanlı karar destek araçları, vatandaş fikirlerini ölçülebilir senaryolara dönüştürür. Böylece tartışma, “Bence güzel olur” seviyesinden “Hangi koşullarda, kimler için güzel olur?” seviyesine taşınır. Şehir, pahalı değişikliklerden önce dijital bir prova yapar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/sehrin-gelecegini-once-74.png" /><media:content medium="image" url="https://program.sonsuz.us/img/sehrin-gelecegini-once-74.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Şehrin Sıcak Noktalarını Bulmak: Uydu ve Sensör Verileriyle Kentsel Isı Adası Haritalama</title><link href="https://program.sonsuz.us/posts/sehrin-sicak-noktalarini-bulmak-uydu-ve-sensor-verileriyle-kentsel-isi-adasi-haritalama/" rel="alternate" type="text/html" title="Şehrin Sıcak Noktalarını Bulmak: Uydu ve Sensör Verileriyle Kentsel Isı Adası Haritalama" /><published>2026-11-02T00:00:00+00:00</published><updated>2026-11-02T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/sehrin-sicak-noktalarini-bulmak-uydu-ve-sensor-verileriyle-kentsel-isi-adasi-haritalama</id><content type="html" xml:base="https://program.sonsuz.us/posts/sehrin-sicak-noktalarini-bulmak-uydu-ve-sensor-verileriyle-kentsel-isi-adasi-haritalama/"><![CDATA[<p>Yazın aynı şehirde bir park serinletirken asfalt bir meydan neden fırın gibi hissettirir? Cevap yalnızca güneşte değil; yapı malzemelerinde, bitki örtüsünde ve hava dolaşımında saklıdır. Uydu görüntülerini yer sensörleriyle birleştirerek bu farkları ölçebilir, şehrin termal dedektifi olabiliriz. Ancak güzel bir harita çizmeden önce, hangi sıcaklığı ölçtüğümüzü anlamamız gerekir.</p>

<p><img src="/img/sehrin-sicak-noktalarini-58.svg" alt="sehrin-sicak-noktalarini-58" /></p>

<p>``</p>

<h2 id="isı-adasının-fiziksel-mantığı">Isı adasının fiziksel mantığı</h2>

<p>Kentsel ısı adası, kentlerin çevresindeki kırsal alanlardan daha sıcak olmasıdır. Beton ve asfalt güneş enerjisini depolar; azalan bitki örtüsü, buharlaşma ve terleme yoluyla soğutmayı sınırlar. Binalar hava akışını değiştirirken trafik ve klimalar ek ısı üretir. Gece olduğunda depolanan enerji yavaşça salınır. Yani şehir, gündüz şarj olan dev bir termal batarya gibi davranabilir.</p>

<p>Hava sıcaklığına dayalı etkiyi şöyle tanımlayabiliriz:</p>

\[\Delta T_{hava}(t)=T_{kent}(t)-T_{kırsal}(t)\]

<p>Burada karşılaştırılan ölçümler aynı zaman aralığına ait olmalıdır. Referans alanın rakımı, denize uzaklığı ve arazi kullanımı da sonucu etkiler. Rastgele seçilen tek bir kırsal sensör, bütün karşılaştırmayı yanıltabilir.</p>

<h2 id="uydu-ve-sensör-aynı-şeyi-ölçmez">Uydu ve sensör aynı şeyi ölçmez</h2>

<p>Termal uydu ürünleri <strong>yüzey sıcaklığını</strong>, uygun yerleştirilmiş meteorolojik sensörler ise <strong>hava sıcaklığını</strong> temsil eder. Güneşteki asfalt yüzeyiyle iki metre yükseklikteki hava arasında ciddi fark olabilir. Bu nedenle ikisini tek sıcaklık sütununda karıştırmak, elmayla tost makinesini karşılaştırmaya benzer.</p>

<table>
  <thead>
    <tr>
      <th>Veri kaynağı</th>
      <th>Temel ölçüm</th>
      <th>Güçlü tarafı</th>
      <th>Sınırlaması</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Landsat 8/9 termal ürünleri</td>
      <td>Yüzey sıcaklığı</td>
      <td>Şehir genelinde karşılaştırma</td>
      <td>Bulutlar ve seyrek geçişler</td>
    </tr>
    <tr>
      <td>Sentinel-2</td>
      <td>Yansıtım ve bitki örtüsü</td>
      <td>Yeşil alanları ayrıştırma</td>
      <td>Doğrudan termal ölçüm yapmaz</td>
    </tr>
    <tr>
      <td>Yer sensörleri</td>
      <td>Hava sıcaklığı</td>
      <td>Sık zamanlı gözlem</td>
      <td>Konum ve kurulum yanlılığı</td>
    </tr>
  </tbody>
</table>

<p>Landsat termal bantlarının doğal çözünürlüğü yaklaşık 100 metredir; 30 metrelik ürün pikseli, bağımsız 30 metrelik termal ayrıntı anlamına gelmez.</p>

<p>Bitki örtüsünü incelemek için Sentinel-2 üzerinden şu gösterge hesaplanabilir:</p>

\[NDVI=\frac{NIR-Red}{NIR+Red}\]

<p>Yüksek NDVI genellikle daha yoğun bitki örtüsünü gösterir. Ancak düşük sıcaklığın tek açıklaması değildir; gölge, nem ve rüzgâr da önemlidir.</p>

<h2 id="analiz-hattını-hazırlayalım">Analiz hattını hazırlayalım</h2>

<ol>
  <li><strong>Veriyi temizleyin:</strong> Uydu kalite bantlarıyla bulutları maskeleyin. Ürünün ölçek ve ofset bilgilerini uygulayıp sıcaklığı Celsius’a dönüştürün. Sensörlerde hatalı kayıtları ve kalibrasyon sorunlarını kontrol edin.</li>
  <li><strong>Zamanı eşleyin:</strong> Sensörleri gerçek uydu geçişinin çevresindeki dar bir zaman penceresinde özetleyin. Günlük ortalamayla anlık uydu görüntüsünü karşılaştırmayın.</li>
  <li><strong>Mekânı eşleyin:</strong> Verileri aynı, metre birimli yerel koordinat sistemine taşıyın. Örneğin 250 metrelik hücreler oluşturun; bu seçim yeni ayrıntı üretmez.</li>
  <li><strong>Referansı belirleyin:</strong> Birden fazla uygun kırsal istasyonu değerlendirin. Kent ve kırsal sensörlerin benzer koşullarda kurulmasına dikkat edin.</li>
</ol>

<h2 id="python-ile-iki-ayrı-sıcaklık-haritası">Python ile iki ayrı sıcaklık haritası</h2>

<p>Aşağıdaki örnek, hazırlanmış Celsius rasterini hücrelerde özetler ve sensörlerin kırsal referansa göre hava sıcaklığı farkını hesaplar. <code class="language-plaintext highlighter-rouge">geopandas</code>, <code class="language-plaintext highlighter-rouge">pandas</code>, <code class="language-plaintext highlighter-rouge">rasterstats</code> ve <code class="language-plaintext highlighter-rouge">matplotlib</code> gerekir. Grid ile raster aynı koordinat sisteminde olmalıdır.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">geopandas</span> <span class="k">as</span> <span class="n">gpd</span>
<span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>
<span class="kn">import</span> <span class="n">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="kn">from</span> <span class="n">rasterstats</span> <span class="kn">import</span> <span class="n">zonal_stats</span>

<span class="n">grid</span> <span class="o">=</span> <span class="n">gpd</span><span class="p">.</span><span class="nf">read_file</span><span class="p">(</span><span class="sh">'</span><span class="s">grid_250m.gpkg</span><span class="sh">'</span><span class="p">)</span>
<span class="n">obs</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nf">read_csv</span><span class="p">(</span><span class="sh">'</span><span class="s">sensorler.csv</span><span class="sh">'</span><span class="p">)</span>
<span class="n">obs</span><span class="p">[</span><span class="sh">'</span><span class="s">zaman</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nf">to_datetime</span><span class="p">(</span><span class="n">obs</span><span class="p">[</span><span class="sh">'</span><span class="s">zaman</span><span class="sh">'</span><span class="p">],</span> <span class="n">utc</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>

<span class="c1"># Gerçek uydu geçiş zamanıyla değiştirin.
</span><span class="n">t</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">Timestamp</span><span class="p">(</span><span class="sh">'</span><span class="s">2026-07-15T08:00:00Z</span><span class="sh">'</span><span class="p">)</span>
<span class="n">obs</span> <span class="o">=</span> <span class="n">obs</span><span class="p">[(</span><span class="n">obs</span><span class="p">[</span><span class="sh">'</span><span class="s">zaman</span><span class="sh">'</span><span class="p">]</span> <span class="o">-</span> <span class="n">t</span><span class="p">).</span><span class="nf">abs</span><span class="p">()</span> <span class="o">&lt;=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">Timedelta</span><span class="p">(</span><span class="sh">'</span><span class="s">15min</span><span class="sh">'</span><span class="p">)]</span>
<span class="n">obs</span> <span class="o">=</span> <span class="n">obs</span><span class="p">.</span><span class="nf">groupby</span><span class="p">(</span>
    <span class="p">[</span><span class="sh">'</span><span class="s">sensor_id</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">lon</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">lat</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">tur</span><span class="sh">'</span><span class="p">],</span> <span class="n">as_index</span><span class="o">=</span><span class="bp">False</span>
<span class="p">).</span><span class="nf">agg</span><span class="p">(</span><span class="n">t_air</span><span class="o">=</span><span class="p">(</span><span class="sh">'</span><span class="s">sicaklik_c</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">mean</span><span class="sh">'</span><span class="p">))</span>

<span class="n">ref</span> <span class="o">=</span> <span class="n">obs</span><span class="p">.</span><span class="n">loc</span><span class="p">[</span><span class="n">obs</span><span class="p">[</span><span class="sh">'</span><span class="s">tur</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="sh">'</span><span class="s">kirsal</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">t_air</span><span class="sh">'</span><span class="p">].</span><span class="nf">mean</span><span class="p">()</span>
<span class="k">if</span> <span class="n">pd</span><span class="p">.</span><span class="nf">isna</span><span class="p">(</span><span class="n">ref</span><span class="p">):</span>
    <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">'</span><span class="s">Zaman penceresinde kırsal referans yok.</span><span class="sh">'</span><span class="p">)</span>

<span class="n">points</span> <span class="o">=</span> <span class="n">gpd</span><span class="p">.</span><span class="nc">GeoDataFrame</span><span class="p">(</span>
    <span class="n">obs</span><span class="p">,</span> <span class="n">geometry</span><span class="o">=</span><span class="n">gpd</span><span class="p">.</span><span class="nf">points_from_xy</span><span class="p">(</span><span class="n">obs</span><span class="p">.</span><span class="n">lon</span><span class="p">,</span> <span class="n">obs</span><span class="p">.</span><span class="n">lat</span><span class="p">),</span>
    <span class="n">crs</span><span class="o">=</span><span class="sh">'</span><span class="s">EPSG:4326</span><span class="sh">'</span>
<span class="p">).</span><span class="nf">to_crs</span><span class="p">(</span><span class="n">grid</span><span class="p">.</span><span class="n">crs</span><span class="p">)</span>

<span class="n">stats</span> <span class="o">=</span> <span class="nf">zonal_stats</span><span class="p">(</span><span class="n">grid</span><span class="p">,</span> <span class="sh">'</span><span class="s">lst_celsius.tif</span><span class="sh">'</span><span class="p">,</span>
                    <span class="n">stats</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">mean</span><span class="sh">'</span><span class="p">],</span> <span class="n">nodata</span><span class="o">=-</span><span class="mi">9999</span><span class="p">)</span>
<span class="n">grid</span><span class="p">[</span><span class="sh">'</span><span class="s">lst_c</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">s</span><span class="p">[</span><span class="sh">'</span><span class="s">mean</span><span class="sh">'</span><span class="p">]</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">stats</span><span class="p">]</span>
<span class="n">joined</span> <span class="o">=</span> <span class="n">gpd</span><span class="p">.</span><span class="nf">sjoin</span><span class="p">(</span><span class="n">points</span><span class="p">,</span> <span class="n">grid</span><span class="p">[[</span><span class="sh">'</span><span class="s">geometry</span><span class="sh">'</span><span class="p">]],</span>
                   <span class="n">how</span><span class="o">=</span><span class="sh">'</span><span class="s">inner</span><span class="sh">'</span><span class="p">,</span> <span class="n">predicate</span><span class="o">=</span><span class="sh">'</span><span class="s">within</span><span class="sh">'</span><span class="p">)</span>
<span class="n">means</span> <span class="o">=</span> <span class="n">joined</span><span class="p">.</span><span class="nf">groupby</span><span class="p">(</span><span class="sh">'</span><span class="s">index_right</span><span class="sh">'</span><span class="p">)[</span><span class="sh">'</span><span class="s">t_air</span><span class="sh">'</span><span class="p">].</span><span class="nf">mean</span><span class="p">()</span>
<span class="n">grid</span><span class="p">[</span><span class="sh">'</span><span class="s">delta_air</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">grid</span><span class="p">.</span><span class="n">index</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="n">means</span><span class="p">)</span> <span class="o">-</span> <span class="n">ref</span>

<span class="n">fig</span><span class="p">,</span> <span class="n">axes</span> <span class="o">=</span> <span class="n">plt</span><span class="p">.</span><span class="nf">subplots</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="mi">5</span><span class="p">))</span>
<span class="k">for</span> <span class="n">ax</span><span class="p">,</span> <span class="n">column</span> <span class="ow">in</span> <span class="nf">zip</span><span class="p">(</span><span class="n">axes</span><span class="p">,</span> <span class="p">[</span><span class="sh">'</span><span class="s">lst_c</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">delta_air</span><span class="sh">'</span><span class="p">]):</span>
    <span class="n">grid</span><span class="p">.</span><span class="nf">plot</span><span class="p">(</span><span class="n">column</span><span class="o">=</span><span class="n">column</span><span class="p">,</span> <span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">,</span> <span class="n">legend</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
              <span class="n">missing_kwds</span><span class="o">=</span><span class="p">{</span><span class="sh">'</span><span class="s">color</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">lightgrey</span><span class="sh">'</span><span class="p">})</span>
    <span class="n">ax</span><span class="p">.</span><span class="nf">set_title</span><span class="p">(</span><span class="n">column</span> <span class="o">+</span> <span class="sh">'</span><span class="s"> (°C)</span><span class="sh">'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">show</span><span class="p">()</span>
</code></pre></div></div>

<p>Önce her sensörün zaman ortalaması alınır; böylece sık kayıt yapan cihaz referansı gereksizce domine etmez. Mekânsal birleştirme sensörleri hücrelere atar. Sensör bulunmayan hücreler gri kalır: <strong>veri yokluğu, serinlik değildir</strong>.</p>

<h2 id="haritayı-doğru-yorumlamak">Haritayı doğru yorumlamak</h2>

<p>Sıcak yüzeylerle düşük NDVI birlikte görülüyorsa yeşil altyapı için aday bölgeler belirlenebilir. Yine de korelasyon, nedensellik kanıtı değildir. Rakım, yapı yoğunluğu ve kıyı etkisini ayrıca değerlendirin.</p>

<p>Tek görüntü yerine farklı günleri ve mümkünse gece ölçümlerini karşılaştırın. İnterpolasyon veya tahmin modeli kullanıyorsanız yakın noktaları rastgele bölmek yerine mekânsal doğrulama yapın; aksi hâlde başarı olduğundan yüksek görünebilir. Son haritaya tarih, birim, bulut boşlukları ve belirsizlik bilgisi ekleyin. Amaç yalnızca kırmızı bölgeler çizmek değil, nerede gölgeye ve serinlemeye ihtiyaç olduğunu güvenilir biçimde göstermektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="veri analizi" /><category term="kentsel ısı adası" /><category term="python" /><category term="uydu verileri" /><category term="coğrafi bilgi sistemleri" /><category term="iklim" /><summary type="html"><![CDATA[Yazın aynı şehirde bir park serinletirken asfalt bir meydan neden fırın gibi hissettirir? Cevap yalnızca güneşte değil; yapı malzemelerinde, bitki örtüsünde ve hava dolaşımında saklıdır. Uydu görüntülerini yer sensörleriyle birleştirerek bu farkları ölçebilir, şehrin termal dedektifi olabiliriz. Ancak güzel bir harita çizmeden önce, hangi sıcaklığı ölçtüğümüzü anlamamız gerekir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/sehrin-sicak-noktalarini-58.png" /><media:content medium="image" url="https://program.sonsuz.us/img/sehrin-sicak-noktalarini-58.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Uydu Nerede? Kepler Denklemleriyle Yörünge Hesaplayan Bir Python Projesi</title><link href="https://program.sonsuz.us/posts/uydu-nerede-kepler-denklemleriyle-yorunge-hesaplayan-bir-python-projesi/" rel="alternate" type="text/html" title="Uydu Nerede? Kepler Denklemleriyle Yörünge Hesaplayan Bir Python Projesi" /><published>2026-11-02T00:00:00+00:00</published><updated>2026-11-02T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/uydu-nerede-kepler-denklemleriyle-yorunge-hesaplayan-bir-python-projesi</id><content type="html" xml:base="https://program.sonsuz.us/posts/uydu-nerede-kepler-denklemleriyle-yorunge-hesaplayan-bir-python-projesi/"><![CDATA[<p><img src="/img/uydu-nerede-kepler-38.svg" alt="uydu-nerede-kepler-38" /></p>

<p>Bir uyduyu uzaya göndermek heyecanlıdır; fakat birkaç dakika sonra nerede olacağını bilmek de oldukça önemlidir! Haberleşme antenleri, gözlem planları ve uzay simülasyonları aynı soruya dayanır: Zaman ilerlediğinde cismin konumu nasıl değişir? Bu yazıda Kepler denklemini sayısal olarak çözüp eliptik bir yörüngenin konumunu Python ile hesaplayacağız.
``</p>

<h2 id="önce-fizik-i̇ki-cisimlik-evren">Önce fizik: İki cisimlik evren</h2>

<p>Modelimizde uydu ve merkezî gök cismi dışında kimse yok. Atmosfer, diğer gezegenler ve Dünya’nın basıklığı şimdilik sahne arkasında. Bu <strong>iki cisim yaklaşımında</strong>, bağlı bir yörünge elipstir ve merkezî cisim elipsin odaklarından birinde bulunur.</p>

<p>Yörüngeyi tanımlayan temel büyüklükler, yarı büyük eksen $a$ ve dışmerkezlik $e$ değerleridir. Dairesel yörüngede $e=0$, eliptik yörüngede $0&lt;e&lt;1$ olur. Kütleçekim parametresi $\mu=G(m_1+m_2)$ biçimindedir; küçük bir uydu için Dünya’nın değeri yaklaşık $398600.4418\;\mathrm{km^3/s^2}$ alınabilir.</p>

<p>Ortalama açısal hareket ve yörünge periyodu şöyle hesaplanır:</p>

\[n=\sqrt{\frac{\mu}{a^3}},\qquad T=\frac{2\pi}{n}\]

<p>Kilometre kullanıyorsanız bütün uzunlukları kilometre tutmalısınız. Birim karışıklığı, uydunuzu matematiksel olarak başka bir galaksiye göndermenin hızlı yoludur.</p>

<h2 id="zaman-neden-doğrudan-açı-değildir">Zaman neden doğrudan açı değildir?</h2>

<p>Kepler’in ikinci yasası nedeniyle uydu, merkezî cisme yakınken daha hızlı hareket eder. Dolayısıyla elips üzerinde sabit açısal hız varsayamayız. Bunun yerine zamanı, düzgün artan <strong>ortalama anomaliye</strong> dönüştürürüz:</p>

\[M(t)=M_0+n(t-t_0)\]

<p>Buradaki $M_0$, başlangıç anındaki ortalama anomalidir. Gerçek konuma geçmek için yardımcı bir açı olan <strong>eksantrik anomaliyi</strong>, yani $E$ değerini bulmalıyız:</p>

\[M=E-e\sin E\]

<p>Bu, meşhur Kepler denklemidir. Genel eliptik durumda $E$ için basit bir kapalı çözüm bulunmadığından sayısal yöntemlere başvururuz. Ortalama anomaliyi doğrudan geometrik açı sanmak, özellikle uzamış elipslerde belirgin konum hataları üretir.</p>

<h2 id="sayısal-yöntem-seçimi">Sayısal yöntem seçimi</h2>

<p>Çözmek istediğimiz fonksiyon $f(E)=E-e\sin E-M$, türevi ise $f’(E)=1-e\cos E$ olur. Eliptik yörüngelerde türev pozitiftir; böylece seçtiğimiz aralıkta kök tektir.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th>Avantajı</th>
      <th>Dikkat edilmesi gereken</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Newton–Raphson</td>
      <td>Kök yakınında çok hızlıdır</td>
      <td>Başlangıç tahminine duyarlıdır</td>
    </tr>
    <tr>
      <td>İkiye bölme</td>
      <td>Kökü çevreleyen aralıkta güvenilirdir</td>
      <td>Daha yavaş yakınsar</td>
    </tr>
    <tr>
      <td>Hibrit yöntem</td>
      <td>Hız ve güvenilirliği birleştirir</td>
      <td>Aralık takibi gerektirir</td>
    </tr>
  </tbody>
</table>

<p>Newton güncellemesi $E_{k+1}=E_k-f(E_k)/f’(E_k)$ şeklindedir. Aşağıdaki kod, Newton adımı güvenli aralığın dışına çıkarsa ikiye bölmeye geçer. Böylece yüksek dışmerkezliklerde de daha dayanıklı davranır.</p>

<h2 id="python-ile-konumu-hesaplayalım">Python ile konumu hesaplayalım</h2>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">math</span>


<span class="k">def</span> <span class="nf">kepler</span><span class="p">(</span><span class="n">M</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">tol</span><span class="o">=</span><span class="mf">1e-13</span><span class="p">):</span>
    <span class="n">M</span> <span class="o">=</span> <span class="p">(</span><span class="n">M</span> <span class="o">+</span> <span class="n">math</span><span class="p">.</span><span class="n">pi</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">math</span><span class="p">.</span><span class="n">pi</span><span class="p">)</span> <span class="o">-</span> <span class="n">math</span><span class="p">.</span><span class="n">pi</span>
    <span class="n">lo</span><span class="p">,</span> <span class="n">hi</span> <span class="o">=</span> <span class="o">-</span><span class="n">math</span><span class="p">.</span><span class="n">pi</span><span class="p">,</span> <span class="n">math</span><span class="p">.</span><span class="n">pi</span>
    <span class="n">E</span> <span class="o">=</span> <span class="n">M</span> <span class="k">if</span> <span class="n">e</span> <span class="o">&lt;</span> <span class="mf">0.8</span> <span class="k">else</span> <span class="n">math</span><span class="p">.</span><span class="nf">copysign</span><span class="p">(</span><span class="n">math</span><span class="p">.</span><span class="n">pi</span><span class="p">,</span> <span class="n">M</span><span class="p">)</span>

    <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">80</span><span class="p">):</span>
        <span class="n">f</span> <span class="o">=</span> <span class="n">E</span> <span class="o">-</span> <span class="n">e</span> <span class="o">*</span> <span class="n">math</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="n">E</span><span class="p">)</span> <span class="o">-</span> <span class="n">M</span>
        <span class="k">if</span> <span class="nf">abs</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">tol</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">E</span>

        <span class="k">if</span> <span class="n">f</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
            <span class="n">hi</span> <span class="o">=</span> <span class="n">E</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">lo</span> <span class="o">=</span> <span class="n">E</span>

        <span class="n">candidate</span> <span class="o">=</span> <span class="n">E</span> <span class="o">-</span> <span class="n">f</span> <span class="o">/</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">e</span> <span class="o">*</span> <span class="n">math</span><span class="p">.</span><span class="nf">cos</span><span class="p">(</span><span class="n">E</span><span class="p">))</span>
        <span class="n">E</span> <span class="o">=</span> <span class="n">candidate</span> <span class="k">if</span> <span class="n">lo</span> <span class="o">&lt;</span> <span class="n">candidate</span> <span class="o">&lt;</span> <span class="n">hi</span> <span class="nf">else </span><span class="p">(</span><span class="n">lo</span> <span class="o">+</span> <span class="n">hi</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span>

    <span class="k">raise</span> <span class="nc">RuntimeError</span><span class="p">(</span><span class="sh">'</span><span class="s">Kepler çözümü yakınsamadı</span><span class="sh">'</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">position</span><span class="p">(</span><span class="n">dt</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">M0</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">mu</span><span class="o">=</span><span class="mf">398600.4418</span><span class="p">):</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">a</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">mu</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="mi">0</span> <span class="o">&lt;=</span> <span class="n">e</span> <span class="o">&lt;</span> <span class="mi">1</span><span class="p">):</span>
        <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">'</span><span class="s">Eliptik yörünge parametrelerini kontrol edin</span><span class="sh">'</span><span class="p">)</span>

    <span class="n">n</span> <span class="o">=</span> <span class="n">math</span><span class="p">.</span><span class="nf">sqrt</span><span class="p">(</span><span class="n">mu</span> <span class="o">/</span> <span class="n">a</span><span class="o">**</span><span class="mi">3</span><span class="p">)</span>
    <span class="n">E</span> <span class="o">=</span> <span class="nf">kepler</span><span class="p">(</span><span class="n">M0</span> <span class="o">+</span> <span class="n">n</span> <span class="o">*</span> <span class="n">dt</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
    <span class="n">x</span> <span class="o">=</span> <span class="n">a</span> <span class="o">*</span> <span class="p">(</span><span class="n">math</span><span class="p">.</span><span class="nf">cos</span><span class="p">(</span><span class="n">E</span><span class="p">)</span> <span class="o">-</span> <span class="n">e</span><span class="p">)</span>
    <span class="n">y</span> <span class="o">=</span> <span class="n">a</span> <span class="o">*</span> <span class="n">math</span><span class="p">.</span><span class="nf">sqrt</span><span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">e</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span> <span class="o">*</span> <span class="n">math</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="n">E</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span>


<span class="nf">print</span><span class="p">(</span><span class="nf">position</span><span class="p">(</span><span class="n">dt</span><span class="o">=</span><span class="mi">1200</span><span class="p">,</span> <span class="n">a</span><span class="o">=</span><span class="mi">7200</span><span class="p">,</span> <span class="n">e</span><span class="o">=</span><span class="mf">0.05</span><span class="p">))</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">dt</code>, başlangıçtan itibaren geçen saniyedir; <code class="language-plaintext highlighter-rouge">M0</code> radyan cinsindendir. Fonksiyon kilometre cinsinden iki koordinat döndürür. Açı normalizasyonu, çözümü tek tur üzerinde tutar. Döngü sınırıysa olası yakınsama sorunlarının sessizce gizlenmesini engeller.</p>

<p>Koordinatların başlangıcı elipsin merkezi değil, kütleçekim odağıdır. Pozitif x ekseni en yakın yaklaşım yönünü gösterir. Kullanılan dönüşüm doğrudan elips geometrisinden gelir:</p>

\[x=a(\cos E-e),\qquad y=a\sqrt{1-e^2}\sin E\]

<h2 id="sonuçları-nasıl-sınarız">Sonuçları nasıl sınarız?</h2>

<p>Önce $e=0$ seçin: Yarıçap sürekli $a$ olmalıdır. Ardından bir periyot sonraki konumun başlangıçla yaklaşık aynı olduğunu doğrulayın. $M_0=0$ için başlangıç uzaklığı $a(1-e)$, yarım periyot sonraki uzaklık $a(1+e)$ çıkmalıdır. Bunlar hem açı hesabını hem koordinat dönüşümünü sınayan küçük ama güçlü testlerdir.</p>

<p>Örnekteki yörüngenin periyodu yaklaşık 101 dakikadır. Çözüm toleransı denklem artığını sınırlar; özellikle $e$ bire yaklaşırken aynı artık, aynı konum doğruluğunu garanti etmez.</p>

<h2 id="gerçek-uzaya-bir-adım-daha">Gerçek uzaya bir adım daha</h2>

<p>Ürettiğimiz koordinatlar <strong>yörünge düzlemindedir</strong>, henüz Dünya merkezli üç boyutlu konum değildir. Bunun için eğim, çıkış düğümü boylamı ve periapsis argümanıyla dönme dönüşümleri uygulanmalıdır. Dünya’ya bağlı koordinatlar için ayrıca Dünya’nın dönüşü hesaba katılır.</p>

<p>Atmosferik sürükleme ve basıklık etkileri uzun vadede önem kazanır. Buradaki model eğitim ve basit simülasyonlar için harikadır; hassas operasyonel takipte daha kapsamlı modeller gerekir. İlk geliştirme olarak konumları zaman boyunca örnekleyip çizin: Kodunuz artık küçük bir yörünge laboratuvarı!</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="uydu" /><category term="yörünge" /><category term="kepler" /><category term="python" /><category term="sayısal yöntemler" /><category term="astrodinamik" /><summary type="html"><![CDATA[Bir uyduyu uzaya göndermek heyecanlıdır; fakat birkaç dakika sonra nerede olacağını bilmek de oldukça önemlidir! Haberleşme antenleri, gözlem planları ve uzay simülasyonları aynı soruya dayanır: Zaman ilerlediğinde cismin konumu nasıl değişir? Bu yazıda Kepler denklemini sayısal olarak çözüp eliptik bir yörüngenin konumunu Python ile hesaplayacağız.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/uydu-nerede-kepler-38.png" /><media:content medium="image" url="https://program.sonsuz.us/img/uydu-nerede-kepler-38.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Akıllı Hastanelerde Kaynak Optimizasyonu: Yatak, Personel ve Ekipmanı Aynı Ritme Sokmak</title><link href="https://program.sonsuz.us/posts/akilli-hastanelerde-kaynak-optimizasyonu-yatak-personel-ve-ekipmani-ayni-ritme-sokmak/" rel="alternate" type="text/html" title="Akıllı Hastanelerde Kaynak Optimizasyonu: Yatak, Personel ve Ekipmanı Aynı Ritme Sokmak" /><published>2026-11-01T00:00:00+00:00</published><updated>2026-11-01T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/akilli-hastanelerde-kaynak-optimizasyonu-yatak-personel-ve-ekipmani-ayni-ritme-sokmak</id><content type="html" xml:base="https://program.sonsuz.us/posts/akilli-hastanelerde-kaynak-optimizasyonu-yatak-personel-ve-ekipmani-ayni-ritme-sokmak/"><![CDATA[<p>Bir hastaneyi yalnızca boş yatakları sayarak yönetmek, restoranı sadece masa sayısına göre işletmeye benzer: Masalar hazırdır ama aşçı yoksa işler karışır! Hastanelerde de yatak, personel ve ekipman birlikte planlanmalıdır. Akıllı yönetim sistemleri, bu kaynaklar arasındaki bağı algoritmalarla görünür kılar; amaç yalnızca doluluğu artırmak değil, güvenli hizmeti doğru zamanda sunmaktır.</p>

<p><img src="/img/akilli-hastanelerde-kaynak-93.svg" alt="akilli-hastanelerde-kaynak-93" /></p>

<p>``</p>

<h2 id="önce-problemi-doğru-tarif-edelim">Önce problemi doğru tarif edelim</h2>

<p>Kaynak optimizasyonunun temelinde <strong>yöneylem araştırması</strong> bulunur. Sistem; karar değişkenlerini, kısıtları ve hedefleri matematiksel bir modele dönüştürür. Örneğin karar, uygun bir elektif yatışın belirli bir güne planlanıp planlanmayacağı olabilir. Kısıtlar ise kullanılabilir yatakları, bakım saatlerini ve cihaz kapasitesini temsil eder.</p>

<p>Ancak kaynaklar birbirinin yerine geçmez. Boş bir servis yatağı, yoğun bakım yatağının alternatifi değildir; müsait bir çalışan da her uzmanlık görevini üstlenemez. Bu nedenle toplam kapasiteden önce <strong>klinik uygunluk ve yetkinlik</strong> kontrol edilir.</p>

<table>
  <thead>
    <tr>
      <th>Kaynak</th>
      <th>Basit kapasite ölçüsü</th>
      <th>Kritik ek kısıt</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yatak</td>
      <td>Kullanılabilir yatak sayısı</td>
      <td>Servis türü, izolasyon, temizlik</td>
    </tr>
    <tr>
      <td>Personel</td>
      <td>Vardiyadaki çalışma saati</td>
      <td>Yetkinlik, dinlenme, bakım oranı</td>
    </tr>
    <tr>
      <td>Ekipman</td>
      <td>Kullanılabilir cihaz saati</td>
      <td>Cihaz türü, bakım, eşzamanlı kullanım</td>
    </tr>
  </tbody>
</table>

<h2 id="matematik-kapasiteyi-aşmadan-değer-üretmek">Matematik: Kapasiteyi aşmadan değer üretmek</h2>

<p>Basitleştirilmiş bir günlük modelde $x_i$, aday yatış planlanırsa $1$, aksi durumda $0$ olsun. $u_i$ klinik ekipçe belirlenen öncelik puanını, $a_{ir}$ adayın kaynak tüketimini, $C_r$ ise kapasiteyi göstersin:</p>

\[\max \sum_i u_i x_i\]

\[\sum_i a_{ir}x_i \leq C_r \quad \forall r, \qquad x_i\in\{0,1\}\]

<p>Bu yapı, çok boyutlu sırt çantası problemine benzer: Çantamız hastane, bölmeleri ise kaynaklardır. Gerçek modeller ayrıca bekleme süresi, fazla mesai ve iş yükü dengesizliğini ele alır. Bu hedeflerin ağırlıkları gelişigüzel seçilmemeli; klinik yönetişimle belirlenmelidir. Güvenlik şartları, birkaç puan uğruna esnetilen tercihler değil, zorunlu kısıtlardır.</p>

<h2 id="hangi-algoritma-hangi-iş-için">Hangi algoritma, hangi iş için?</h2>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Güçlü tarafı</th>
      <th>Sınırı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Karma tamsayılı programlama</td>
      <td>Doğrusal maliyet ve kapasite modelleri</td>
      <td>Büyük modellerde çözüm süresi</td>
    </tr>
    <tr>
      <td>CP-SAT</td>
      <td>Mantıksal kurallar ve ayrık çizelgeleme</td>
      <td>Doğru modelleme gerektirir</td>
    </tr>
    <tr>
      <td>Açgözlü sezgiseller</td>
      <td>Hızlı başlangıç planı</td>
      <td>En iyi çözümü garanti etmez</td>
    </tr>
  </tbody>
</table>

<p>Önceliği en yüksek hastayı sırayla yerleştirmek caziptir. Fakat bu hasta kıt bir cihazın çoğunu kullanıyorsa, başka uygun kombinasyonlar toplamda daha iyi sonuç verebilir. Optimizasyonun farkı, kararları tek tek değil, birbirleriyle etkileşimleri içinde değerlendirmesidir.</p>

<h2 id="python-ile-küçük-bir-planlama-modeli">Python ile küçük bir planlama modeli</h2>

<p>Aşağıdaki örnek, OR-Tools üzerinden günlük elektif yatış adaylarını seçer. Kurulum için <code class="language-plaintext highlighter-rouge">pip install ortools</code> kullanılabilir. Her satır sırasıyla yatak, hemşirelik saati, cihaz saati ve öncelik puanı içerir; değerler tamamen örnektir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">ortools.sat.python</span> <span class="kn">import</span> <span class="n">cp_model</span>

<span class="n">adaylar</span> <span class="o">=</span> <span class="p">[(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">9</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span>
           <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">6</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">)]</span>
<span class="n">kapasiteler</span> <span class="o">=</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">24</span><span class="p">,</span> <span class="mi">16</span><span class="p">]</span>

<span class="n">model</span> <span class="o">=</span> <span class="n">cp_model</span><span class="p">.</span><span class="nc">CpModel</span><span class="p">()</span>
<span class="n">x</span> <span class="o">=</span> <span class="p">[</span><span class="n">model</span><span class="p">.</span><span class="nf">new_bool_var</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">aday_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
     <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">adaylar</span><span class="p">))]</span>

<span class="k">for</span> <span class="n">r</span><span class="p">,</span> <span class="n">kapasite</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">kapasiteler</span><span class="p">):</span>
    <span class="n">model</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nf">sum</span><span class="p">(</span><span class="n">adaylar</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">r</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
                  <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">adaylar</span><span class="p">)))</span> <span class="o">&lt;=</span> <span class="n">kapasite</span><span class="p">)</span>

<span class="n">model</span><span class="p">.</span><span class="nf">maximize</span><span class="p">(</span><span class="nf">sum</span><span class="p">(</span><span class="n">adaylar</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">3</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
                   <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">adaylar</span><span class="p">))))</span>

<span class="n">solver</span> <span class="o">=</span> <span class="n">cp_model</span><span class="p">.</span><span class="nc">CpSolver</span><span class="p">()</span>
<span class="n">solver</span><span class="p">.</span><span class="n">parameters</span><span class="p">.</span><span class="n">max_time_in_seconds</span> <span class="o">=</span> <span class="mf">2.0</span>
<span class="n">sonuc</span> <span class="o">=</span> <span class="n">solver</span><span class="p">.</span><span class="nf">solve</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>

<span class="k">if</span> <span class="n">sonuc</span> <span class="ow">in</span> <span class="p">(</span><span class="n">cp_model</span><span class="p">.</span><span class="n">OPTIMAL</span><span class="p">,</span> <span class="n">cp_model</span><span class="p">.</span><span class="n">FEASIBLE</span><span class="p">):</span>
    <span class="nf">print</span><span class="p">([</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">adaylar</span><span class="p">))</span> <span class="k">if</span> <span class="n">solver</span><span class="p">.</span><span class="nf">value</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">])])</span>
<span class="k">else</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Süre içinde uygulanabilir plan bulunamadı.</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu veride en iyi seçim, sıfırdan başlayan indekslerle <code class="language-plaintext highlighter-rouge">[0, 1, 3]</code> olur. Toplam tüketim üç yatak, 22 hemşirelik saati ve 14 cihaz saatidir. <code class="language-plaintext highlighter-rouge">FEASIBLE</code>, uygulanabilir çözüm bulunduğunu söyler; <code class="language-plaintext highlighter-rouge">OPTIMAL</code> ise en iyiliğin kanıtlandığını belirtir.</p>

<p>Önemli ayrıntı: Günlük saat toplamı, aynı anda yeterli personel veya cihaz bulunduğunu garanti etmez. Gerçek çizelgelemede zaman aralıkları tanımlanır; <code class="language-plaintext highlighter-rouge">NoOverlap</code> tek cihazdaki çakışmaları, <code class="language-plaintext highlighter-rouge">Cumulative</code> eşzamanlı kapasite kullanımını sınırlar. Personel yetkinliği ve hasta bakım oranları ayrıca modellenir.</p>

<h2 id="planı-yaşayan-bir-sisteme-dönüştürmek">Planı yaşayan bir sisteme dönüştürmek</h2>

<p>Acil başvurular, geciken taburculuklar ve cihaz arızaları planı değiştirir. Bu yüzden tahminler senaryolarla sınanmalı, beklenmedik talep için kapasite tamponu bırakılmalı ve plan düzenli güncellenmelidir. Her değişimde tüm vardiyayı dağıtmak yerine, mevcut plana sadakati gözeten cezalar kullanılabilir.</p>

<p>Başarıyı yalnızca yatak doluluğuyla ölçmeyin: Bekleme süresi, fazla mesai, iptaller, bakım güvenliği ve çalışan yükü birlikte izlenmelidir. Sistem karar desteğidir; acil bakımın reddini otomatikleştirmez. Klinik onay, insan müdahalesi, erişim kontrolü ve denetlenebilir karar kayıtları korunmalıdır. İyi algoritma, hastaneyi bir elektronik tabloya değil, daha uyumlu çalışan bir ekibe dönüştürür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="kaynak optimizasyonu" /><category term="hastane yönetimi" /><category term="algoritmalar" /><category term="yöneylem araştırması" /><category term="python" /><category term="çizelgeleme" /><summary type="html"><![CDATA[Bir hastaneyi yalnızca boş yatakları sayarak yönetmek, restoranı sadece masa sayısına göre işletmeye benzer: Masalar hazırdır ama aşçı yoksa işler karışır! Hastanelerde de yatak, personel ve ekipman birlikte planlanmalıdır. Akıllı yönetim sistemleri, bu kaynaklar arasındaki bağı algoritmalarla görünür kılar; amaç yalnızca doluluğu artırmak değil, güvenli hizmeti doğru zamanda sunmaktır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/akilli-hastanelerde-kaynak-93.png" /><media:content medium="image" url="https://program.sonsuz.us/img/akilli-hastanelerde-kaynak-93.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Battle Royale’ın Yükselişi: Daralan Harita Oyuncuları Nasıl Yönlendiriyor?</title><link href="https://program.sonsuz.us/posts/battle-royalein-yukselisi-daralan-harita-oyunculari-nasil-yonlendiriyor/" rel="alternate" type="text/html" title="Battle Royale’ın Yükselişi: Daralan Harita Oyuncuları Nasıl Yönlendiriyor?" /><published>2026-11-01T00:00:00+00:00</published><updated>2026-11-01T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/battle-royalein-yukselisi-daralan-harita-oyunculari-nasil-yonlendiriyor</id><content type="html" xml:base="https://program.sonsuz.us/posts/battle-royalein-yukselisi-daralan-harita-oyunculari-nasil-yonlendiriyor/"><![CDATA[<p><img src="/img/battle-royalein-yukselisi-82.svg" alt="battle-royalein-yukselisi-82" /></p>

<p>Battle Royale oyunlarında asıl rakibiniz bazen karşınızdaki oyuncu değil, arkanızdan yaklaşan çemberdir. Daralan harita, devasa bir oyun alanını giderek küçülen bir karar kutusuna dönüştürür. Oyuncuya görünmez bir yönetmen gibi seslenir: “Eşyalarını topladın mı? Güzel, şimdi biraz hareket zamanı!” Peki bu basit geometrik fikir, davranışları nasıl bu kadar güçlü biçimde şekillendiriyor?</p>

<p>``</p>

<h2 id="büyük-haritadan-ortak-finale">Büyük Haritadan Ortak Finale</h2>

<p>PUBG ve Fortnite gibi oyunların popülerleşmesini yalnızca daralan haritaya bağlamak eksik olur. Erişilebilirlik, sosyal oyun deneyimi ve yayın kültürü de önemli etkenlerdir. Ancak güvenli bölge, bu türün seyir zevkini ve maç ritmini taşıyan temel mekaniklerden biridir.</p>

<p>Başlangıçta oyuncular farklı noktalara dağılır; keşif, ekipman toplama ve çatışmadan kaçınma mümkündür. Bölge daraldıkça bu özgürlük azalır. Böylece birbirinden bağımsız küçük hikâyeler, ortak bir final sahnesinde birleşir. Tasarımcı her karşılaşmayı senaryolaştırmadan gerilimi artırabilir.</p>

<h2 id="teorik-temel-alan-azalınca-ne-değişir">Teorik Temel: Alan Azalınca Ne Değişir?</h2>

<p>Dairesel güvenli bölgenin alanı $A(t)=πr(t)^2$ olarak ifade edilir. Burada $r(t)$, zamana bağlı yarıçaptır. Yarıçap yarıya indiğinde alan dörtte bire düşer. Yani harita küçülmesi, oyuncunun gözünde göründüğünden daha sert bir alan kaybı yaratabilir.</p>

<p>Yaşayan oyuncu sayısını $N(t)$ ile gösterirsek ortalama yoğunluk $ρ(t)=N(t)/A(t)$ olur. Oyuncu sayısı azalmasına rağmen alan daha hızlı küçülüyorsa yoğunluk artabilir. Bunun karşılaşma ihtimalini yükseltmesi beklenir; fakat oyuncular eşit dağılmadığından bu, kesin bir çatışma formülü değildir. Binalar, görüş çizgileri ve yüksek araziler sonucu değiştirir.</p>

<table>
  <thead>
    <tr>
      <th>Durum</th>
      <th>Baskın karar</th>
      <th>Başlıca risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Geniş güvenli alan</td>
      <td>Ekipman toplamak</td>
      <td>Hazırlıksız yakalanmak</td>
    </tr>
    <tr>
      <td>Daralma yaklaşırken</td>
      <td>Rotayı planlamak</td>
      <td>Geç hareket etmek</td>
    </tr>
    <tr>
      <td>Küçük güvenli alan</td>
      <td>Konum üstünlüğü kurmak</td>
      <td>Kolay fark edilmek</td>
    </tr>
    <tr>
      <td>Son çember</td>
      <td>Zamanlama ve siper seçmek</td>
      <td>Kaçış seçeneğinin kalmaması</td>
    </tr>
  </tbody>
</table>

<h2 id="çemberin-davranışsal-etkisi">Çemberin Davranışsal Etkisi</h2>

<p>Daralan bölge, hareketsiz kalmanın maliyetini yükseltir. Normalde güvenli görünen bir bina, birkaç dakika sonra tehlikeli bir tuzağa dönüşebilir. Böylece oyun, oyuncuyu zorunlu hareket ile taktiksel bekleme arasında seçim yapmaya iter.</p>

<p>Erken hareket eden oyuncu uygun siper bulabilir; fakat merkezde daha fazla yönden tehdit alabilir. Kenarda kalan oyuncu arkasını daha kolay kontrol edebilir, ancak sonraki bölgeye uzun yol katetmek zorunda kalabilir. Dolayısıyla “merkeze koşmak” her durumda en iyi strateji değildir.</p>

<p>Bu yapı karar teorisiyle okunabilir: Oyuncu beklenen kazancı, hasar riskini ve zaman maliyetini birlikte değerlendirir. Çember bu maliyetleri sürekli değiştirerek aynı taktiğin bütün maç boyunca işe yaramasını engeller.</p>

<h2 id="küçük-bir-python-davranış-modeli">Küçük Bir Python Davranış Modeli</h2>

<p>Aşağıdaki örnek, botun olası hedef noktalarını yolculuk süresi, bölge dışında kalma ve görünürlük riski üzerinden puanlar. Düşük puanlı hedef tercih edilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">math</span>


<span class="k">def</span> <span class="nf">radius_at</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="mi">250</span><span class="p">,</span> <span class="n">delay</span><span class="o">=</span><span class="mi">60</span><span class="p">,</span> <span class="n">duration</span><span class="o">=</span><span class="mi">120</span><span class="p">):</span>
    <span class="n">progress</span> <span class="o">=</span> <span class="nf">min</span><span class="p">(</span><span class="mf">1.0</span><span class="p">,</span> <span class="nf">max</span><span class="p">(</span><span class="mf">0.0</span><span class="p">,</span> <span class="p">(</span><span class="n">t</span> <span class="o">-</span> <span class="n">delay</span><span class="p">)</span> <span class="o">/</span> <span class="n">duration</span><span class="p">))</span>
    <span class="k">return</span> <span class="n">start</span> <span class="o">+</span> <span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">start</span><span class="p">)</span> <span class="o">*</span> <span class="n">progress</span>


<span class="k">def</span> <span class="nf">choose_target</span><span class="p">(</span><span class="n">position</span><span class="p">,</span> <span class="n">candidates</span><span class="p">,</span> <span class="n">center</span><span class="p">,</span> <span class="n">radius</span><span class="p">,</span> <span class="n">speed</span><span class="o">=</span><span class="mi">6</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">cost</span><span class="p">(</span><span class="n">point</span><span class="p">):</span>
        <span class="n">travel_time</span> <span class="o">=</span> <span class="n">math</span><span class="p">.</span><span class="nf">dist</span><span class="p">(</span><span class="n">position</span><span class="p">,</span> <span class="n">point</span><span class="p">)</span> <span class="o">/</span> <span class="n">speed</span>
        <span class="n">outside</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">math</span><span class="p">.</span><span class="nf">dist</span><span class="p">(</span><span class="n">point</span><span class="p">,</span> <span class="n">center</span><span class="p">)</span> <span class="o">-</span> <span class="n">radius</span><span class="p">)</span>
        <span class="n">exposure</span> <span class="o">=</span> <span class="n">candidates</span><span class="p">[</span><span class="n">point</span><span class="p">]</span>
        <span class="k">return</span> <span class="n">travel_time</span> <span class="o">+</span> <span class="mf">0.4</span> <span class="o">*</span> <span class="n">outside</span> <span class="o">+</span> <span class="mi">12</span> <span class="o">*</span> <span class="n">exposure</span>

    <span class="k">return</span> <span class="nf">min</span><span class="p">(</span><span class="n">candidates</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">cost</span><span class="p">)</span>


<span class="n">candidates</span> <span class="o">=</span> <span class="p">{(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">):</span> <span class="mf">0.8</span><span class="p">,</span> <span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">50</span><span class="p">):</span> <span class="mf">0.2</span><span class="p">,</span> <span class="p">(</span><span class="mi">600</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span> <span class="mf">0.1</span><span class="p">}</span>
<span class="n">future_radius</span> <span class="o">=</span> <span class="nf">radius_at</span><span class="p">(</span><span class="mi">120</span><span class="p">)</span>
<span class="n">target</span> <span class="o">=</span> <span class="nf">choose_target</span><span class="p">((</span><span class="mi">500</span><span class="p">,</span> <span class="mi">100</span><span class="p">),</span> <span class="n">candidates</span><span class="p">,</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">future_radius</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">radius_at</code>, bekleme süresinden sonra yarıçapı doğrusal küçültür. <code class="language-plaintext highlighter-rouge">choose_target</code> ise adayların görünürlük değerlerini kullanır; bu değerler burada elle verilmiştir. Katsayılar farklı maliyetleri ortak bir tercih puanına dönüştüren tasarım ağırlıklarıdır, fiziksel hasar hesabı değildir.</p>

<p>Bu model engelleri ve hareket sırasında değişen çemberi hesaba katmaz. Gerçek bir oyunda yol bulma, takım bilgisi ve bölge hasarı da değerlendirmeye eklenmelidir.</p>

<h2 id="i̇yi-baskı-kötü-sürprizden-nasıl-ayrılır">İyi Baskı, Kötü Sürprizden Nasıl Ayrılır?</h2>

<p>Başarılı bir çember sistemi oyuncuyu sıkıştırırken karar verecek zaman bırakır. Belirsizlik heyecan yaratır; okunamayan veya ulaşılması aşırı zor bölgeler ise sonucu beceriden çok şansa bağlayabilir.</p>

<p>Geliştiriciler daralma hızını, uyarı süresini ve dışarıda alınan hasarı birlikte ayarlamalıdır. Çok yavaş çember temposuzluk, çok hızlı çember ise sürekli koşu üretir. Telemetride bölge kaynaklı ölümler, hareketin başlama zamanı ve çatışmaların konumu izlenebilir; ancak bu ölçümler oyuncu deneyimiyle birlikte yorumlanmalıdır.</p>

<p>Sonuçta daralan harita yalnızca oyuncuları yaklaştırmaz: Kaynakların değerini, risk algısını ve zamanın önemini değiştirir. Battle Royale’ın güçlü numarası budur; basit bir geometrik kural, her maçta farklı bir stratejik hikâye üretir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="battle royale" /><category term="oyun tasarımı" /><category term="oyuncu davranışı" /><category term="python" /><category term="oyun mekaniği" /><category term="karar teorisi" /><summary type="html"><![CDATA[Battle Royale oyunlarında asıl rakibiniz bazen karşınızdaki oyuncu değil, arkanızdan yaklaşan çemberdir. Daralan harita, devasa bir oyun alanını giderek küçülen bir karar kutusuna dönüştürür. Oyuncuya görünmez bir yönetmen gibi seslenir: “Eşyalarını topladın mı? Güzel, şimdi biraz hareket zamanı!” Peki bu basit geometrik fikir, davranışları nasıl bu kadar güçlü biçimde şekillendiriyor?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/battle-royalein-yukselisi-82.png" /><media:content medium="image" url="https://program.sonsuz.us/img/battle-royalein-yukselisi-82.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C Standart Kütüphanesi: Matematik, Metin ve Bellek İçin Hazır Araçlar</title><link href="https://program.sonsuz.us/posts/c-standart-kutuphanesi-matematik-metin-ve-bellek-icin-hazir-araclar/" rel="alternate" type="text/html" title="C Standart Kütüphanesi: Matematik, Metin ve Bellek İçin Hazır Araçlar" /><published>2026-11-01T00:00:00+00:00</published><updated>2026-11-01T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-standart-kutuphanesi-matematik-metin-ve-bellek-icin-hazir-araclar</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-standart-kutuphanesi-matematik-metin-ve-bellek-icin-hazir-araclar/"><![CDATA[<p>C programlamak, her vidayı kendiniz üretmeniz gerektiği anlamına gelmez. Standart kütüphane; matematik hesaplarından metin karşılaştırmaya, dinamik bellek ayırmadan hata bildirimine kadar hazır araçlar sunar. Ancak bu araçları güvenli kullanmak için yalnızca isimlerini değil, çalışma sözleşmelerini de bilmek gerekir.</p>

<p>``</p>

<h2 id="önce-mantık-başlık-dosyası-ne-sağlar">Önce mantık: Başlık dosyası ne sağlar?</h2>

<p><code class="language-plaintext highlighter-rouge">#include</code>, ilgili başlık dosyasını programa dahil eder. Başlıklar, fonksiyon bildirimlerini, türleri ve gerekli makroları sunar; fonksiyonların gerçek uygulamaları ise kütüphanelerdedir. Derleyici çağrının türlerini denetler, bağlayıcı gerekli uygulamaları birleştirir. Kısacası başlık dosyası menüdür; yemeği hazırlayan mutfak, kütüphanenin uygulamasıdır. Bu ayrım, derleme hatasıyla bağlama hatasını birbirinden ayırmayı kolaylaştırır.</p>

<table>
  <thead>
    <tr>
      <th>Başlık</th>
      <th>Temel görev</th>
      <th>Örnek fonksiyonlar</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&lt;math.h&gt;</code></td>
      <td>Matematiksel hesaplama</td>
      <td><code class="language-plaintext highlighter-rouge">sqrt</code>, <code class="language-plaintext highlighter-rouge">pow</code>, <code class="language-plaintext highlighter-rouge">sin</code>, <code class="language-plaintext highlighter-rouge">fabs</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&lt;string.h&gt;</code></td>
      <td>Metin ve bayt işlemleri</td>
      <td><code class="language-plaintext highlighter-rouge">strlen</code>, <code class="language-plaintext highlighter-rouge">strcmp</code>, <code class="language-plaintext highlighter-rouge">memcpy</code>, <code class="language-plaintext highlighter-rouge">memmove</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&lt;stdlib.h&gt;</code></td>
      <td>Bellek ve dönüşüm</td>
      <td><code class="language-plaintext highlighter-rouge">malloc</code>, <code class="language-plaintext highlighter-rouge">calloc</code>, <code class="language-plaintext highlighter-rouge">realloc</code>, <code class="language-plaintext highlighter-rouge">free</code>, <code class="language-plaintext highlighter-rouge">strtol</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&lt;ctype.h&gt;</code></td>
      <td>Karakter sınıflandırma</td>
      <td><code class="language-plaintext highlighter-rouge">isdigit</code>, <code class="language-plaintext highlighter-rouge">isspace</code>, <code class="language-plaintext highlighter-rouge">toupper</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&lt;stdio.h&gt;</code></td>
      <td>Girdi ve çıktı</td>
      <td><code class="language-plaintext highlighter-rouge">printf</code>, <code class="language-plaintext highlighter-rouge">fgets</code>, <code class="language-plaintext highlighter-rouge">fputs</code></td>
    </tr>
  </tbody>
</table>

<h2 id="matematik-formülü-yeniden-icat-etmeyin">Matematik: Formülü yeniden icat etmeyin</h2>

<p><code class="language-plaintext highlighter-rouge">&lt;math.h&gt;</code>, kayan noktalı hesaplamalar için temel araç kutusudur. <code class="language-plaintext highlighter-rouge">sqrt(x)</code> karekök, <code class="language-plaintext highlighter-rouge">pow(x, y)</code> üs, <code class="language-plaintext highlighter-rouge">fabs(x)</code> mutlak değer hesaplar. Tamsayılar için kullanılan <code class="language-plaintext highlighter-rouge">abs</code> ise <code class="language-plaintext highlighter-rouge">&lt;stdlib.h&gt;</code> içindedir. <code class="language-plaintext highlighter-rouge">floor</code>, <code class="language-plaintext highlighter-rouge">ceil</code> ve <code class="language-plaintext highlighter-rouge">round</code> farklı yuvarlama kurallarına sahiptir; özellikle negatif sayılarda birbirlerinin yerine kullanılmamalıdır.</p>

<p>İki noktanın uzaklığı şu bağıntıyla bulunur:</p>

\[d = \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2}\]

<p>Bu hesap için <code class="language-plaintext highlighter-rouge">hypot(dx, dy)</code>, ara işlemlerde taşma ve aşırı küçülme riskini azaltabilir. Trigonometrik fonksiyonlar radyan bekler. Ayrıca kayan nokta sonuçları yaklaşık olabilir; matematikteki eşitlik, bilgisayarda her zaman birebir eşitlik değildir. Negatif bir değerin karekökü gibi tanım dışı girdilerin hata davranışı da kontrol edilmelidir.</p>

<h2 id="metin-işleme-sonlandırıcı-karakteri-unutmayın">Metin işleme: Sonlandırıcı karakteri unutmayın</h2>

<p>C dizeleri, <code class="language-plaintext highlighter-rouge">\0</code> karakteriyle biten karakter dizileridir. <code class="language-plaintext highlighter-rouge">strlen</code>, bu sonlandırıcıdan önceki baytların sayısını verir; UTF-8 metindeki görünen harf sayısını garanti etmez. <code class="language-plaintext highlighter-rouge">strcmp</code> eşitlik durumunda sıfır döndürür, diğer durumlarda işaretine bakılır; yalnızca <code class="language-plaintext highlighter-rouge">-1</code> veya <code class="language-plaintext highlighter-rouge">1</code> döneceğini varsaymayın.</p>

<p><code class="language-plaintext highlighter-rouge">memcpy</code>, belirtilen sayıda baytı kopyalar ve bölgeler örtüşmemelidir. Örtüşme ihtimali varsa <code class="language-plaintext highlighter-rouge">memmove</code> kullanılır. <code class="language-plaintext highlighter-rouge">strncpy</code> ise her durumda sonlandırıcı eklemez; adı güvenlik garantisi değildir. Dize fonksiyonları sonlandırıcıya, bellek fonksiyonları verilen uzunluğa güvenir.</p>

<p><code class="language-plaintext highlighter-rouge">&lt;ctype.h&gt;</code> fonksiyonlarına sıradan bir <code class="language-plaintext highlighter-rouge">char</code> verirken <code class="language-plaintext highlighter-rouge">(unsigned char)</code> dönüşümü yapmak önemlidir; negatif karakter değerleri tanımsız davranışa neden olabilir.</p>

<h2 id="bellek-yönetimi-alanın-sahibi-sizsiniz">Bellek yönetimi: Alanın sahibi sizsiniz</h2>

<p>Dinamik bellek, boyutu çalışma sırasında belirlenen verileri saklamaya yarar. Ayırdığınız alanın kapasitesi ile içine koyduğunuz verinin uzunluğu farklı kavramlardır. Dize için gereken kapasite genellikle $uzunluk + 1$ bayttır; fazladan bayt sonlandırıcı içindir. Ayırma işleminin başarısız olabileceğini de unutmamak gerekir.</p>

<table>
  <thead>
    <tr>
      <th>Fonksiyon</th>
      <th>Davranış</th>
      <th>Dikkat noktası</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">malloc</code></td>
      <td>Alan ayırır</td>
      <td>İçerik başlatılmaz</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">calloc</code></td>
      <td>Alan ayırıp baytları sıfırlar</td>
      <td>Eleman sayısı ve boyut verilir</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">realloc</code></td>
      <td>Alanın boyutunu değiştirir</td>
      <td>Adres değişebilir</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">free</code></td>
      <td>Alanı serbest bırakır</td>
      <td>Aynı alan iki kez bırakılmaz</td>
    </tr>
  </tbody>
</table>

<h2 id="birlikte-çalışan-küçük-bir-örnek">Birlikte çalışan küçük bir örnek</h2>

<p>Aşağıdaki program bir metni dinamik belleğe kopyalar, kapasitesini artırır ve matematik fonksiyonlarıyla sonuç üretir. Böylece üç araç kutusunu aynı yerde görürüz.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;math.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">kaynak</span> <span class="o">=</span> <span class="s">"Merhaba C"</span><span class="p">;</span>
    <span class="kt">size_t</span> <span class="n">kapasite</span> <span class="o">=</span> <span class="n">strlen</span><span class="p">(</span><span class="n">kaynak</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
    <span class="kt">char</span> <span class="o">*</span><span class="n">metin</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="n">kapasite</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">metin</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">EXIT_FAILURE</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="n">memcpy</span><span class="p">(</span><span class="n">metin</span><span class="p">,</span> <span class="n">kaynak</span><span class="p">,</span> <span class="n">kapasite</span><span class="p">);</span>
    <span class="kt">char</span> <span class="o">*</span><span class="n">yeni</span> <span class="o">=</span> <span class="n">realloc</span><span class="p">(</span><span class="n">metin</span><span class="p">,</span> <span class="n">kapasite</span> <span class="o">+</span> <span class="mi">16</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">yeni</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">free</span><span class="p">(</span><span class="n">metin</span><span class="p">);</span>
        <span class="k">return</span> <span class="n">EXIT_FAILURE</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">metin</span> <span class="o">=</span> <span class="n">yeni</span><span class="p">;</span>
    <span class="n">strcat</span><span class="p">(</span><span class="n">metin</span><span class="p">,</span> <span class="s">"!"</span><span class="p">);</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"%s | Uzunluk: %zu | Kok: %.2f | Us: %.2f</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span>
           <span class="n">metin</span><span class="p">,</span> <span class="n">strlen</span><span class="p">(</span><span class="n">metin</span><span class="p">),</span> <span class="n">sqrt</span><span class="p">(</span><span class="mi">9</span><span class="p">.</span><span class="mi">0</span><span class="p">),</span> <span class="n">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">.</span><span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="p">.</span><span class="mi">0</span><span class="p">));</span>
    <span class="n">free</span><span class="p">(</span><span class="n">metin</span><span class="p">);</span>
    <span class="k">return</span> <span class="n">EXIT_SUCCESS</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">memcpy</code>, sonlandırıcı dahil bütün diziyi kopyalar. Eklenen kapasite, ünlem ve sonlandırıcı için yeterlidir. <code class="language-plaintext highlighter-rouge">realloc</code> sonucu geçici işaretçide tutulur: Sıfırdan büyük boyutla yapılan çağrı başarısız olursa eski alan geçerliliğini korur. Sonucu doğrudan <code class="language-plaintext highlighter-rouge">metin</code> üzerine yazmak, eski adresi kaybettirebilir.</p>

<p>Birçok Unix benzeri ortamda matematik kütüphanesini ayrıca bağlamak gerekir:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cc <span class="nt">-std</span><span class="o">=</span>c11 <span class="nt">-Wall</span> <span class="nt">-Wextra</span> main.c <span class="nt">-o</span> uygulama <span class="nt">-lm</span>
</code></pre></div></div>

<p>Son kontrol listesi basittir: Kapasiteleri doğrulayın, dönüş değerlerini inceleyin ve ayırdığınız belleği bırakın. Genel boyut hesaplarında <code class="language-plaintext highlighter-rouge">n * sizeof(eleman)</code> çarpımının taşmasını önceden denetleyin. Serbest bırakılmış belleğe erişmeyin. Hazır fonksiyonlar işi hızlandırır; güvenli kullanım ise hâlâ programcının sorumluluğudur.</p>

<p><img src="/img/c-standart-kutuphanesi-29.svg" alt="c-standart-kutuphanesi-29" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c" /><category term="standart kütüphane" /><category term="matematik" /><category term="metin işleme" /><category term="bellek yönetimi" /><summary type="html"><![CDATA[C programlamak, her vidayı kendiniz üretmeniz gerektiği anlamına gelmez. Standart kütüphane; matematik hesaplarından metin karşılaştırmaya, dinamik bellek ayırmadan hata bildirimine kadar hazır araçlar sunar. Ancak bu araçları güvenli kullanmak için yalnızca isimlerini değil, çalışma sözleşmelerini de bilmek gerekir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-standart-kutuphanesi-29.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-standart-kutuphanesi-29.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C++’ta Otomatik Kopyalama: Derleyicinin İyi Niyeti Ne Zaman Tehlikeli Olur?</title><link href="https://program.sonsuz.us/posts/cta-otomatik-kopyalama-derleyicinin-iyi-niyeti-ne-zaman-tehlikeli-olur/" rel="alternate" type="text/html" title="C++’ta Otomatik Kopyalama: Derleyicinin İyi Niyeti Ne Zaman Tehlikeli Olur?" /><published>2026-11-01T00:00:00+00:00</published><updated>2026-11-01T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/cta-otomatik-kopyalama-derleyicinin-iyi-niyeti-ne-zaman-tehlikeli-olur</id><content type="html" xml:base="https://program.sonsuz.us/posts/cta-otomatik-kopyalama-derleyicinin-iyi-niyeti-ne-zaman-tehlikeli-olur/"><![CDATA[<p>C++ derleyicisi, yazmadığınız bazı özel üye fonksiyonlarını sizin yerinize hazırlayabilir. Kopyalama kurucusu ve kopyalama atama operatörü de bu yardımcılar arasındadır. Ancak derleyici, bir işaretçinin yalnızca adres tuttuğunu bilir; o adresin arkasındaki belleğin kime ait olduğunu bilmez. Tehlike tam da bu sahiplik belirsizliğinde başlar.</p>

<p>``</p>

<h2 id="önce-mantık-nesne-mi-kaynak-mı-kopyalanıyor">Önce mantık: Nesne mi, kaynak mı kopyalanıyor?</h2>

<p>Kopyalama kurucusu yeni bir nesneyi mevcut nesneden oluşturur: <code class="language-plaintext highlighter-rouge">Buffer b = a;</code>. Kopyalama atama operatörü ise zaten yaşayan bir nesnenin değerini değiştirir: <code class="language-plaintext highlighter-rouge">b = a;</code>. İkinci durumda hedefin önceki kaynakları da hesaba katılmalıdır.</p>

<p>Derleyicinin ürettiği işlemler, taban sınıfları ve üyeleri kendi kopyalama davranışlarıyla kopyalar. Bu nedenle otomatik kopyalama, her zaman “sığ kopyalama” demek değildir: <code class="language-plaintext highlighter-rouge">std::vector</code> kendi elemanlarını kopyalar. Fakat ham işaretçi üyesinde yalnızca adres kopyalanır:</p>

\[p_a = p_b\]

<p>İki farklı nesne artık aynı kaynağa bakmaktadır. Bunun doğru olup olmadığı, sınıfın sahiplik sözleşmesine bağlıdır.</p>

<table>
  <thead>
    <tr>
      <th>Üye türü</th>
      <th>Otomatik kopyalamanın sonucu</th>
      <th>Değerlendirme</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">int</code>, <code class="language-plaintext highlighter-rouge">double</code></td>
      <td>Değer kopyalanır</td>
      <td>Genellikle güvenli</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::string</code>, <code class="language-plaintext highlighter-rouge">std::vector</code></td>
      <td>Üyenin değer semantiği uygulanır</td>
      <td>Genellikle güvenli</td>
    </tr>
    <tr>
      <td>Sahip olan ham işaretçi</td>
      <td>Aynı adres paylaşılır</td>
      <td>Tehlikeli</td>
    </tr>
    <tr>
      <td>Sahip olmayan ham işaretçi</td>
      <td>Aynı nesneye bakılır</td>
      <td>Yaşam süresi kontrol edilmeli</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::unique_ptr</code></td>
      <td>Kopyalama işlemi silinir</td>
      <td>Hatalı kopyalama engellenir</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/cta-otomatik-kopyalama-49.svg" alt="cta-otomatik-kopyalama-49" /></p>

<h2 id="tehlikenin-klasik-hali-i̇ki-sahip-tek-bellek">Tehlikenin klasik hali: İki sahip, tek bellek</h2>

<p>Aşağıdaki sınıf belleği kendisi ayırıyor ve yok edilirken serbest bırakıyor. Dolayısıyla işaretçinin sahibi olduğunu varsayıyor:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">struct</span> <span class="nc">BadBuffer</span> <span class="p">{</span>
    <span class="kt">char</span><span class="o">*</span> <span class="n">data</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">char</span><span class="p">[</span><span class="mi">16</span><span class="p">];</span>

    <span class="o">~</span><span class="n">BadBuffer</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">delete</span><span class="p">[]</span> <span class="n">data</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="kt">void</span> <span class="nf">example</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">BadBuffer</span> <span class="n">a</span><span class="p">;</span>
    <span class="n">BadBuffer</span> <span class="n">b</span> <span class="o">=</span> <span class="n">a</span><span class="p">;</span> <span class="c1">// Yalnızca adres kopyalanır.</span>

    <span class="n">BadBuffer</span> <span class="n">c</span><span class="p">;</span>
    <span class="n">c</span> <span class="o">=</span> <span class="n">a</span><span class="p">;</span>          <span class="c1">// c'nin eski belleği kaybolur.</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Kopyalama kurucusu burada iki nesneye aynı adresi verir. Nesneler yok edildiğinde aynı bellek tekrar serbest bırakılmaya çalışılır: <strong>tanımsız davranış</strong> ortaya çıkar. Program çökebilir, sessizce bozulabilir veya şimdilik çalışıyor gibi görünebilir.</p>

<p>Atama daha da sinsidir: <code class="language-plaintext highlighter-rouge">c</code> kendi eski adresini kaybettiği için bellek sızıntısı oluşturur; ardından ortak adres nedeniyle aynı serbest bırakma sorununa katılır. Derleyici fotokopi çekmiştir, ama herkes belgenin tek sahibi olduğunu sanmaktadır!</p>

<p>Benzer riskler dosya tanıtıcıları ve işletim sistemi tutamaçlarında da vardır. Ayrıca başka bir üyeye işaret eden iç işaretçiler kopyalandığında, yeni nesne yanlışlıkla eski nesnenin içine bakabilir. Sorun yalnızca <code class="language-plaintext highlighter-rouge">delete</code> değildir; sınıfın değişmezlerinin bozulmasıdır.</p>

<h2 id="elle-çözüm-derin-kopyalama-ve-güvenli-atama">Elle çözüm: Derin kopyalama ve güvenli atama</h2>

<p>Bağımsız sahiplik istiyorsak, yeni bellek ayırıp içeriği kopyalamalıyız. Atamada ise mevcut kaynağı koruyarak ilerlemek önemlidir. Aşağıdaki <strong>copy-and-swap</strong> yaklaşımı, önce kopyayı hazırlar; başarılı olursa kaynakları değiş tokuş eder:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;algorithm&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;cstddef&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;utility&gt;</span><span class="cp">
</span>
<span class="k">class</span> <span class="nc">Buffer</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="kt">size_t</span> <span class="n">size_</span><span class="p">;</span>
    <span class="kt">char</span><span class="o">*</span> <span class="n">data_</span><span class="p">;</span>

<span class="nl">public:</span>
    <span class="k">explicit</span> <span class="n">Buffer</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="kt">size_t</span> <span class="n">size</span><span class="p">)</span>
        <span class="o">:</span> <span class="n">size_</span><span class="p">(</span><span class="n">size</span><span class="p">),</span> <span class="n">data_</span><span class="p">(</span><span class="k">new</span> <span class="kt">char</span><span class="p">[</span><span class="n">size</span><span class="p">]{})</span> <span class="p">{}</span>

    <span class="n">Buffer</span><span class="p">(</span><span class="k">const</span> <span class="n">Buffer</span><span class="o">&amp;</span> <span class="n">other</span><span class="p">)</span>
        <span class="o">:</span> <span class="n">Buffer</span><span class="p">(</span><span class="n">other</span><span class="p">.</span><span class="n">size_</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">copy_n</span><span class="p">(</span><span class="n">other</span><span class="p">.</span><span class="n">data_</span><span class="p">,</span> <span class="n">size_</span><span class="p">,</span> <span class="n">data_</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="o">~</span><span class="n">Buffer</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">delete</span><span class="p">[]</span> <span class="n">data_</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="kt">void</span> <span class="nf">swap</span><span class="p">(</span><span class="n">Buffer</span><span class="o">&amp;</span> <span class="n">other</span><span class="p">)</span> <span class="k">noexcept</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">(</span><span class="n">size_</span><span class="p">,</span> <span class="n">other</span><span class="p">.</span><span class="n">size_</span><span class="p">);</span>
        <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">(</span><span class="n">data_</span><span class="p">,</span> <span class="n">other</span><span class="p">.</span><span class="n">data_</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="n">Buffer</span><span class="o">&amp;</span> <span class="k">operator</span><span class="o">=</span><span class="p">(</span><span class="n">Buffer</span> <span class="n">other</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">swap</span><span class="p">(</span><span class="n">other</span><span class="p">);</span>
        <span class="k">return</span> <span class="o">*</span><span class="k">this</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Değerle alınan <code class="language-plaintext highlighter-rouge">other</code>, bağımsız kopyadır. Bellek ayırma başarısız olursa hedef nesne değişmez. Takastan sonra hedefin eski belleğini <code class="language-plaintext highlighter-rouge">other</code> temizler. Bu yaklaşım kendine atamayı da güvenle karşılar; ancak gereksiz bir kopyalama yapabilir.</p>

<p>$n$ baytlık veri için derin kopyalamanın zaman ve ek bellek maliyeti yaklaşık $O(n)$ düzeyindedir. Doğruluk bedava değildir, fakat tanımsız davranış çok daha pahalıdır.</p>

<h2 id="daha-iyi-seçenek-rule-of-zero">Daha iyi seçenek: Rule of Zero</h2>

<p><strong>Rule of Three</strong>, yıkıcı, kopyalama kurucusu veya kopyalama atamasını özelleştiriyorsanız diğerlerini de değerlendirin der. Modern C++’ta taşıma işlemleriyle birlikte <strong>Rule of Five</strong> gündeme gelir. Yukarıdaki sınıf güvenli kopyalanır, fakat özel taşıma işlemleri sağlamaz; taşıma beklenen bazı durumlarda kopyalama yapılabilir.</p>

<p>Çoğu uygulamada en temiz çözüm, kaynak yönetimini hazır türlere devretmektir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;vector&gt;</span><span class="cp">
</span>
<span class="k">struct</span> <span class="nc">Buffer</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">char</span><span class="o">&gt;</span> <span class="n">data</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Bu tasarımda <strong>Rule of Zero</strong> uygulanır: özel yıkıcı veya kopyalama işlemleri yazmanız gerekmez. <code class="language-plaintext highlighter-rouge">std::unique_ptr</code> ise tek sahipliği ifade eder; onu içeren sınıfın otomatik kopyalama işlemleri genellikle silinir.</p>

<p>Son kontrol sorusu şudur: <strong>Bu nesneyi kopyaladığımda kaynak paylaşılmalı mı, çoğaltılmalı mı, yoksa kopyalama yasaklanmalı mı?</strong> Cevap açık değilse, otomatik üretilen işlemlere güvenmeden önce sahiplik modelini netleştirin.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="kopyalama-kurucusu" /><category term="atama-operatörü" /><category term="bellek-yönetimi" /><category term="raii" /><category term="rule-of-zero" /><summary type="html"><![CDATA[C++ derleyicisi, yazmadığınız bazı özel üye fonksiyonlarını sizin yerinize hazırlayabilir. Kopyalama kurucusu ve kopyalama atama operatörü de bu yardımcılar arasındadır. Ancak derleyici, bir işaretçinin yalnızca adres tuttuğunu bilir; o adresin arkasındaki belleğin kime ait olduğunu bilmez. Tehlike tam da bu sahiplik belirsizliğinde başlar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/cta-otomatik-kopyalama-49.png" /><media:content medium="image" url="https://program.sonsuz.us/img/cta-otomatik-kopyalama-49.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Dijital Serada Evrim: Genetik Algoritmalarla Bitki Islahı Simülasyonu</title><link href="https://program.sonsuz.us/posts/dijital-serada-evrim-genetik-algoritmalarla-bitki-islahi-simulasyonu/" rel="alternate" type="text/html" title="Dijital Serada Evrim: Genetik Algoritmalarla Bitki Islahı Simülasyonu" /><published>2026-11-01T00:00:00+00:00</published><updated>2026-11-01T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/dijital-serada-evrim-genetik-algoritmalarla-bitki-islahi-simulasyonu</id><content type="html" xml:base="https://program.sonsuz.us/posts/dijital-serada-evrim-genetik-algoritmalarla-bitki-islahi-simulasyonu/"><![CDATA[<p><img src="/img/dijital-serada-evrim-30.svg" alt="dijital-serada-evrim-30" /></p>

<p>Bir tarlada binlerce bitki yetiştirip en başarılı olanları seçmek yerine, önce bilgisayarda küçük bir “dijital sera” kurabiliriz. Genetik algoritmalar, aday genetik kombinasyonları nesiller boyunca değerlendirerek verim, su ihtiyacı ve hastalık direnci arasında iyi dengeler arar. Amaç sihirli tohumu bulmak değil, gerçek ıslah deneylerinde sınanabilecek umut verici adayları daraltmaktır.</p>

<p>``</p>

<h2 id="genotipten-fenotipe-modelin-kalbi">Genotipten fenotipe: Modelin kalbi</h2>

<p>Her aday bitki, kalıtsal özelliklerini temsil eden bir <strong>genotip</strong> taşır. Ancak gözlediğimiz özellikler, yani <strong>fenotip</strong>, yalnızca genotipten doğmaz; çevre ve genotip–çevre etkileşimi de sonucu değiştirir. Aynı çeşit sulanan tarlada yıldızlaşırken kurak arazide sıradan kalabilir. Dolayısıyla simülasyon, genetik bilgiyi özelliklere dönüştüren açık bir modele ihtiyaç duyar.</p>

<p>Örneğimizde bitkiyi, aynı kromozomun iki kopyasında bulunan altı lokusla temsil edeceğiz. Her lokusta iki olası alel vardır: <code class="language-plaintext highlighter-rouge">0</code> ve <code class="language-plaintext highlighter-rouge">1</code>. Bu, gerçek bir türün ayrıntılı genetik haritası değil, kalıtım mantığını öğrenmek için sadeleştirilmiş bir oyuncak modeldir.</p>

<table>
  <thead>
    <tr>
      <th>Temsil</th>
      <th>Avantajı</th>
      <th>Sınırlaması</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tek bit dizisi</td>
      <td>Kolay uygulanır</td>
      <td>Diploid kalıtımı göstermez</td>
    </tr>
    <tr>
      <td>İki kromozom kopyası</td>
      <td>Alel aktarımını modeller</td>
      <td>Bağlantı haritası basitleşir</td>
    </tr>
    <tr>
      <td>Gerçek marker verisi</td>
      <td>Deneylerle ilişkilendirilebilir</td>
      <td>Veri ve doğrulama gerektirir</td>
    </tr>
  </tbody>
</table>

<h2 id="i̇yi-bitkiyi-nasıl-puanlarız">İyi bitkiyi nasıl puanlarız?</h2>

<p>Üç normalize özellik kullanalım: potansiyel verim $Y$, su tüketimi $W$ ve hastalık direnci $R$. Her özellik, lokuslardaki alel dozlarının ağırlıklı toplamından hesaplanır. Ağırlıklar örnekte keyfîdir; gerçek uygulamada kontrollü deneylerden veya genomik tahmin modellerinden öğrenilmelidir.</p>

<p>Kuraklık şiddeti $s$ arttıkça yüksek su tüketiminin verimi daha fazla düşürdüğünü varsayalım:</p>

\[F(g)=\frac{1}{\vert E\vert }\sum_{s\in E}\left[0.55Y(g)(1-sW(g))+0.25R(g)-0.20W(g)\right]\]

<p>Burada $E$, sınanan çevreler kümesidir. Büyük $F$ daha iyi aday demektir. Katsayılar yetiştiricinin önceliklerini yansıtır; evrensel biyoloji yasaları değildir. Özellikleri normalize etmek, farklı ölçüm birimlerinin puanı kazara ele geçirmesini önler. Kod eklemeli gen etkileri kullanır; dominans ve epistaz sonraki geliştirmelerdir.</p>

<h2 id="evrim-döngüsünü-python-ile-kurmak">Evrim döngüsünü Python ile kurmak</h2>

<p>Algoritma rastgele bir popülasyonla başlar. Turnuva seçimi güçlü adaylara üreme avantajı sağlar. Ebeveynlerin kromozomlarından tek kesim noktalı rekombinasyonla gametler üretilir; iki gamet yavruyu oluşturur. Düşük oranlı mutasyon çeşitliliği destekler. Elitizm ise en iyi iki adayın sonraki nesilde korunmasını sağlar.</p>

<p>Aşağıdaki NumPy kodu, bu döngüyü üç kuraklık seviyesinde çalıştırır ve son popülasyonun en iyi adayını yazdırır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="n">rng</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">default_rng</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
<span class="n">L</span><span class="p">,</span> <span class="n">N</span> <span class="o">=</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">80</span>
<span class="n">E</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.3</span><span class="p">,</span> <span class="mf">0.6</span><span class="p">])</span>
<span class="n">A</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span>
              <span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span>
              <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">]])</span>
<span class="n">pop</span> <span class="o">=</span> <span class="n">rng</span><span class="p">.</span><span class="nf">integers</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">L</span><span class="p">))</span>

<span class="k">def</span> <span class="nf">fitness</span><span class="p">(</span><span class="n">g</span><span class="p">):</span>
    <span class="n">d</span> <span class="o">=</span> <span class="n">g</span><span class="p">.</span><span class="nf">mean</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
    <span class="n">y</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">r</span> <span class="o">=</span> <span class="p">(</span><span class="n">A</span> <span class="o">@</span> <span class="n">d</span><span class="p">)</span> <span class="o">/</span> <span class="n">A</span><span class="p">.</span><span class="nf">sum</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
    <span class="k">return</span> <span class="nf">float</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">mean</span><span class="p">(</span><span class="mf">0.55</span><span class="o">*</span><span class="n">y</span><span class="o">*</span><span class="p">(</span><span class="mi">1</span><span class="o">-</span><span class="n">E</span><span class="o">*</span><span class="n">w</span><span class="p">)</span><span class="o">+</span><span class="mf">0.25</span><span class="o">*</span><span class="n">r</span><span class="o">-</span><span class="mf">0.20</span><span class="o">*</span><span class="n">w</span><span class="p">))</span>

<span class="k">def</span> <span class="nf">select</span><span class="p">(</span><span class="n">scores</span><span class="p">):</span>
    <span class="n">ids</span> <span class="o">=</span> <span class="n">rng</span><span class="p">.</span><span class="nf">choice</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">replace</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">pop</span><span class="p">[</span><span class="n">ids</span><span class="p">[</span><span class="n">np</span><span class="p">.</span><span class="nf">argmax</span><span class="p">(</span><span class="n">scores</span><span class="p">[</span><span class="n">ids</span><span class="p">])]]</span>

<span class="k">def</span> <span class="nf">gamete</span><span class="p">(</span><span class="n">g</span><span class="p">):</span>
    <span class="n">cut</span> <span class="o">=</span> <span class="n">rng</span><span class="p">.</span><span class="nf">integers</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">L</span><span class="p">)</span>
    <span class="n">h</span> <span class="o">=</span> <span class="n">rng</span><span class="p">.</span><span class="nf">integers</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
    <span class="n">c</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">r_</span><span class="p">[</span><span class="n">g</span><span class="p">[</span><span class="n">h</span><span class="p">,</span> <span class="p">:</span><span class="n">cut</span><span class="p">],</span> <span class="n">g</span><span class="p">[</span><span class="mi">1</span><span class="o">-</span><span class="n">h</span><span class="p">,</span> <span class="n">cut</span><span class="p">:]].</span><span class="nf">copy</span><span class="p">()</span>
    <span class="n">c</span> <span class="o">^=</span> <span class="p">(</span><span class="n">rng</span><span class="p">.</span><span class="nf">random</span><span class="p">(</span><span class="n">L</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mf">0.01</span><span class="p">).</span><span class="nf">astype</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">c</span>

<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">60</span><span class="p">):</span>
    <span class="n">scores</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="nf">fitness</span><span class="p">(</span><span class="n">g</span><span class="p">)</span> <span class="k">for</span> <span class="n">g</span> <span class="ow">in</span> <span class="n">pop</span><span class="p">])</span>
    <span class="n">new</span> <span class="o">=</span> <span class="p">[</span><span class="n">g</span><span class="p">.</span><span class="nf">copy</span><span class="p">()</span> <span class="k">for</span> <span class="n">g</span> <span class="ow">in</span> <span class="n">pop</span><span class="p">[</span><span class="n">np</span><span class="p">.</span><span class="nf">argsort</span><span class="p">(</span><span class="n">scores</span><span class="p">)[</span><span class="o">-</span><span class="mi">2</span><span class="p">:]]]</span>
    <span class="k">while</span> <span class="nf">len</span><span class="p">(</span><span class="n">new</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">:</span>
        <span class="n">new</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">stack</span><span class="p">([</span><span class="nf">gamete</span><span class="p">(</span><span class="nf">select</span><span class="p">(</span><span class="n">scores</span><span class="p">)),</span>
                             <span class="nf">gamete</span><span class="p">(</span><span class="nf">select</span><span class="p">(</span><span class="n">scores</span><span class="p">))]))</span>
    <span class="n">pop</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">(</span><span class="n">new</span><span class="p">)</span>

<span class="n">best</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="n">pop</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">fitness</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">round</span><span class="p">(</span><span class="nf">fitness</span><span class="p">(</span><span class="n">best</span><span class="p">),</span> <span class="mi">4</span><span class="p">),</span> <span class="n">best</span><span class="p">.</span><span class="nf">tolist</span><span class="p">())</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">g.mean(axis=0)</code>, iki kromozomdaki alel dozunu sıfır ile bir arasına taşır. <code class="language-plaintext highlighter-rouge">A</code> matrisinin satırları özellik etkilerini belirler. Mutasyon burada aleli diğer ikili duruma çevirir. Sabit rastgelelik tohumu sonucu yeniden üretmeyi kolaylaştırır; tek koşunun güvenilir olduğunu göstermez.</p>

<h2 id="sonucu-gerçekten-test-etmek">Sonucu gerçekten test etmek</h2>

<p>Sadece son puana bakmayın. Nesiller boyunca en iyi ve ortalama uygunluğu, ayrıca genetik çeşitliliği kaydedin. Ortalama yükselirken çeşitlilik hızla çöküyorsa popülasyon erken yakınsamış olabilir. Farklı rastgelelik tohumlarıyla tekrarlar yapın; aynı değerlendirme bütçesi altında rastgele aramayı da karşılaştırmaya ekleyin.</p>

<table>
  <thead>
    <tr>
      <th>Deney</th>
      <th>Asıl soru</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yeni kuraklık seviyeleri</td>
      <td>Aday farklı çevrelere dayanıyor mu?</td>
    </tr>
    <tr>
      <td>Farklı amaç ağırlıkları</td>
      <td>Kazanan tercihlere duyarlı mı?</td>
    </tr>
    <tr>
      <td>Tarla denemeleri</td>
      <td>Model gerçek performansı öngörüyor mu?</td>
    </tr>
  </tbody>
</table>

<p>Seçimde kullanılan çevrelerden ayrı test çevreleri ayırmak, modele aşırı uyumu yakalamaya yardımcı olur. Gerçek veride eğitim ve değerlendirme ayrımı da korunmalıdır. Son olarak, hiçbir simülasyon tohumu doğrudan şampiyon ilan edemez: dijital sera aday önerir, tarla karar verir. En iyi başlangıç, varsayımları görünür olan küçük bir modeldir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="genetik algoritma" /><category term="bitki ıslahı" /><category term="python" /><category term="simülasyon" /><category term="optimizasyon" /><summary type="html"><![CDATA[Bir tarlada binlerce bitki yetiştirip en başarılı olanları seçmek yerine, önce bilgisayarda küçük bir “dijital sera” kurabiliriz. Genetik algoritmalar, aday genetik kombinasyonları nesiller boyunca değerlendirerek verim, su ihtiyacı ve hastalık direnci arasında iyi dengeler arar. Amaç sihirli tohumu bulmak değil, gerçek ıslah deneylerinde sınanabilecek umut verici adayları daraltmaktır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/dijital-serada-evrim-30.png" /><media:content medium="image" url="https://program.sonsuz.us/img/dijital-serada-evrim-30.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>