top of page

Dengeli İş Atama — Jev ile Operatörü Tanıyan Optimizasyon Modeli

17 Eki
10 dakikada okunur

Bu yazı, daha önce ele alınan dengeli iş atama optimizasyon modelini, operatörlere ait serbest metin bilgileriyle genişleten bir yaklaşımı ele alıyor. Önceki modelin, iş emirlerini toplayıcılara eşit dağıtırken hangi durumlarda sahada karşılık bulmadığını bir örnek üzerinden aktarıyor. Ardından TypeSafe AI tarafından geliştirilen karar modeli Jev’i tanıtıyor. Vardiya amirinin notlarının Jev ile nasıl model parametrelerine dönüştürüldüğünü ve bu parametrelerin Python PuLP modeline nasıl bağlandığını kodlarıyla detaylandırıyor.


Özet Süreç

Önceki yazıda, depo içerisinde ürün toplamak için üretilen iş emirlerinin, yani turların, toplayıcılara dengeli dağıtılması problemi ele alınmıştı. Örnek veride 5.177 ürünün toplanacağı 74 tur ve bu turları gerçekleştirecek 8 toplayıcı bulunuyordu. Kurulan model, her toplayıcıya düşen toplam desi miktarının ve tur sayısının operatör başına düşen ortalamaya yakın olmasını hedefliyordu.


Operatör başına düşen ortalama desi miktarı Davg= 1.811, ortalama tur sayısı Tavg= 9,25 olarak hesaplanmıştı.

Model çözüldüğünde her toplayıcıya yaklaşık 1.800 desi ve 9–10 tur atanmış, dağıtım hem hacim hem de tur sayısı bakımından dengeli bir görünüm sergilemişti.


Problem Tanımı

Önceki modelin dengeli dağıtımı, tüm toplayıcıların aynı koşullarda ve aynı hızda çalıştığı varsayımına dayanır. Oysa depo operasyonunda her gün durum farklıdır. Vardiya başında depo operasyon yöneticisinin elinde, toplayıcılara ilişkin aşağıdakine benzer notlar bulunur.


Op. 2: “Pazartesi başladı, henüz lokasyonları öğreniyor.” Op. 4: “Öğleden sonra doktor randevusu var, 13:00'te çıkacak.” Op. 7: “Kıdemli, hızlı ve hatasız toplar.”

Bu notlar, eşit dağıtımın sahada ne anlama geldiğini değiştirir. İşe yeni başlamış bir toplayıcıya kıdemli bir toplayıcıyla aynı miktarda iş verildiğinde, biri işini vardiya bitmeden tamamlarken diğeri fazla mesaiye kalır. Saat 13:00'te çıkacak bir toplayıcıya tam günlük iş verildiğinde ise turların bir kısmı gün sonunda toplanmadan kalır. Diğer bir deyişle, eşit dağıtmak her zaman adil dağıtmak anlamına gelmez.


Bu kapsamda adil dağıtımın tanımını yeniden yapmak gerekir.


Adil dağıtım, her toplayıcının kendisine atanan işi, o gün müsait olduğu süre içinde ve diğer toplayıcılarla yaklaşık aynı anda bitirebilmesidir.


Bu tanıma göre hızlı bir toplayıcıya daha fazla, işe yeni başlamış bir toplayıcıya daha az iş atanmalıdır. Yarım gün çalışacak bir toplayıcıya ise yarım günlük iş düşmelidir. Ancak burada bir güçlük ortaya çıkar. Optimizasyon modeli sayılarla çalışır, toplayıcılara ait bilgiler ise vardiya amirinin serbest metin notlarında durur. “Pazartesi başladı” ya da “13:00'te çıkacak” gibi ifadeleri modele doğrudan girdi olarak vermek mümkün değildir. Bu notların önce modelin anlayacağı parametrelere dönüştürülmesi gerekir.


Bu dönüşüm için kural tabanlı bir yaklaşım düşünülebilir. Ancak notların her biri farklı bir üslupla yazılır. Biri “yarım gün” der, diğeri “13:00'te çıkacak”, bir başkası çalışma süresinden hiç bahsetmez. Anahtar kelimelere dayanan kurallar bu çeşitliliği yakalamakta zorlanır.


Bu yazıda, bu dönüşümü yapmak için metni okuyup tipli kararlar üreten bir model olan Jev kullanılıyor.

Jev Nedir?

Jev, metni okuyup önceden belirlenmiş seçenekler arasından karar veren bir yapay zekâ modelidir. ChatGPT gibi dil modellerinden farkı, cevap olarak metin yazmamasıdır. Jev’e bir metin ve bu metne ilişkin bir soru verilir. Jev de sorunun seçeneklerinden birini, bu seçeneğe ne kadar emin olduğunu gösteren bir olasılık değeriyle birlikte döndürür.


Jev’e “Bu toplayıcı bugün tam gün mü, yarım gün mü çalışacak?” diye sorulduğunda cevap bir paragraf değil, yarim_gun ve 0,98 olur.

Bu cevap bir yazılımın içinde doğrudan kullanılabilir. Bir if koşuluna girebilir, bir tabloya yazılabilir ya da bir optimizasyon modeline parametre olarak aktarılabilir.


Hangi problemlerde kullanılır?

Jev’in uygun olduğu problemlerin ortak bir yapısı vardır: girdi serbest metindir, ama verilmesi gereken karar birkaç seçenekten birini seçmektir. Bu yapı birçok sektörde gün içinde binlerce kez tekrarlanır.


Tablo 1. Farklı sektörlerde Jev ile verilebilecek kararlar
Tablo 1. Farklı sektörlerde Jev ile verilebilecek kararlar

Bu örneklerin hepsinde karar tek başına bir sonuç değildir. Kararın ardından gelen bir süreç vardır: bir yönlendirme, bir öncelik sıralaması ya da bu yazıda olduğu gibi bir optimizasyon modeli. Jev, metin ile bu süreç arasında bir köprü işlevi görür.


Nerede avantaj sağlar?

Bu tür kararlar bugün genellikle iki şekilde verilir. İlki kural tabanlı yaklaşımdır: “notta ‘yarım gün’ geçiyorsa yarım gün say” gibi. Ancak notlar her seferinde farklı ifadelerle yazılır. “13:00'te çıkacak” ifadesi bu kuralı geçemez. Jev ise ifadenin anlamını okur.


İkincisi dil modelleridir. Bir dil modeli metni anlar, ama cevabını metin olarak yazar, bu cevabın ayrıca ayrıştırılması gerekir. Ayrıca her çağrı saniyeler sürer. Gün içinde binlerce kez tekrarlanan bir karar için bu hem yavaş hem maliyetlidir. Jev’in cevabı ise yarım saniyenin altında gelir ve her zaman tanımlanan seçeneklerden biridir.

Jev’in en önemli avantajı ise cevabıyla birlikte verdiği olasılık değeridir. Bu değer, kararın ne zaman otomatik uygulanacağını, ne zaman bir insana sorulacağını belirlemeyi mümkün kılar.

Jev bir karardan %95 eminse karar uygulanır. %60 eminse vardiya amirine sorulur.

Nerede kullanılmamalı?

Jev hesap yapmaz, optimizasyon problemi çözmez ve metin üretmez. Bu nedenle bu yazıdaki çalışmada iş bölümü açıktır.

Jev okur, kod hesaplar, PuLP karar verir.

Jev’in Dengeli İş Atama Problemindeki Yeri

Önceki modelde süreç iki adımdan oluşuyordu; tur verisi hazırlanıyor, ardından PuLP modeli turları toplayıcılara atıyordu. Toplayıcılar hakkında modelin bildiği tek şey numaralarıydı. Bu çalışmada iki adımın arasına yeni bir katman ekleniyor.

Vardiya notları → Jev → çalışma süresi ve hız → toplayıcıya özel hedefler → PuLP → atama

Jev bu süreçte yalnızca bir iş yapar. Her toplayıcının notunu okuyup iki soruya cevap verir. Atama kararına doğrudan karışmaz.

Jev’e hangi sorular soruluyor?

Problem tanımında yapılan adil dağıtım tanımı, iki bilgiye ihtiyaç duyar. Bunlardan ilki toplayıcının o gün ne kadar süre çalışacağı ve diğeri ise ne kadar hızlı çalıştığı. Bu iki bilgi için iki ayrı soru tanımlanır.

İlk soru çalışma süresine ilişkindir. Cevabın tam gün, yarım gün veya çalışmıyor seçeneklerinden biri olması beklendiği için soru Choice tipindedir.

İkinci soru toplayıcının hızına ilişkindir. Hız, yavaştan hızlıya sıralı bir ölçekte ifade edildiği için soru Score tipindedir. Ölçek beş seviyeden oluşur:

0 — Çok yavaş: işe yeni başlamış, lokasyonları henüz öğreniyor 1 — Ortalamanın altında: yeni ama öğrenmesi hızlı 2 — Ortalama: normal tempo veya notta hız bilgisi yok 3 — Ortalamanın üstünde: deneyimli, kıdemli 4 — Çok hızlı: en yüksek performans, kıdemli ve hatasız

İki bilginin tek bir soruda değil ayrı sorularda sorulmasının sebebi, aynı toplayıcının hem yarım gün çalışıp hem de hızlı olabilmesidir. Jev her iki soruyu da tek bir çağrıda cevaplar.

Jev ne cevap verdi?

8 toplayıcının notları Jev’e gönderildiğinde aşağıdaki cevaplar elde edildi.

Tablo 2. Vardiya amirinin notları ve Jev’in cevapları
Tablo 2. Vardiya amirinin notları ve Jev’in cevapları

Tablodaki iki cevap özellikle dikkat çekicidir. 4 numaralı toplayıcının notunda “yarım gün” ifadesi geçmemesine rağmen Jev, 13:00'te çıkmanın yarım gün çalışmak anlamına geldiğini belirledi. 6 numaralı toplayıcının notunda ise iki farklı bilgi bir arada bulunuyordu. Jev yarım gün iznini çalışma süresine, “yeni ama hızlı öğreniyor” bilgisini ise hız ölçeğinin 1. seviyesine yerleştirdi.


Ölçeği kim belirliyor?

1 numaralı toplayıcının hız skoru dikkatle incelenmesi gereken bir sonuçtur. Notta “depodaki en kıdemli” ifadesi geçmesine rağmen Jev bu toplayıcıyı en üst seviyeye değil, 3. seviyeye yerleştirdi. Bunun sebebi ölçeğin tanımıdır. Kıdem 3. seviyede yer alır, 4. seviye ise kıdemin yanında en yüksek performansı da gerektirir. Notta performansa ilişkin bir bilgi bulunmadığı için Jev ölçeği tanımlandığı gibi uyguladı.


Jev’in kararını notlar kadar ölçeği tanımlayan kişi de belirler.

Bu durum, Jev’i kullanırken seçeneklerin ve ölçek tanımlarının birer iş kararı olduğunu gösterir. “Sekiz yıllık kıdem tek başına en yüksek hız seviyesine karşılık gelir mi?” sorusunun cevabını Jev değil, depo operasyon yöneticisi verir.

Jev emin olmadığında ne olur?

Jev her cevabıyla birlikte bir güven değeri döndürür. Bu çalışmada çalışma süresi için 0,7'nin, hız için 0,5'in altındaki güven değerlerinde ilgili toplayıcının vardiya amirine sorulması kuralı tanımlandı.

8 toplayıcının tamamında güven değerleri 0,88'in üzerinde çıktığı için bu kural devreye girmedi. Bu çalışmada çalışma süresi ve hız kararları için güven eşikleri tanımlandı. Eşiklerin altında kalan cevaplar, vardiya amirinin kontrol etmesi gereken kararlar olarak işaretlenmektedir. Gerçek bir uygulamada bu kontrol tamamlanmadan ilgili parametrelerin optimizasyon modeline aktarılmaması gerekir.

Modelin Genişletilmesi

Jev’den gelen cevaplar birer etiket ve skordur. Optimizasyon modelinin bu cevapları kullanabilmesi için önce sayısal katsayılara dönüştürülmeleri gerekir. Bu dönüşüm Jev tarafından değil, iş kurallarına göre Python kodunda yapılır.


Çalışma süresi katsayısı, tam günlük bir vardiyaya oranla belirlenir:

  • tam gün için 1,0,

  • yarım gün için 0,5,

  • çalışmıyor için 0,0.

Hız katsayısı ise hız ölçeğinin her seviyesine, ortalama bir toplayıcıya göre verimi ifade eden bir değer atanarak belirlenir:

  • 0. seviye için 0,60,

  • 1. seviye için 0,80,

  • 2. seviye için 1,00,

  • 3. seviye için 1,15 ve

  • 4. seviye için 1,30.

Jev’in skoru iki seviye arasında bir değer aldığında, hız katsayısı iki seviyenin katsayıları arasında doğrusal olarak hesaplanır. Örneğin 2,91 skoru için katsayı 1,00 + 0,91 × 0,15 = 1,14 olur.

Bu katsayılar örnek amaçlı belirlenmiştir. Gerçek bir uygulamada, depo yönetim sistemindeki geçmiş toplama verilerinden türetilmelidir.

Modele eklenen yeni parametreler aşağıda yer alıyor.


Önceki modelde operatör başına düşen ortalama desi miktarı ve tur sayısı tüm operatörler için aynıydı. Genişletilmiş modelde bu iki parametre, her operatörün etkin kapasitesinin toplam kapasite içindeki payına göre hesaplanır.


Bu tanımla operatörlerin hedeflerinin toplamı, yine toplam desi miktarına ve toplam tur sayısına eşit olur. Böylece hiçbir tur dağıtımın dışında kalmaz. 8 operatör için hesaplanan değerler aşağıdaki tabloda görülüyor.


Tablo 3. Operatöre özel hedefler
Tablo 3. Operatöre özel hedefler

Modelin kümeleri, karar değişkenleri ve amaç fonksiyonu önceki yazıdaki ile aynı kalır. Değişen yalnızca operatör başına düşen desi ve tur sayısına ilişkin (2) ve (3) numaralı kısıtlardır. Bu kısıtlarda tüm operatörler için ortak olan Davg ve Tavg yerine, her operatöre özel Davg_i ve Tavg_i kullanılır.



Diğer bir deyişle Jev, modelin yapısını değiştirmez. Değiştirdiği şey, modelin operatörler hakkında bildikleridir.

Python ile Kodlama ve Çözüm

Uygulamaya ilişkin not: Bu çalışma, Jev’in matematiksel optimizasyonla birlikte kullanımını göstermek amacıyla hazırlanmış bir uygulama denemesidir. Jev’in ürettiği çalışma süresi ve hız kararları, Python tarafında tanımlanan örnek katsayılarla optimizasyon modeline aktarılmıştır. Bu katsayılar gerçek operasyon verilerinden öğrenilmediği için sonuçlar yaklaşımın işleyişini göstermektedir. Gerçek kullanımda model kararlarının doğrulanması, belirsiz cevapların manuel kontrolü ve operatörlerin çalışma süresi kısıtlarının ayrıca uygulanması gerekir. Kodların tamamına GitHub deposundan ulaşılabilir.

Kod, iş bölümünü yansıtacak şekilde üç dosyaya ayrılmıştır:

  • tur verisini ve vardiya amirinin notlarını içeren veri.py,

  • Jev'e soruların gönderildiği ve cevapların katsayılara dönüştürüldüğü jev_katmani.py ve

  • genişletilmiş dengeli tur atama modelini içeren model.py.

Bu bölümde yalnızca Jev'in sürece dahil olduğu ve modelin değiştiği kısımlar ele alınıyor.

İlk olarak Jev’e sorulacak sorular tanımlanır. Çalışma süresi için Choice, hız için Score tipinde birer soru oluşturulur.


SORULAR = {
    "calisma_suresi": {
        "type": "choice",
        "instructions": "Operatör bugün ne kadar süre çalışacak?",
        "criteria": {
            "tam_gun": "Tam vardiya çalışacak. Notta süreyi kısaltan bir bilgi yoksa bu seçilir.",
            "yarim_gun": "Vardiyanın yaklaşık yarısında çalışacak: yarım gün izin, erken çıkış, randevu gibi.",
            "calismiyor": "Bugün hiç çalışmayacak: tam gün izin, raporlu gibi.",
        },
    },
    "hiz": {
        "type": "score",
        "instructions": "Operatörün toplama hızı ve verimi ortalama bir toplayıcıya göre nasıl?",
        "criteria": [
            "Çok yavaş: işe yeni başlamış, lokasyonları henüz öğreniyor",
            "Ortalamanın altında: yeni ama öğrenmesi hızlı",
            "Ortalama: normal tempo veya notta hız bilgisi yok",
            "Ortalamanın üstünde: deneyimli, kıdemli",
            "Çok hızlı: en yüksek performans, kıdemli ve hatasız",
        ],
    },
}

Daha sonra her operatörün notu Jev’e gönderilir ve cevaplar alınır.

for i, metin in operator_notlari.items():
    r = requests.post(
        "https://api.typesafe.ai/v1/systemone",
        headers={"Authorization": f"Bearer {os.environ['TYPESAFE_API_KEY']}"},
        json={
            "model": "jev-latest",
            "state": {"operator_id": i, "vardiya_amiri_notu": metin},
            "questions": SORULAR,
        },
    )
    a = r.json()["answers"]
    cevaplar[i] = {
        "calisma_suresi": a["calisma_suresi"]["choice"],
        "sure_conf": a["calisma_suresi"]["confidence"],
        "hiz": a["hiz"]["score"],
        "hiz_conf": a["hiz"]["confidence"],
    }

Jev’in cevapları katsayılara dönüştürülür ve operatöre özel hedefler hesaplanır.

SURE_K = {"tam_gun": 1.0, "yarim_gun": 0.5, "calismiyor": 0.0}
HIZ_K = [0.60, 0.80, 1.00, 1.15, 1.30]

def hiz_katsayisi(skor):
    alt = min(int(skor), 3)
    return HIZ_K[alt] + (skor - alt) * (HIZ_K[alt + 1] - HIZ_K[alt])

etkin = {i: SURE_K[c["calisma_suresi"]] * hiz_katsayisi(c["hiz"]) for i, c in cevaplar.items()}
toplam = sum(etkin.values())

Davg = {i: sum(tur_desi) * etkin[i] / toplam for i in operator_list}
Tavg = {i: len(tur_list) * etkin[i] / toplam for i in operator_list}

Modelde yalnızca (2) ve (3) numaralı kısıtlar değişir. Önceki yazıdaki Davg ve Tavg parametrelerinin yerini operatöre özel Davg[i] ve Tavg[i] alır.

for i in operator_list:
    model += lpSum(x[(i, j)] for j in tur_list) >= Tavg[i] * z
    model += lpSum(x[(i, j)] * desi[j] for j in tur_list) >= Davg[i] * y

Son olarak model çözülür.

model.solve(HiGHS(msg=False, timeLimit=60))

Sonuçların Değerlendirilmesi

Genişletilmiş modelin etkisini görmek için iki model aynı veriyle çalıştırıldı. Orijinal model önceki yazıdaki haliyle, yani tüm operatörler için aynı hedefle çözüldü. Genişletilmiş model ise Jev’den gelen operatöre özel hedeflerle çözüldü. Her iki modelin sonuçları üç ölçüt üzerinden karşılaştırıldı: operatör başına toplam desi, tur sayısı ve atanan işin tamamlanması için gereken süre.

İlk olarak operatör başına düşen toplam desi miktarlarına bakılır.


Orijinal modelde her operatöre 1.802 ile 1.869 arasında desi atanmıştır. Dağılım, önceki yazıda hedeflendiği gibi oldukça dengelidir. Genişletilmiş modelde ise operatörlere atanan desi miktarı 807 ile 2.585 arasında değişmektedir. 7 numaralı operatör, 6 numaralı operatörün üç katından fazla iş almıştır. İlk bakışta orijinal modelin daha adil bir dağıtım yaptığı düşünülebilir.

Benzer bir tablo tur sayılarında da görülür.



Orijinal modelde operatörlere 9 veya 10 tur atanırken, genişletilmiş modelde tur sayıları 4 ile 13 arasında dağılmıştır. Bu iki grafik, tek başına değerlendirildiğinde genişletilmiş modelin dengeyi bozduğu izlenimini verir.

Ancak bu izlenim, atanan işin tamamlanması için gereken süreye bakıldığında değişir. Her operatörün işini bitirmesi için gereken süre, atanan desi miktarının operatörün hızına bölünmesiyle hesaplanmıştır.


Grafikteki kesikli çizgiler, her operatörün o gün müsait olduğu süreyi gösterir. Orijinal modelde turuncu çubukların önemli bir kısmı bu çizgilerden uzaktadır.

İşe yeni başlayan 2 numaralı operatörün, kendisine atanan işi tamamlaması 12 saat sürer. Saat 13:00'te çıkacak olan 4 ve 6 numaralı operatörlere ise sırasıyla 7,2 ve 8,9 saatlik iş atanmıştır.

Buna karşılık kıdemli ve hızlı olan 1, 3 ve 7 numaralı operatörler işlerini 6 saat civarında tamamlayıp vardiyanın geri kalanında boşta kalmaktadır. Orijinal planda toplam 12,1 saatlik iş operatörlerin müsait sürelerini aşarken, aynı gün içinde toplam 7,9 saatlik kapasite kullanılmadan kalmaktadır. Diğer bir deyişle depo, aynı gün içinde hem fazla mesai hem de atıl kapasite yaşar. Müsait süreyi aşan işler ise ya fazla mesaiyle tamamlanır ya da ertesi güne kalır.

Genişletilmiş modelde mavi çubuklar kesikli çizgilerle neredeyse örtüşür. Tam gün çalışan operatörler işlerini 7,9 ile 8,2 saat arasında, yarım gün çalışanlar ise 4,0 ile 4,1 saat arasında tamamlar. Hiçbir operatör müsait süresini önemli ölçüde aşmaz ve hiçbir operatör boşta kalmaz.

Üç grafik birlikte değerlendirildiğinde, iş miktarında görülen dengesizliğin aslında harcanan sürede bir denge sağladığı görülür. İki model arasındaki farkı yaratan şey çözüm yöntemi değildir. İki model de aynı amaç fonksiyonunu, aynı kısıt yapısını ve aynı çözücüyü kullanır. Fark, genişletilmiş modelin operatörler hakkında bildiklerinden kaynaklanır.

Eşit dağıtmak, her zaman adil dağıtmak anlamına gelmez.

Sonuç

Bu çalışmada, daha önce ele aldığım dengeli iş atama optimizasyon modelini, operatörlerin çalışma sürelerini ve göreli hızlarını dikkate alacak şekilde genişlettim. Temel çıkış noktam, eşit iş dağıtımının her zaman adil iş dağıtımı anlamına gelmemesiydi.

TypeSafe AI tarafından geliştirilen Jev modelini kullanarak vardiya amirinin serbest metin notlarını çalışma süresi ve hız bilgilerine dönüştürdüm. Bu bilgiler Python tarafında sayısal katsayılarla eşleştirilerek matematiksel optimizasyon modeline aktarıldı. Böylece modelin temel yapısını değiştirmeden, operatörlere özel iş yükü hedefleri oluşturuldu.

Sonuçlar, orijinal modelin desi ve tur sayısını dengeli dağıtmasına rağmen operatörlerin farklı kapasiteleri nedeniyle tamamlanma sürelerinde dengesizlikler oluşabildiğini gösterdi. Jev destekli modelde ise iş yükleri operatörlerin etkin kapasitelerine göre dağıtılarak tamamlanma süreleri kullanılabilir çalışma sürelerine yaklaştırıldı.

Burada kullanılan hız katsayıları örnek amaçlı belirlendiğinden, sonuçlar gerçek operasyonel performans artışının kanıtı olarak değil, önerilen yaklaşımın uygulanabilirliğini gösteren bir deney olarak değerlendirilmelidir. Gerçek kullanımda bu katsayıların geçmiş operasyon verileriyle doğrulanması ve Jev’in kararlarının izlenmesi gerekir.

Bu çalışmada Jev’in matematiksel optimizasyonun yerini almasını değil, onu tamamlamasını hedefledim. İş bölümü oldukça basit:

Jev metni okur, kod hesaplar, optimizasyon modeli karar verir.

Bence bu yaklaşımın asıl değeri, operasyonlarda notlar ve açıklamalar içinde kalan bilgilerin matematiksel modellere aktarılabilmesidir. Benzer bir yapı, çağrı merkezlerinden saha ekiplerinin planlanmasına kadar farklı kaynak atama problemlerinde de kullanılabilir.

Sonuç olarak, yapay zekâ ile optimizasyonun birlikte kullanımındaki fırsat her zaman daha hızlı çözüm üretmek olmayabilir. Bazen asıl kazanım, mevcut optimizasyon modellerinin daha doğru ve daha zengin bilgilerle karar vermesini sağlamaktır.

Bu yaklaşımın, farklı sektörlerdeki iş atama ve planlama problemlerine esin kaynağı olmasını umuyorum.

Dr. Şükrü İMRE

Not: Bu yazıdaki Python kodları, Anthropic’in geliştirdiği yapay zekâ asistanı Claude ile birlikte yazılmıştır. Problemin kurgusu, modelin tasarımı ve sonuçların yorumu yazara aittir. Kodların tamamı yazar tarafından çalıştırılarak doğrulanmıştır.


 
 
© 2026 Şükrü Orcun İmre. Tüm hakları saklıdır.
bottom of page