MIT Açık Ders malzemeleri
6.046J Algoritmalara Giriş, Güz 2005
Bu materyallerden
alıntı yapmak veya kullanım şartları hakkında bilgi almak için:
Erik
Demaine ve Charles Leiserson, 6.046J IntroductiontoAlgorithms, Fall 2005.
(Massachusetts Institute of Technology: MIT OpenCourseWare). http://ocw.mit.edu (Giriş
Tarihi: 08, 01, 2010). Lisans: Creative
CommonsAttribution-Noncommercial-ShareAlike.
Not:
Lütfen atıf taparken bilgilere eriştiğiniz gerçek tarihi kullanınız.
Atıflar
ve Kullanım Koşulları konusunda daha fazla bilgi için:
http://ocw.mit.edu/terms
ve http://www.acikders.org.tr
sitesini ziyaret ediniz.
DERS 18
Hepinize Günaydın. Erken ve aydınlık bir saatte hepinizi burada görmekten
mutluyum. Araştırma Görevlilerinin sayısının öğrencilerinkini geçeceği günleri
sayıyorum. Bir gün bu olacak. Tanıdık bir hikayeye geri dönüyoruz. Bu Yıldız
Savaşları / İkinci Bölüm Empire Strikes Back. Son defa, rakibimiz, “grafik” bir problem ile karşımıza
çıkmıştı. Bir kaynağımız vardı, yönlendirilmiş bir grafiğimiz ve kenarların
üzerinde ağırlıklar vardı ve hiçbiri de negatif değillerdi. Ve mutluluk hüküm
sürüyordu. Ve Dijkstra’nın algoritmasını tasarımlayarak, tek kaynaklı enkısa
yollarda, s ‘ den diğer her köşeye enkısa yol ağırlığını en etkin şekilde
bularak, İmparatorluğa karşı galip gelmiştik.
Bugün ise, Ölüm Yıldızı arşivinden
bize yeni bir şaşırtıcı oyun çıkarıyor: Potensiyel olarak, negatif
ağırlıklarımız var. Ve özellikle negatif ağırlık çevrimleri ile bir şekilde
uğraşmak zorunda kalacağız. Ve bir negatif ağırlık çevrimimiz olduğunda, ortalıkta
tekrar, tekrar ve tekrar dolaşabildiğimizi ve zaman içinde de gittikçe daha
gerilere gidebildiğimizi görmüştük. Ve geçmişte canımızın istediği kadar geri
gidebiliyoruz. Ve bu nedenle enkısa yol diye birşey olmuyor, çünkü hangi yolu
alırsanız ondan daha kısasını elde edebiliyorsunuz. Böylece bugün bu konuyu
işlerken, Dijkstra kadar hızlı olmayan ama ondan daha basit olan, Bellman –
Ford adlı yeni bir algoritmayı göreceğiz.
Bu yeni algoritma,
negatif ağırlıklara izin veriyor ve ümit ettiğiniz kadar çok sayıda olmamakla
birlikte, bir anlamda negatif ağırlık çevrimlerine de yer veriyor. Bu nedenle
şüphesiz devamı için de yer ayırmamız gerekiyor. Pekala, tahmin edeceğiniz gibi,
Bellman-Ford algoritması iki kişi tarafından keşfedilmiş bir algoritma olup,
enkısa yol ağırlıklarını hesaplıyor. Ama ağırlıklar hakkında herhangi
varsayımda bulunmuyor. Ağırlıklar tamamen rastgele ve enkısa yol ağırlıklarını hesaplıyor.
Şu simgelemi unutmayın: Delta (s, v), s’den v’ye enkısa yol ağırlığıdır. s’ye
kaynak köşesi deniliyordu.
Ve böylece, küçük v
olarak adlandıracağımız tüm köşeler için ağırlıkları hesaplamak istiyoruz. Buradaki
iddiaya göre, s’den heryere hesaplama yapmak, s’den belli bir yere hesaplamaktan daha güç değildir. Öyleyse, hesaplamayı hepsi için
yapacağız. Durum burada da aynı olacak.
Ve negatif ağırlıklara izin veriyor. Ve bu da iyi bir durum ama bir alternatif de
var, o da Bellman-Ford, “Dikkat! bir negatif
ağırlık çevrimi var” diyebilir.
Öyle bir durumda bunu
söyleyecektir. Demek ki negatif ağırlık çevrimi var denilebiliyor. Bu sebeple
bu deltalardan bazıları eksi sonsuz’dur. Ve bu biraz garip görünüyor. Böylece,
bugün tanıtacağımız Bellman-Ford bu durum için, ama negatif ağırlık çevrimleri
yok; dolayısıyla daha fazla sezgisel. Onlara izin veriyor gibi görünmekle
birlikte onları rapor ediyor. Bu durumda size delta değerleri vermeyecek. Delta
değerleri almak için algoritmayı değiştirebilirsiniz ama, biz burada bunu
görmeyeceğiz. Böylece algoritmayı gördükten sonra, egzersizde, “bu deltaları
bütün durumlar için hesaplayın.”
denilecek. Aslında yapılması güç değil. Ancak onun için burada zamanımız yok.
Algoritma şu. Anlaşılması bayağı kolay.. Söylediğim gibi,
Dijksrtra’dan daha kolay. Bir gevşetme algoritması. Yaptığı ana şey Dijkstra
gibi kenarları gevşetmek. Bu nedenle, Dijkstra’dan çıkan birçok önkuramı burada
kullanabileceğiz. Doğruluğunun ispalanmasına gelince, üç kez daha kısa, çünkü
üçte ikisini zaten Dijkstra’dan biliyoruz. Korkarım, biraz fazla ileriye
atlıyorum. Böylece, birinci kısım ilklendirme. Gene, d[v], s’den v’ye tahmin
edilen uzaklığı temsil edecek.
Algoritma yol alırken biz
de bu tahminleri güncelleyeceğiz. Ve başlangıçta, d[s] sıfır; ancak muhtemelen ileride bu doğru cevap
olmayabilir. Bunun dışında her şey sonsuz ve tabii ki bu bir üst sınırdır. Bunların
her ikisi de gerçek uzaklık üzerinde üst sınırlardır. Buraya kadar iyi.. Bu
önceden yaptığımız gibi ilklendirme.. Ve şimdi v eksi bir kez
tekrarlayan bir ana döngümüz var. i dizinini
kullanmayacağız. O sadece bir sayaç.
Ve her kenara
bakacağız ve onları gevşeteceğiz. Çok basit bir fikir. Eğer gevşetmeyi
öğrenirseniz deneyebileceğiniz ilk şey bu olur. Soru
ne zaman duracağımız. Yani şöyle birşey: Bir arkadaşım vardı, altı
yaşındayken, durmadan “banana
kelimesini nasıl
heceleyeceğimi biliyorum ama ne zaman duracağımı bir türlü bilmiyorum.”
derdi. Aynı durum
gevşetmede söz konusu. Önceki
gibi gevşetme adımımız bu. Kenara bakıyoruz; bilinen tahminlerimize göre üçgen
eşitsizliğini ihlal edip etmediğini görüyoruz; s‘ den
v‘ ye uzaklığın, azami s’den u’ya, artı o kenarın u‘ dan v’ ye olan ağırlığı
kadar olduğunu biliyoruz. Eğer eşit değilse, eşitliyoruz.
Bunun her zaman yapılabilecek bir işlem olduğunu kanıtlamıştık.
Biz asla ihlal etmiyoruz, yani eğer birçok dengeye dönme işlemi yapsak bile, şu d[v]’ler
hiç küçülmez. Böylece temel fikir olarak her kenarı alırsınız,
gevşetip dengeye döndürürsünüz. Hangi düzende olduğuna
aldırmıyorum. Sadece gevşetin,her kenarı ve her
defasında sadece bir tanesini. Bunu V eksi bir kere yaparsınız. Bunun anlamı, eğer negatif ağırlık çevrimleriniz
yoksa bu miktar yeterlidir. Yani eğer negatif ağırlıklı
çevrim varsa, bunu hesaplamamız gerekir. Bunu oldukça
doğrudan bir yolla yapacağız, yani tamamen aynı şeyi yapacağız. Böylece bu, buradaki döngünün dışında. Grafiğimizde
her kenar için benzer dört döngümüz olacak.Gevşetmeye çalışacağız.
Gevşetebilirseniz bu sava göre bir negatif ağırlık çevrimi
var demektir.
Böylece ispat gerektiren ana şey
bu. Pekala, algoritma bu. Sava göre,
uçlarda d[v] olması lazım – Bakalım buraya “else” yazmamız gerek.. d[v] eşittir Delta
(s, v), tüm v köşeleri için.. Eğer bu kurala
göre bir negatif ağırlık çevrimi bulamıyorsak, tüm enkısa yol ağırlıklarımızı
elde etmiş olmamız gerekir.. Sav yada iddia bu. Şimdi ilk soru, buradaki koşma
süresinin çözümlemesi çok kolay. Öyleyse, koşma süresi ile başlayalım. Şuradaki
Dijkstra ile karşılaştırabiliriz.
Bu algoritmanın koşma
süresi nedir? V çarpı E, kesinlikle. Mantıklı
olacağı için, V ile E nin her ikisinin de pozitif olduklarını varsayacağım. Böylece
bu V çarpı E dir. Yani bu Dijkstra’dan biraz daha yavaş, hatta oldukça
yavaştır. İşte orada. E artı V log V, aslında log’ları unutursak bayağı doğrusal
zamanlı olur. Grafiğin bağlantılı olduğunu varsayarsak, burada en azından V’de karesel bir şeyimiz var. Yani daha yavaş ama bu
negatif ağırlıkları da işleyecek. Dijkstra ise negatif ağırlıklarla hiçbir
şekilde işlem yapamaz. Böylece, bu algoritmanın çalışacağını neden bekleyebileceğimizi
göstermek için bir örnek yapalım.
Ondan sonra da tabii ki
çalıştığını ispatlayacağız. Ancak ispatı çok kolay olacak. Buraya negatif
ağırlıkları olan, ama negatif ağırlık çevrimleri olmayan ve ilginç bir yanıt
elde edeceğim bir grafik çizeceğim. İyi. Bu algoritmanın çıkışını iyi
tanımlanmış kılmak için gerek duyduğum
diğer şey, bunun kenarlarını ziyaret ettiğim düzendir. Bu nedenle bu kenarlara tamamen keyfime göre rastgele bir
düzen vereceğim. Sizlerden bir düzen isteyebilirdim ancak, notlarımla uyumlu
olması için düzenlemeleri ben yapacağım. Şuna dört sayısını verip, ziyaret
edeceğim dördüncü kenar diyelim. Fark etmez. Ama belli bir grafik için algoritma
sırasında ne olacağını etkileyecektir.
Hepsini yazdım mı? Bir, iki,
üç, dört, beş, altı, yedi, sekiz, tamam. Ve benim kaynağım A olacak. Ve işte bu.
Şimdi bu algoritmayı çalıştırmak istıyorum. Herşeyi ilklendirmeye başlayacağım.Tahminleri
s için sıfır, diğer tüm şeyler için de
sonsuz olarak saptıyorum. Ve bir zaman kavramı oluşturmak için, algoritma
ilerledikçe ağırlıkların yani “d” değerlerinin ne olduklarını buraya çizeceğim
veya yazacağım; çünkü arada iptal edeceğim ve tekrar yeniden yazacağım için biraz
karışık hale gelecekler. Ancak, izini
burada takip edebileceğiz. Başlangıçta sıfır ve sonsuzlar. Evet?
Fark etmez. Böylece
algoritmada kenarlara her defasında isterseniz değişik bir sıra içinde
gidebilirsiniz. Bunu ispatlayacağız ama ben, her seferinde aynı düzen ve sıra
içinde gideceğim. İyi soruydu. Ama burada önemli olmayacak. Pekala işte burası başlangıç
noktası. Şimdi her kenarı gevşeteceğim.
Bunun sonucu burada hiçbirşey yapmayan bir sürü kenar olacak. Eksi bir kenarını gevşetmeye çalışıyorum. Kendi
kendime, “s den B ye, sonsuz ağırlıkla nasıl varıldığını biliyorum.” diyorum.
Sonsuz artı iki ile, s’den
E ye varabiliyorum. Sonsuz artı iki sonsuzdan çok daha iyi değil. Tamam bu
nedenle herhangi birşey yapmıyorum, bunu sonsuza güncellemiyorum. Demek istediğim, sonsuz artı iki kulağa daha
da kötü geliyor. Ama sonsuz artı iki, sonsuzdur. Böylece bu kenar bir oluyor. Ve bu gevşetme yapılmamış
kenar iki; aynı uğraş, kenar üç; aynı uğraş kenar dört; yavaş yavaş enteresan birşey elde etmeye
başlıyoruz. Burada A dan B ye, toplam ağırlık olan eksi biri kullanarak
varabileceğim sınırlı bir değer var.
Bu iyi haber. Buraya
eksi bir yazacağım ve B yi eksi bire güncelleyeceğim. Gerisi aynı kalacak. Böylece bunu tekrar tekrar
yapacağım. O dördüncü kenardı. Beşinci kenarda da bir gevşetme elde ediyoruz.
Dört sonsuzdan iyidir. Böylece C dört sayısını alıyor. Sonra kenar
altıya varıyoruz. O sonsuz artı beş, dörtten kötüdür. Pekala orada gevşetme
yok. Kenar yedi, enteresan çünkü, burada
da saptanmış sonsuz olmayan bir değer var:
eksi bir artı bu kenarın ağırlığı yani üç. Bu toplamda iki ediyor, ki bu da aslında dörtten iyi. Böylece buradaki yol, A – B - C, gerçekte
bir saniye evvel bulduğum yoldan daha iyi. Böylece
buna iki sayısını veriyorum. Bütün bunlar ana döngünün
birinci turunda oluyor.
Aslında C’ye iki
yol bulduk. Biri diğerinden daha iyi..
Tamam, o yedi sayılı kenar idi. Sekiz
sayılı kenar burada. O fark etmez. Bu döngünün ilk
turu bu idi, yani i’nin ilk değeri. i eşit 1. Pekala şimdi devam ediyoruz;
ve devam edelim. Böylece bir sayılı kenar ile
başlıyoruz. Şimdi,
eksi bir artı iki bir olur. Bu da sonsuzdan iyi.
Hızlanmaya başlayacak.
Aynı zamanda tekrarlayan nitelikte. Bitirmemiz
fazla sürmeyecek. Numara iki, bu sonsuz onun için birşey yapmıyoruz. Numara
üç, eksi bir artı iki, bir eder ve bu sonsuzdan iyidir.
Bu D köşesi ve sayısı üç. Numara
dört, onu zaten yaptık.
Hiçbir şey
değişmedi. Beş numara: burada tekrar dört sayılı yolu görüyoruz,
fakat ikiden kötü. Bu sebeple, herhangi bir
şeyi güncellemiyoruz.
Numara altı: bir artı beş,
altı eder, bu ikiden büyük, yani iyi değil. Bu taraftan gidelim. Numara yedi: aynı durum. Numara
sekiz: bu ilginç. Böylece burada birin ağırlığı ve eksi üçün ağırlığı var.
Toplam eksi iki yapıyor ki bu birden iyi. Bu D idi. Ve-- sanırım hepsi bu
kadar. Bu da o turun sonu oluyor. Bu i eşit 2, çünkü sekizinci kenara demin bakmıştık..
Burada hile yapacağım ve kontrol edeceğim. Gerçekten o sonuncu şeydi..
D’den dışarı çıkan
kenarlardan birkaçını kontrol edebiliriz, çünkü sadece D’ nin değeri değişti ve
başka gevşetme yada dengeye dönme işlemi mümkün değil. Demek ki iki turda, en kısa
yol ağırlıklarının hepsini elde ettiğimizi iddia edebiliriz. Algoritma
doğruluğu garanti etmek için pratikte dört döngü yapacak, çünkü burada beş köşemiz
var ve bundan bir eksiğini yapmalı. Yani aslında uygulama aşamasında, burada
alt kısımda iki tane daha boş tur var. Orada hiçbir şey olmaz, ama boş verin
yapsın.
Özetle Bellman–Ford bu. Demek istediğim, şüphesiz
yanlış bir şey yapmıyor. Buradaki soru, negatif ağırlık çevrimler olmadığı
sürece, V eksi bir adımda yakınsama neden garanti ediliyor? Bir soru mu var?
Doğru, öyleyse bu bir eniyileme, yani optimizasyondur.
Eğer bir tam tur keşfederseniz ve hiçbir şey olmazsa, onun izini algoritmanın içinde
takip eder ve durabilirsiniz. En kötü ihtimalle bir değişiklik yapmayacaktır.
Fakat pratikte belki onu yapmak isteyeceksiniz. İyi sualdi. Tamam, bazı basit
gözlemler yani sadece gevşetme yapıyoruz demek istiyorum. Öyle ise, daha önceki
çözümlemelerimizin çoğunu kullanabiliriz. Özellikle d değerleri monoton bir
şekilde sadece azalıyor. Burada, değerleri iptal ederken, onları daima daha küçültüyoruz
ki, bu iyi bir şey. Bu algoritmanın hoş taraflarından bir diğeri de, onu dağıtımlı
bir sistemde bile uygulayabilirsiniz.
Eğer bu gerçek bir ağ, belli sayıda
bilgisayar içeren bir ağ ise ve bunlar makineler, bu hatlar ile haberleşiyorlarsa, tamamen yerel
bir şey demek istiyorum.--Gevşetme yerel bir şeydir. Her hangi bir global stratejiye ihtiyacınız olmaz ve siz, “her adımda
farklı bir düzen yapabilir miyiz?” diye sorarsınız. Evet, kenarları gevşetmeye, tekrar gevşetmeye
devam edebilir ve bunu ağın ömrü süresince sürdürebilirsiniz. Ve en sonunda en kısa
yolları bulursunuz. Böylece bu algoritma dağıtımlı bir sistemde, V turda işi
bitirmeyi garanti ediyor. Daha fazla asenkron olabilir
ve o takdirde çözümlemesi de daha güçtür.
Ama sonunda gene çalışacaktır. Yakınsama için
garantilidir. Bu nedenle Bellman-Ford, internette en kısa yolları bulmak için çok
kullanılmaktadır. Pekala, şimdi son olarak çalıştığını
ispatlayalım. Bu sadece birkaç tahta dolduracaktır. Demek ki, bir grafiğimiz
olduğunu ve negatif ağırlık çevrimleri olmayan belli kenar ağırlıkları olduğunu
farz ediyoruz. Sonra iddiaya göre, doğru yanıt ile bitiriyoruz. Öyle ise
Bellman-Ford, her bir köşe için delta
değerlerine ayarlanmış tüm bu d[v] değerlerini sona erdiriyor.
Kanıtlaması çok hızlı olacak -- eğer daha
önceki önkuramları kullanmak yoluyla yapmayı hatırlıyorsanız..
Burada her köşeye ayrı ayrı bakacağız. Buna
köşe v adını veriyorum. İddiaya göre, bu algoritmanın sonunda da geçerli olacak.
Unutmayın, ispat etmemiz gereken şey, belli bir noktada d[v] eşittir Delta (s, v)
olduğu; çünkü monoton bir şekilde azaldığını, ama asla doğru değerinden daha küçük
olmadığını biliyoruz, çünkü gevşetmeler, daima güvenlidirler.
Öyleyse, göstermemiz gereken belli bir
noktada bunun geçerli olduğu ve en sonunda da geçerli olacağı. Yani, d
değerlerin monotonluğu ve Doğruluk bir’i kullanarak -- ki bu d[v]’lerin daima Deltalara büyük – eşit
olduğuydu, göstermemiz gereken bir noktada bir eşitliğin olduğu. Hedefimiz bu.
Böylece yapacağımız sadece v’ye bakmak ve v’ye gelen en kısa yola bakmak ve algoritmada
bu yolun üstünde neler olduğunu görmek.
Bu amaçla, yola bir isim vereceğim. Küçük p
diyelim. Köşe da başlıyor ve , ’ye
gidiyor ve ’da
sona eriyor. Ayrıca, bu herhangi bir en kısa yol değil, s’de başlayan bir yol. Yani
yani s’de başlıyor ve v’de son buluyor. Bu
yüzden, s ile v ye, daha belirgin bir biçimde konuşabilmem için birkaç isim daha
vereceğim. Böylece bu s’den v’ye bir en kısa yol. Şimdi sadece s’den v’ye herhangi
bir en kısa yol olmasını istemiyorum – s’den v’ye olan en kısa yollar arasında,
olabilecek en az kenarı olan bir en kısa yol olmasını da istiyorum.
Burada kullandığım ‘’en kısa’’ kelimesi, yolun toplam ağırlığı
cinsinden bir anlam taşır. Ağırlık açısından en kısa olmak yanında, kenar
sayısı açısından da en kısa olmasını istedim. Bunun sebebi, p nin basit bir yol
olmasını, başka bir deyimle aynı köşeden bir defadan fazla geçmeyen bir yol
olmasını istemem. Şimdi, içinizde küçük p nin basit bir yol olmasını garantilemek
için, neden kenar sayılarının da olabilecek en az sayıda olmasını varsaymaya
ihtiyaç duyduğumu söyleyebilecek kimse var mı?
İddiaya göre, en kısa yolların hepsi mutlaka
basit değildir. Efendim? Doğru. Bir
sıfır ağırlık çevrimim olabilir. Bu nedenle teoremde, burada hiç negatif
ağırlık çevrimi olmadığını umut ediyoruz. Ancak gene de sıfır ağırlık çevrimi
olabilir. Sıfır ağırlık çevrimini, herhangi bir en kısa yolun ortasında bir
yere koyabilir, böylece kendi arzunuza göre uzatabilir ve köşeleri defalarca
tekrarlayabilirsiniz. O yol sıkıcı olur. O nedenle, p basit olsun istiyorum.
Aslında kestirmeden giderek onu garanti
edebilirim. Herhangi şekilde bir sıfır ağırlık çevrimi alırsam, onu atarım. Bu,
bunun matematik yoldan yapılma şekillerinden bir tanesidir. Pekala,
bu en kısa yol hakkında daha başka neler biliyoruz? En kısa yolların içindeki alt-yolların da en
kısa yollar olduklarını biliyoruz. Bu en iyi alt-yapı. Başka, s’den ’ye
olan en kısa yolun ne olduğunu tümevarımsal olarak biliyoruz. Demek istediğim,
en kısa yol o yolun ağırlığı ki, özellikle, s’den V eksi bire, artı son kenarın
ağırlığı, o da en iyi alt yapıda v eksi bir’den ’ye
olan yol.
Bu, son olarak ispat etmiş olduğumuz en iyi
alt-yapı nedeniyle oluyor. Pekala, bu kadarı ısınmak
için fazla bile. Böylece, bir çeşit tümevarım ile bunu i
içinde, ile başlayıp, ’ye
kadar giderek yapmak istiyorum. Bu durumda birinci soru, d[] , ki
bu s’dir, Kaynağın d’si, nedir? Doğal olarak
algoritmanın başında bu sıfırdır. Başka bir anlatımla başlangıçta sıfıra eşittir,
çünkü bu şekilde saptadık. Ve oradan sadece küçülür. Yani tabii ki azami
sıfırdır.
Gerçek soru,
Delta (s virgül ) nedir? s’den s’ye en kısa yol ağırlığı nedir? Sıfır olması gerek, aksi takdirde bir negatif
ağırlık çevriminiz olur -- kesinlikle. Benim en çok sevdiğim yanıt, sıfır.
Böylece, eğer s’den s’ye bir yolumuz daha olsaydı, o bir çevrim olacaktı demek
istiyorum. Bu nedenledir ki mutlaka
sıfır olması lazım. Buradan çıkan sonuç, demek ki bunlar algoritmanın başında
gerçekten eşitler, ki bu da çok iyi bir sonuç. Çünkü burada yukarda tartıştık, azalıyor ama
asla çok fazla küçülemiyor. Bu nedenle, d[]’ı,
doğru saptamış oluyoruz. Şahane: tümevarımın
taban şıkkı için iyi. Şüphesiz asıl ilgilendiğimiz v’lerden olanı.. Yani tümevarımsal
olarak hakkında konuşalım ve
sonra bir sonuç olarak ’yi
elde edelim.
Evet, tümevarım ile yapalım. O daha
eğlenceli. d[]’nin
algoritmanın “i’ninci” turundan sonra Delta (s, )’ye
eşit olduğunu söyleyelim. Böylece bu
gerçekte, burada algoritmanın içinde olan i ‘ye atıf yapıyor. Bunlar turlar.
Böylece bir tur, tüm kenarların uygulanması, tüm kenarların gevşetilmesidir.
Böylece bu, elbette i eşit sıfır için doğrudur. Sıfır turdan sonra
algoritmanın başında, d[] eşit, Delta (s, ) dır.
Pekala, bu tam benim istediğim değil ama, kabul edilebilir. Şimdi bunu d[artı
bir] için ispatlayacağız.Genellikle, sizlere bir şeyi
farz etmenizi öneririm. Aslında, niye kendi tavsiyemi kendim uygulayıp
değiştirmiyorum? Genellikle tümevarımı
bir özyineleme gibi düşünmek daha hoştur. Böylece bunun doğru olduğunu farz edersiniz,
örneğin j’ye ilgilendiğiniz
i’ den küçük dersiniz ve sonra bunu d[]
için ispatlarsınız. Bu şekilde düşünmek genellikle çok daha kolaydır. Özellikle
i’den daha küçük tüm değerler için güçlü tümevarım kullanabilirsiniz. Burada
sadece bir eksiğine ihtiyacımız olacak. Burada deltalar bağlamında “i” ile (i
-1) arasında belli bir ilişkimiz var. Ve bu sebeple, d değerleri konusunda bazı
şeyleri tartışmak istiyoruz.
Pekala,
burada ne olup bittiği hakkında biraz düşünelim. (i-1) sayıda turdan sonra, tümevarım
hipotezine göre d[]
eşittir Delta (s, )
olduğunu biliyoruz. Ve bunu i’ninci turda bitirmek istiyoruz; yani
bunu yapmak için bir turumuz daha var. d[]’nin,
doğru cevabının Delta (s, )
olduğunu sonuçlandırmak istiyoruz. Bu hiç tanıdık geliyor mu? Böylece, bu turda
her kenarı gevşetmek istiyoruz. Özellikle belli bir noktada, () köşesiyle köşesi arasındaki kenarı gevşetmemiz
gerekiyor. Bu yolun kenarlardan oluştuğunu biliyoruz. Yolun tanımı bu
şekilde.
Böylece, i’ ninci turda her kenarı
gevşetiyoruz. Bu nedenle, eksi bir ile arasındakini de gevşetsek iyi olacak. Ve
sonra, ne olur? Hafıza testiniz. Çabuk, çabuk
.. Ölüm Yıldızı yaklaşıyor. Öyle ise, eksi bir için doğru bir değerimiz var ise, oradan
dışarı çıkan bir kenarı gevşetiyoruz; bu da demektir ki, o kenar s’den ’ye
en kısa yoldur. Ne biliyoruz? d[]
doğru değer oluyor – yani Delta (s, ) oluyor.
Son derste, buna doğruluk önkuramı adını vermiştik. Dijkstra algoritmasında
ispat ettiğimiz şeylerden biri idi, ancak gerçekten gevşetme ile ilgili
gerçeklerden biriydi. Ayrıca çok basit
bir kanıtlamaydı.
Ve bu, şu gerçekten çıkar. En kısa yol
ağırlığının bu olduğunu biliyoruz. Bu nedenle, elbette, d[] bu
nedenle en az bu kadar büyüktü --ve şimdi daha da büyük olduğunu düşünelim aksi halde
işimiz son bulmuş olurdu. d[]’nin
buna ayarlanmış
olduğunu biliyoruz. Böylece, gevşetme
aşamasında kontrol edilen koşul tamamen bu. Ve, d[] değerinin
bundan daha büyük olacağını farz edelim. Ve sonra buna eşitleştireceğiz. Ve
böylece bu s’nin d’si, olur.
Demek ki kenarı gevşettiğimizde onu doğru
değere getirmemiz gerekiyor. Böylece bu ispatın da sonu oluyor, değil mi? Çok
basit. Kısacası, en kısa yolunuza bakıyoruz. Ve işte burada. Ve
eğer bunun hiç negatif ağırlık çevrimi olmadığını varsayarsak, başlangıçtaki
değeri doğrudur. D[s] sıfır olacaktır. Birinci turdan sonra bu kenarı
gevşetmeniz gereklidir. Ve ondan sonra bu köşe için doğru değeri elde
edersiniz. İkinci turdan sonra, bu kenarı gevşetmeniz lazım. Bu kenar, bu köşe
için size doğru d değerini verir ve bu devam eder.
Böylece, hangi en kısa yolu alırsanız alın,
bu çözümlemeyi ona uygulayabilirsiniz. Eğer bu yolun uzunluğuna
baktığınızda -- burada k kenar olduğunu varsaymıştık, o durumda
k turdan sonra bitmiş olması gerektiğini
bilirsiniz. Aslında daha ispatın sonuna gelmemişiz, özür dilerim. Demek ki, k sayıda
turdan sonra için doğru yanıtı buluyoruz
ve o da sadece v. Böylece tek soru, k ne kadar büyük olabilir? Ve cevabın da doğru
olması iyi olur, en çok v eksi bir, çünkü algoritmanın sadece v eksi bir sayıda
adım atmanızın yeterli olacağı şeklinde
bir savı var.. Ve gerçekten de bir grafikteki basit
bir yolun kenarlarının azami sayısı, köşelerin sayısından bir eksiktir.
Gerçekten de p basit olduğunda, k da en çok v
eksi bir’dir. Sadece en kısa yol olması ile yetinmeyip basit olmasını da
istememizin nedeni buydu. Basit olması, herhangi bir köşeyi tekrarlamaması
bakımından gerekliydi. Yani yolda en çok v sayıda köşe varsa, o yolda en çok v
-1 kenar olur. Bellman-Ford konusunun hepsi bu kadar. Doğruluk
açısından çok kolay. Şüphesiz daha evvel görmüş olduğumuz önkuramların
çoğunu bu kapsamda kullanabiliyor olmamız her şeyi daha kolaylaştırıyor. Bu
teoremin yada kanıtlamanın bir diğer sonucu da, “eğer
Bellman-Ford yakınsama yapamazsa” sorusu olabilir ama algoritma bu d eksi bir
adımdan sonra gevşetmenin hala işlem gerektirip gerektirmediğini zaten kontrol
ediyor.
Gerçekte bu algoritmanın sonunda bir tur daha
vardır, V’ninci turla son bulur ve o
zaman bir değişiklik olup olmadığına bakar. O halde algoritmanın, V eksi bir
adım yada turdan sonra yakınsama yapmadığını söyleyeceğiz. Böyle bir durumun söz
konusu olabilmesi için negatif ağırlık çevrimi olması lazım. Bu ise
kanıtladığımızın, “contrapositive” yani devrik durumu olur. İspatladık ki, eğer
negatif ağırlık çevrimi olmadığını varsayarsanız, d[s]’nin sıfır olduğunu
biliyoruz; ve öyleyse bu argüman, v eksi bir’den sonraki turlarda
da bir yakınsama yapmanız
gerektiğini anlatıyor. Oysa, en kısa yol ağırlıklarına
ulaştığınızda yapılacak bir şey kalmaz, çünkü monoton şekilde gittiğiniz için
hiçbir zaman dibe vuramazsınız.
En alta asla varamazsınız. V eksi bir turdan
sonra yakınsamada başarısız olursanız, bu ilk baştaki varsayımın ihlali olur.
Yaptığımız tek varsayım, negatif ağırlık çevrimi olmadığı varsayımı idi.
Böylece, bu da bize Bellman-Ford’un gerçekten doğru olduğunu söylüyor.
Bellman-Ford, negatif çevrim yok dediği zaman, gerçekten yoktur. Doğrusu budur.
Bellman-Ford’u, böyle bir durumda değiştirebilir, biraz daha uzun çalışmasını
sağlayabilir ve eksi sonsuzların nerede olduğunu bulabilirsiniz.
Aslında bu, bence bir anlamda problem setinde
yapmanız gereken şeylerden biri. O nedenle burada daha fazla yer
vermeyeceğim. Ama her durumda, eksi sonsuzların nerede olduklarını bulmak
açısından iyi bir egzersizdir. Bir negatif ağırlık çevrimiyle ulaşılabilecek
tüm köşeler nelerdir? Eksi sonsuz olan köşelerdir. Pekala
bunun çok hızlı olduğunu söyleyebilirsiniz. Ancak ders daha bitmedi. Macera henüz
bitmiş değil. Bellman-Ford’u daha büyük ve kapsamlı en-kısa yol problemlerini
çözmek için kullanmaya devam edeceğiz.
Bugünkü derste kalan zaman içinde, doğrusal
programlama denen daha genel probleme uygulandığını göreceğiz. Gelecek derste
de, “tüm-ikili-en-kısa yollar ” ile, hayret verici bazı
şeyleri yapmada Bellman-Ford’u gerçekten kullanacağız. Şimdi buraya geçelim.
Demek ki bugün, pek o kadar açık olmasa da hedefimiz, her köşe çifti arasındaki
en-kısa yolları hesaplamak. Vardığımız aşamada Bellman-Ford’u
v kere kullanarak bu hedefe
ulaşabiliriz.
Ama şüphesiz biz daha iyisini yapmak
istiyoruz. Ve o da, üçlemenin zirvesi olacak. Pekiyi bugün Luke’un babasının
kim olduğunu keşfettik. Demek ki, en-kısa yolların babası doğrusal
programlamadır. Aslında, aynı anda hem babası, hem annesi olur, çünkü
programların cinsiyeti yoktur. Babam,’’annenle beraber tuluat dersleri aldık, tuluatçılıkta derecemiz var’’ demekten hoşlanır.
Bir defasında,’’komedi-tuluatçılık derslerine
espri kabiliyetimizi arttırmak için gittik. Dersler, espri gücümüzü arttırmadı.
Sadece kullanmaktan korkmamamızı öğretti’ dedi..
Böylece hepiniz bu espriye muhatap oldunuz. Luke’ un babasının bununla ilgisini
göremedim, ama devam edelim. Demek ki, doğrusal programlama çok genel bir sorun
ve çok büyük bir araç. Doğrusal programlamayı daha önce görmüş olan var mı? Pekala, bir kişi. Ben eminim, hayatınızda bir gün, optimizasyon yani en-iyileştirme hesaplamaları ile ilgili
bir şeyler yaparken, doğrusal programlama bir noktada karşınıza çıkacaktır. Çok
faydalı bir araçtır. Size bir matris ve iki vektör veriliyor; bu daha çok heyecan verici değil. Yapmak istediğiniz
bir vektör bulmak. Bu konunun çok kuru bir açıklaması oldu.
O kadar ilginç kılan şeyin ne olduğunu
birazdan göreceğiz. Böylece bir hedefi maksimize etmek istiyorsunuz ve bunu
önleyici sınırlamalarınız var. Ve bunların hepsi doğrusal. Yani
hedefiniz, x değişkenleri içinde bir doğrusal fonksiyon ve sınırlarınız bir
grup doğrusal limit, eşitsizlik limitleri ve bu da işi ilginç hale getiriyor. Bu,
doğrusal cebir veya başka yerde görmüş olduğunuz gibi yalnızca doğrusal bir sistemi
çözmekten ibaret değil. Veya öyle bir x değişkeni de yok. Böylece belirsiz
biçimde tanıdık geldiğinden Bellman-Ford teoremini aklınıza getirebilirsiniz.
Yani bir şeyi bulmak, ya da olmadığını göstermek istediğinizde, arada belli bir
ilinti olduğunu ortaya koyacağız.
Her şeye rağmen hala belirsiz bir bağlantı ama, ben bir şeyi maksimize etmeyi de istiyorum, veya en
kısa yolları bir çeşit minimize etmeyi; buna benzer bir şey. Bu sınırlamalarımız
var. --Evet.-- Bu size sezgisel gelebilir bilmiyorum. Ben daha geometrik bir anlatımı
tercih ettiğimden, bir geometrik resmi çizmeye çalışacağım ve bunu şimdiye
kadar bir kara tahta üzerinde hiç denemedim, bu yüzden ilginç olacak. Galiba,
feci şekilde başarısız olacağım. Oniki yüzeyli gibi bir şeye benziyor değil mi?
O biçimde, o tipte; pek de değil. Altı biraz fazla kaba. Neyse,
eğer bir grup doğrusal sınırlamalarınız varsa, bunun 3 boyutlu olması gerek. Şimdi
onu etiketliyorum.. İşte 3-D oldu..
İyi.
Demek ki bu doğrusal sınırlayıcılarınız var.
Bu, n boyutlu hiper- uçakları tanımlamak gibi oluyor. Pekala,
burada bu üç boyutlu alanınız var. Dolayısıyla, n eşit üç. Ve bu hiper-uçakların
eğer sadece bir tarafına bakarsanız ve bu küçük-eşit durumudur – ve arakesitini
alırsanız, belli bir poli-topaç, yada bir dışbükey “polihedron”
yani çok yüzeyli cisim elde edersiniz. 3-D boyutunda on iki yüzlü yada
benzerini elde edebilirsiniz . Ve hedefiniz, vektör c, ve o da yukarı yönlü diyelim var. Bunun c vektörü
olduğunu farzedin.
Böylece hedefiniz bu politopaçta en yüksek
noktayı bulmak. Burada belki de burası.. Evet, hedef bu. Bu optimal yani en
iyi x. Bu geometrik görünümü. Eğer cebirsel görünümünü tercih ederseniz, “c-transpose”
yani c-çapraz çarpı x’in en büyük
değerini istersiniz. Böylece bu m’dir. Bu da n. Boyutların uygunluğunu kontrol edelim.
Yani bu nokta çarpımı maksimize etmek istiyorsunuz.. c
yönünde x’in uzunluğunu
maksimize etmek istiyorsunuz. Ve, bunu belki de şöyle
görünen belli sınırlamalar çerçevesinde yapmak istiyorsunuz. Böylece, bu A ve bu
da m’ye n. Onu,
n yüksekliği ile çarpmak istiyorsunuz.
Bu x .. x’i buraya
aşağıya koyayım; bu n’ye bir. Bu yükseklikte bir şeyden daha küçük veya ona
eşit olmalı; ve o da b olmalı -- sağ taraftaki. Tamam,
bu da cebirsel görünüm, tüm boyutların çalıştığını kontrol etmek için. Ama
burada her sırada bir şeyleri okuyabilirsiniz, bu sütün ile çarpıldığında size
burada bir değer verir. Ve bu da tüm x
kenarlarında doğrusal bir sınırlamadır. Böylece bu doğrusal fonksiyonu, tüm bu
sınırlamalara bağlı kalarak ’den ’ ye
kadar maksimize etmek istiyorsunuz. Pekala,
oldukça kolay ama, çok da kuvvetli ve genel. Böylece, bununla en kısa yollar gibi sayısız problemi doğrusal bir
program olarak formüle edebilirsiniz. Bu nedenle, genel bir araçtır.
Ve bu sınıfta doğrusal programlamayı çözmek
için hiçbir algoritma görmeyeceğiz. Biraz şaşırtıcı. Sadece varlıklarını
söylemekle yetineceğim. Böylece, bunu yapan pek çok etkili algoritma ve de kod
var. Çok pratik kurulumlar. Böylece, LP’leri
yani doğrusal programları çözmek için çok algoritma var. Doğrusal programlar
genellikle LP olarak kısaltılır. Ve
sadece birkaç tanesini belirteceğim. “Simpleks” yani Tek-Yönlü Algoritma var. Bu ilk algoritmalardan
biri. Yanılmıyorsam ilki. Elipsoid-algoritma
var. Dahili nokta metodları ve rastgele örnekleme var. Bunların her
biri hakkında birkaç şey söyleyeceğim çünkü hiçbirini derinliğine
incelemeyeceğiz.
Simpleks algoritma, dünyadaki ilk
algoritmalardan biri olup şüphesiz en popüler algoritmalardan da biridir. Bugün
hala kullanılıyor. Aşağı-yukarı bütün doğrusal programlama kodları, tek-yönlü
algoritma kullanır. En kötü durumda, üstel zaman kullandığından, teorik olarak
oldukça kötüdür. Ancak pratikte çok iyi çalışır. Ve son zamanlarda bunun nedenini anlamak için
çalışmalar yapılıyor. Ama en kötü durumda gene de üstel’dir. Ama pratiktir. Simpleksin, polinomsal zamanda çalışan bir varyasyonu olup
olmadığı hala açık bir problem. Fakat bu konuya girmeyeceğim. Çünkü bu doğrusal
programlama alanındaki büyük bir problem.
Polinomsal zamanda
doğrusal programlamayı çözmede ilk model, elipsoid algoritma olmuştu; yani uzun
süre kimse bunun nasıl yapılacağını bilmiyordu. Bu süre içinde insanlar polinomsal
zamanın iyi bir şey olduğunu farketti. Bu 1960’ların sonunda oldu. Polinomsal
zaman iyidir. Ve elipsoid algoritma bunu uygulayan ilk algoritma olmuştu. Çok
genel bir algoritmadır ve teorik bakımdan çok kuvvetlidir; öte yandan tamamen
pratik olmayan bir algoritmadır. Ama güzel tarafı, üstel açıdan pek çok
limitleri olan doğrusal bir programı çözümlemeyi polinomsal zamanda yapmanıza
izin vermesidir. Çılgınca her şey var. Son olarak sadece polinomsal zamanlı olduğunu
söylemekle yetineceğim. Hakkında güzel bir şey söyleyemiyorsam hiçbir şey
söylemesem daha iyi olacak herhalde.. Pratik değildir.
Dahili nokta
metodları, bir çeşit karışımdır. Onlar da polinomsal zamanda çalışır. Bunu garanti edebilirsiniz. Bu metotlar çok da
pratiktir ve bu sebepten, “Tek yönlünün” mü, “dahili
noktaların” mı daha iyi olduğu konusunda bugünlerde bir hayli rekabet var.
Bugünkü durumu tam olarak bilmiyorum ama, birkaç yıl
önce gırtlak-gırtlağa idiler. Rastgele örneklemeye gelince bu tamamen
yeni bir yaklaşım. Bu da birkaç yıl önce iki MIT profesörü Dimitris Bertsimas
ve Santosh Vempala tarafından geliştirildi, biri Elektrik Mühendisliği, diğeri
sanırım uygulamalı matematik dallarında çalışıyor.
Bunları sırf bu alanda aktif çalışma olduğunu
göstermek için anlattım. Pek çok kişi, hala doğrusal programların sorunlarını
çözmek için yeni yollar buluyorlar. Bu tamamen rastgele hale getirilmiş, çok
kolay ve çok genel. Şimdiye kadar hiç kullanılmadı. O nedenle ne kadar pratik
olduğunu bilmiyoruz. Ama potansiyeli var. Çok düzenli. Pekiyi biz doğrusal
programlamanın nispeten daha basit bir versiyonuna
bakacağız. Yapacağımız ilk sınırlama aslında pek o kadar sınırlama da değil.
Ama her şeye rağmen öyle sayacağız. Düşünmesi nispeten daha
kolay. Böylece, burada bir poli-topacımız vardı ve belli bir hedefi maksimize
etmek istiyorduk. Bir fizibilite probleminde bilmek istediğim şey, poli-topacın
boş olup olmadığıdır? O poli-topaçta
herhangi bir nokta bulabiliyor musunuz?
Bu sınırlamaları karşılayacak, önceden saptanmış herhangi grup değer, x,
bulabiliyor musunuz?
Pekala,
öyle ise bir c hedefi yok. Öyle bir
x bulun ki, böylece Ax, B’ye küçük-eşit
olsun. Görünüşe göre, ‘’ Eğer doğrusal fizibiliteyi çözebilirseniz, doğrusal programlamayı da çözebilirsiniz ‘’ şeklindeki
çok genel bir teoremi ispatlayabilirsiniz. Biz burada bunu ispatlamayacağız ama, daha kolay gelmesine ve düşünülmesinin kolay olmasına
karşın bu, gerçekte orijinal problemin kendinden daha kolay değildir. Aslında, “LP’den
yani doğrusal programlamadan daha kolay değildir.” diyecektim. Pekala, yapacağımız ikinci sınırlama, gerçek bir
sınırlamadır. Ve bu problemi oldukça basitleştirmektedir.
Ve bu “difference constraints” yani fark kısıtları’na bir bakış olacak.
Eğer tüm bu anlattıklarım biraz soyut geldi ise şimdi ayaklarımızı biraz yere
basacağız. Fark kısıtları sistemi, bir
doğrusal fizibilite yani olurluk problemidir. Yani hedefi olmayan bir Doğrusal
Programlamadır. Ve bir kısıtlaması vardır; burada bir A matrisinin her sırasında
bir adet 1, ve bir adet eksi 1 vardır ve geri kalan
her şey 0’dır.
Başka bir deyişle, her kısıtlayıcının kendine
özgü çok basit bir şekli vardır. Bunlar, iki değişken ile birkaç sayıdan
oluşur. Böylece, eksi , ‘ye
küçük - eşit, gibi bir şey. Bu sadece bir sayıdır. Bunlar da iki değişken. Bir
eksi işareti var, burada başlarında hiç katsayı yok, buradaki ’lerden
yok, sadece ikisi var. Ve bu çeşit kısıtlayıcılardan bir grup var, matrisin her
sırasında bir tane. Geometrik olarak bunun ne anlamı olduğunu düşünmedim. Bence
bu hiper-uçakların basit şeyler olduğu anlamını taşıyor. Af edersiniz, bundan
daha iyisini yapamıyorum. Çoklu boyutlarda bunu görmek biraz
güç.
Ancak yakında, daha önce gördüğümüz bir şeyle
ilişkilenmeye başlayacak, yani yandaki tahtadan söz ediyorum. Pekala sırf göstereceğimiz bir şey olması için, çok hızlı
bir örnek yapalım. Burada fark kısıtları olan basit bir sistem var --
Pekiyi ve bir de çözüm. Neden olmasın? Bunu çözmek çok basit de değil
ama -- işte çözümü. Burada kontrol edilmesi gereken tek şey, bu kısıtların her
birinin karşılanmış oldukları. eksi , 3
eder ki, o da, 3’ten az veya ona eşittir, ve böylece devam ediyor.
Negatif değerler olabilir. Pozitif değerler
olabilir. Fark etmez. Bu fark kısıtları sistemini, bir grafik şekline
dönüştürmek istiyorum, çünkü grafikler hakkında epey şey biliyoruz. Böylece
buna kısıt grafiği diyeceğiz. Ve bu
kısıtları temsil edecek. Nasıl mı yaparım? Her bir kısıtı alıyorum, genelde
buna benziyor ve onu bir kenar haline dönüştürüyorum. Pekala,
eğer onu eksi , ’den
küçük veya onu eşit şeklinde yazarsam, w ağırlıkları ima eder.
Bunu w olarak adlandırmamın nedeni buydu. Onu
da, ‘den ‘ye bir kenar yapacağım. Böylece düzen biraz evriliyor.
Ve o kenarın ağırlığı, ’dir.
Öyleyse böyle yapın. n köşe yapın. Yani, köşelerin
sayısı n olsun. Kenarların sayısı kısıtların sayısına eşit olur ki, o da m,
yani matrisin yüksekliğidir; ve sadece dönüştürün. Örneğin
burada üç değişkenimiz var. Öyle ise, üç köşemiz var, yani , , .
Bizim, eksi
’miz
de var. Böylece, ‘den ’e
kadar ağırlığı 3 olan bir kenarımız var. eksi ümüz
var. Öyleyse, ‘den ‘ye , ağırlığı eksi 2
olan bir kenarımız var. eksi ‘ümüz var. Öyleyse, ‘ten, ’e ağırlığı
2 olan bir kenarımız var. Ümit ederim, yönleri doğru aldım. Evet..
Böylece işte bir grafik : şimdilik
en kısa yollara belirgin bir bağlantı yok, değil mi? Ancak, aslında bu kısıtlar
en kısa yollarla yakın şekilde bağlantılıdır. Şunu yeniden yazayım. Doğal
olarak, , artı
’den
daha küçük veya ona eşit, diyebilirsiniz.
Veya onu d[j], küçük- eşit d[i] artı w (i virgül j) gibi düşünebilirsiniz. Burası
kavramsal bir balon... Bir hayli tanıdık mı? Üçgen eşitsizliğine çok benzer, gevşetme
yada dengeye dönmeye çok benzer gibi. Yani şimdi kanıtlayacağımız
gibi, bu iki problem arasında çok yakın bir bağlantı bulunmaktadır.
Öyleyse iki teoremimiz olacak. Negatif
ağırlık çevrimlerinden bahsetmeleri nedeniyle Bellman – Ford ‘un doğruluğuna
benzer görünecekler. Başlıyoruz. Bu kısıtlar grafiğimiz var. Negatif
ağırlıkları olabilir. Pozitif ağırlıkları olabilir. Eğer negatif ağırlık çevriminiz
var ise, bu önem kazanır. Bu nedenle ispatlanması gereken ilk şey, eğer negatif
ağırlık çevriminiz var ise, bunun kötü bir şey olacağıdır. Pekiyi kötü ne olabilir? Aslında sadece bu kısıtlar sistemini karşılamaya
çalışıyoruz. Dolayısıyla ‘’kötü şey,’’ hiçbir çözümün olmaması olabilir. Bu
kısıtlar, olurluk kavramının dışında olabilirler. İddia da o. Başka bir deyişle
iddia, bunun aslında, “if and only if” yani bir ‘’eğer ve sadece eğer’’ durumu olduğudur.
Ancak ilk
olarak ‘’eğer’’ i ispatlayacağız. Eğer bir negatif ağırlık çevriminiz varsa
işiniz bitmiş demektir. Fark kısıtları karşılanamaz. Tabii bu, durumu sezgisel anlatmak
oluyor. Doğrusal Programlama dünyası bunu,
‘’infeasible’’ yani olursuz diye tanımlıyor. Ama,
‘’unsatisfiable’’ yani karşılanamaz çok daha anlamlı olurdu. Örneğin, tüm
kısıtları aynı anda karşılamak için, ‘yi
görevlendirebileceğiniz bir yol yoktur. Haydi, bir göz atalım. Negatif ağırlık çevrimini
düşünün. Belli bir köşeden başlıyor, bazı
köşelerden geçiyor ve belli bir noktada geri geliyor. Bu çevrim, ’den ’e kadar negatif
ağırlıklıysa, negatif ağırlıklı olduğu sürece köşeleri tekrarlamasına
aldırmıyorum.
Şimdi yapacağım şey bütün kısıtları yazmak.
Bu kenarlardan her biri, o grafikteki kısıtlar grubunda yer alan bir kısıta karşılık
geliyor. Bunların hepsi kenarlar. Bize ne vereceklerine bakalım. Şimdi, ‘den
’ye,
bir kenarımız var. Bu, eksi ve
en çok gibi bir şeydir. Sonra, eksi ’
miz var. O da ağırlıklı ve bu böyle devam ediyor.
Ve sonunda, eksi gibi bir şeye varıyoruz. O, bu kenar. ve en sonunda,
hepsini tamamlayan bu kenar var. Yani, eksi
.
-- . Eğer işaretleri doğru aldıysam. İyi, böylece, işte bir grup kısıt. Onlarla ne yapmamı
öneriyorsunuz? Bu kısıtların herhangi bir özelliği var mı, örneğin sol taraftakilerin?
Efendim? Doğru kelime gibi geldi. -- Neydi?
Teleskop, evet doğru. Her
şey birbirini götürüyor. Eğer bu şeylerin hepsini toplarsam, bir ile bir eksi var. Bir tane, eksi ile bir tane var. Bir tane, eksi ile, bir tane, .
Eğer sol tarafların hepsini toplarsam, hepsi birbirini götürüyor. Eğer sağ
tarafları toplarsam ne olur? Burada sıfır elde ediyorum, en sevdiğim yanıt. Ve
burada da, negatif ağırlık çevrimindeki tüm kenarların ağırlığını elde ediyoruz,
doğal olarak bu çevrimin kendisinin toplam ağırlığı olmak yanında, negatif bir
ağırlıktır da.
Bu nedenle, sıfır kesinlikle sıfırdan küçük : Sonuç çelişki. Çelişki; bir dakika, hiç yanlış bir
şey varsaymadık. Bu nedenle, matematiksel yönden bu aslında bir çelişki değil;
dünyayla çelişmedik. Sadece, bu kısıtların, birbirleriyle çelişkili olduklarını
beyan ettik. Başka bir deyişle, bu ’lerin herhangi bir değerini alırsanız, bunların
hepsinin gerçek olmaları mümkün olamaz, çünkü o zaman çelişki ortaya çıkar.. Yani bunların, bazı gerçek ’lerce
karşılanması imkansızdır. Bu nedenle bunlar
“karşılanamaz” olmalılar.
Bunların tatmin edici görevleri bulunmuyor diyelim,
biraz daha kesin olarak, ’den
’ye
kadar ağırlık yok. Bu kısıtları karşılamanın yolu yok. Çünkü sol tarafta
toplamları sıfır oluyor, sağ tarafta ise tamamen negatif. Pekala işte bu kolay bir
ispat yolu. Ters yönde olanı biraz daha zor. Yani
güzel. Bu bağlantımız var. Şimdi, bu fark kısıtlarını çözmeye motive olacağız
ve böyle bir uygulama göreceğiz. Google’da fark kısıtlarını şöyle bir
araştırdım. Bu konuyla ilgili oldukça kayda değer sayıda makale var. Ve çözüm
için hepsi en kısa yolları kullanıyor. Öyleyse çözümlemesini bildiğimiz en kısa
yollar ile, fark kısıtları arasında bir bağlantı
olduğunu kanıtlayabilirsek, o zaman çok güzel bir şey elde edeceğiz. Ve gelecek
derste, fark kısıtlar alanında daha fazla uygulama göreceğiz.
Tüm çift en kısa yollar için.. Ama şimdilik sadece bu eşitliği ispatlayalım ve
bitirelim. Böylece, ters yönden yaklaşıldığında, eğer bu kısıt grafiğinde negatif
ağırlık çevrimi yoksa, sistemin tatmin edilmesi mümkün
olsa iyi olur. İddia: bu fark kısıtlarına bir çözüm bulmada tek engeller, negatif ağırlık çevrimleridir. Sanırım, buralarda bir yerde kısıt grafiği
hakkında konuşmam gerekiyordu. İyi --
karşılanabilir. İyi..
Şimdi, en kısa yolları düşünürken çok yararlı
olan bir tekniği göreceğiz. Eğer özellikle daha evvel görmediyseniz tahmin etmeniz
güç. Bu teknik problem setlerinde, Quiz’ lerde ve sınavlarda her şeyde yararlıdır.
Bu nedenle hatırınızda tutun. Bunu nispeten kolay bu teoremi ispatlamak için
kullanıyorum ama, asıl fikir bu grafiği değiştirmek;
böylece bu kısıt grafiğine bundan böyle büyük harf G diyeceğim. Grafik
değiştirmek çok güçlü bir fikirdir. Böylece, yeni bir S köşesi veya kaynağı ekleyeceğiz;
“kaynağı kullan Luke !” Ve s’den bir takım
kenarlar ekleyeceğiz, çünkü kaynak olarak bir şeylere bağlantılı olması uygun
olur.
Böylece, sıfır ağırlıklı bir kenar ekleyeceğiz;
kısıt grafiğinde, s’den her yere, yani, her köşeye sıfır ağırlıklı kenarlar
ekleyeceğiz. O köşeler, ’den
ye
kadar olan köşeler olarak adlandırılıyor. Böylece, kısıt grafiğim
var. Sonra değiştirebilmek için bunu kopyalayayım. Değişiklik yapmadan önce
işinizi kopyalamak daima yararlıdır, değil mi?
Yeni kaynağım S köşesini buraya eklemek istiyorum. Böylece, kısıt
grafiğimi alıyorum, neye benzerse benzesin, tüm köşelere bağlantılı sıfır
ağırlıklı kenarlar ilave ediyorum.
Bu kadar basit. Şimdi
ne yaptım? Hah, hah.. Sen ne yaptın? Artık, tüm köşelere
ulaşabilen bir kaynak adayım var. Böylece,
S’ den bu köşelere ulaşan en kısa yolların, aslında yolların olduğunu umut
ediyoruz. Başka bir deyimle, s’ den her yere, en çok sıfır ağırlık ile
ulaşabilirim. Tamam, belki de daha azıyla. Daha küçük olabilir mi?
Biliyorsunuz, gibi; ona 0 eksi iki ile ulaşabiliyorum. Bu
sıfırdan daha küçüktür. Öyleyse, bir parça dikkatli olmam lazım. Yani, ya eğer
negatif ağırlık çevrimi varsa? Oh! hayır. O takdirde,
en kısa yol olmazdı. Orijinal grafikte şansımıza, hiç negatif ağırlık çevrimi
olmadığını varsayıyoruz. Eğer düşünürseniz, sadece negatif ağırlık çevrimi yoksa, orijinal grafikte s’den herhangi bir yere kenar ilave
edebiliriz. Yaptığımız işlem ile biz, yeni bir negatif ağırlık çevrimi yaratmıyoruz
çünkü, s’den
başladığınızda, herhangi bir yere sıfır maliyetle gidiyorsanız bu ağırlığı hiç
etkilemiyor demektir.
Ve sonra, eski grafikte kalmak zorundasınız. Böylece,
yeni bir negatif ağırlık çevrimi söz konusu olamaz. Öyleyse, değiştirilmiş
grafikte negatif ağırlık çevrimi yoktur. Bu iyi bir şey, çünkü s’ den de yollar
var, bu nedenle s’den her köşeye en kısa yollar var. Değiştirilmiş grafikte hiç
negatif ağırlık çevrimi yok, çünkü önceden de yoktu. Ve..
s’den gelen yolları var. Her köşeye s‘den bir yol var. Daha önce bu olmayabilirdi.
Örneğin önceden, ‘den
‘e ulaşamıyordum. Bu hala doğru ama, s’den her yere ulaşabilirim. Bunun anlamı, bu değiştirilmiş grafikte en kısa yolların var
olduğudur.
Yani, s’den çıkan en kısa yollar vardır. Başka
bir deyimle, Bellman-Ford’u kullandığım zaman yaptığım gibi, eğer s’den çıkan tüm
en kısa yolların ağırlıklarını almış olsaydım, her bir köşe için, her bir değer
için, v’nin d’sine karşılık olan bir
grup sonsuz sayı elde ederdim. Mmm.. Bu iyi bir fikre
benziyor. Haydi yapalım. Demek ki en kısa yollar mevcut. s’den ’ye enkısa yol
ağırlığını, olarak
tanımlayım. Neden olmasın? Bir rakam olarak iyi bir seçim, s’den ’ye
en kısa yol ağırlığı. Bu sonsuz, çünkü sonsuz ’dan
daha küçük ve eksi sonsuzdan da daha büyük; bu nedenle sonlu bir sayı. Bu kısıtları
karşılamak için, yapmanız gereken de bu.
Buradaki iddia, yaptığımızın tatmin edici bir
atama yada işlem olduğudur.. Niçin? Üçgen eşitsizliği. Buralarda bir yere, üçgen
eşitsizliği yazmıştık. Bu durum üçgen eşitsizliğine çok benziyor. Aslında bu
galiba kanıtın da sonu.. Buraya bir bakalım.. Bu işlem ile gerçekleşmesini istediğimiz şey, eksi ’nin, ij’ nin bir kenar olduğu her zaman, ’ye küçük
– eşit olması; veya, kenarlar kümesi içindeki , ’deki her bu tür kısıt için diyelim.
Pekiyi bu ne zaman doğru? Bunu genişleterek açıklayalım.
Yani, bu deltadır, ,
bir diğer deltadır. Böylece, bir taraftan, Delta (s, )
eksi Delta ( s, )
var. Ve sağ tarafta da, ; bu
da i’ den j’ye
kenar ağırlığı idi. Öyleyse bu ’den
‘ye kadar olan ağırlıktır. Bunu
biraz farklı yazacağım. Delta (s , )
küçük –eşittir, Delta (s, )
artı w (, ) .
Bu da üçgen eşitsizliği olur; aşağı yukarı. Böylece, s’den ‘ye en kısa yol, en çok, s’den ‘ye en kısa yol artı ‘den ‘ye özel bir yol, yani ‘den ‘ye giden tek yol olur. Bu ise, en kısa yoldan sadece daha uzun olabilir.
Ve bu da sağ tarafı büyütür, o da bu
eşitsizliği daha doğru kılar, aynen önceden de gerçek olduğu gibi. Ve şimdi bu hala doğru. Bu da kanıtlamayı tamamlar. Bu doğrudur.
Bunların hepsi eş beyanlardı. Bunun eşit olduğunu üçgen eşitsizliği aracılığıyla
biliyoruz ve bu nedenle bu kısıtların hepsi karşılanmış oldu. Sihirli gibi.. Çok heyecanlıyım. Böylece negatif ağırlık çevrimine sahip
olmanın, bu kısıt farklarının karşılanamadığı duruma bağlı olduğunu ispatlamış
bulunuyoruz.
Öyle ise, eğer onları karşılamak istersek, x ’e doğru bir yanıt bulmak istersek,
Bellman-Ford’u uyguluyoruz. Bellman-Ford, ya “olmaz, negatif ağırlık çevrimi
var.” der; o zaman çuvallarsınız. Bu takdirde bir çözüm yok demektir. Ama bilmeyi
ümit edebileceğiniz en iyi yanıt bu olabilir. Aksi takdirde, “negatif
ağırlık çevrimi yoktu, işte en kısa yol ağırlıklarınız.” da diyebilir. Bu
takdirde çıktıları yerine yerleştirirsiniz ve bum -- kısıtları karşılayacak x_i’lerinizi elde etmiş olursunuz. Şahane.
Şimdi, bu herhangi bir grafik değildi.
Yani, demek istediğim, kısıtlar ve cebir ile
başladık, bu dönüşümle onu bir grafik haline getirdik. Sonra, bir kaynak köşeyi,
s’yi ekledik. Yani sorunumuzu çözmek için bir grafik yapmak zorundaydık ve bu çok
güçlü bir fikirdi. Sonra Bellman-Fordu devreye alır, ondan yanıtları elde
ederiz. Güzel. Bu bir “reduction” yani indirgeme fikridir. Çözmek istediğiniz bir
problemi, çözüm şeklini bildiğiniz problem haline indirgeyebilirsiniz. Negatif
ağırlık çevrimleri olmadığında en kısa yollar problemini nasıl çözeceğinizi yada bir negatif ağırlık çevrimini bulma yolunu Bellman-Ford
ile biliyorsunuz.
Şimdi
de fark kısıtlarını nasıl çözeceğimizi artık biliyoruz. Aslında biraz daha fazlasını yapabilirsiniz.
Çünkü Bellman-Ford,
fark kısıtlarını sırf çözme dışında, biraz daha fazla şey de yapıyor. Ama önce sürekli
ima ettiğim şeyi yazayım. Corollary yani Doğal Sonuç; Bellman-Ford’u
kullanabilirsiniz. Yani bu grafiği yaparsınız, sonra Bellman- Fordu uygularsanız,
o sizin fark kısıtları sisteminizi
çözer. Buraya bazı sayılar yazayım. m fark kısıtınız var. Ve, n
değişkeniniz var. Bellman-Ford onları (m
çarpı n) düzeyinde çözecektir.
Gerçekte bu rakamlar biraz artar çünkü n
kenar ekliyoruz ve bir köşe ekliyoruz ama, tüm bu
rakamların önemsiz olmadıklarını varsayarsak, m en az n’ dir. Düzeyi m çarpı
n’dir. Bazılarının sıfıra yakın olduğu durumlardan kaçınmaya çalışıyorum. İyi. Ve
biraz önce bahsettiğim diğer bazı gerçekler.-- Ve bunları egzersiz olarak
bırakacağız, çünkü çok da gerekli değiller. İhtiyacımız olan esas şey bu. Ama
Bellman-Ford ile ilgili diğer bazı güzel gerçekler: Bellman-Ford, aslında bazı hedef
fonksiyonlarını optimize eder. Bazen “bu bir fizibilite problemidir. Sadece, bu
kısıtların karşılanıp karşılanamayacağını bilmek istiyoruz.” deriz. Aslında belirli bir hedef fonksiyonunu ekleyebilirsiniz.
Ona rastgele bir hedef fonksiyonu veremezsiniz ama, işte ilginç olan bir tanesi..
artı artı
, --
ama, sadece bu kadar değil. Bazı
kısıtlar da var. Pekiyi, bu bir doğrusal program. ’lerin
toplamını, ’lerin
pozitif olmamaları ve fark kısıtlarının olması koşuluyla, maksimize etmek
istiyorum. Bu, daha önce vardı. Bu, tamam. Belli bir noktada, s ‘den her yere, en
çok sıfır maliyete gidebileceğinizi gördük. Buradan, bu atamadan da tüm
x_i’lerin negatif olduklarını biliyoruz. Gerekli bir bilgi değil ama, Bellman-Ford’u uyguladığınızda,
bu da doğru oluyor. Yani sisteminizi diğerlerinden daha az genel
olmayan Bellman-Ford’u kullanarak
çözerseniz, pozitif olmayan ’
leri de elde ediyorsunuz. Ve o kısıta bağlı kalarak onları sıfıra azami
yakınlıkta, L1 normunda yapıyor.
Bu değerlerin toplamını sıfıra mümkün mertebe
yaklaştırıyor, değerlerini mümkün olduğunca en küçük mutlak değerler haline getirmeye
çalışıyor. Ve bundan daha fazlasını da yapıyor. Pişiriyor, temizliyor, en kısa
yolları buluyor. Aynı zamanda “spread”i yani yayılı hali de en aza indiriyor; i’nin tüm değerlerindeki maks. eksi, i’nin tüm
değerlerindeki min. ’yi en
aza indiriyor. Yani, eğer gerçek bir yolunuz varsa ve buralarda ’leriniz
varsa -- bu mesafeyi en aza indiriyor. Ve sıfır da buralarda
bir yerde. Böylece, x_i’ leri, mümkün olduğunca derli toplu hale
getiriyor. Bu aslında L sonsuz normu, doğrusal cebir derslerinizden normlar
hakkında bir şeyler biliyorsanız. Bu L1 normu. Sanırım her LP normunu en aza
indiriyor.
İyi. Öyleyse, bunu bir şey için kullanalım. Evet,
-- gerçek bir problem çözelim, ondan sonra bugünü bitirmiş olacağız. Gelecek
derste, gerçekten çok güzel şeyler, bu şeylerin pratikteki güzel uygulamalarını
göreceğiz. Şimdilik gene güzel, ancak nispeten basit bir uygulama göreceğiz.
Bunun adı VLSI yerleşimi’ dır. Çok
önceden VLSI’yi biraz
görmüş ve böl-ve-fethet bağlamında konuşmuştuk. Pek çok yonganız var veya onlara
bir çeki düzen vermek istiyorsunuz ve bazı hedefleri en küçük boyuta indirmek
istiyorsunuz. VLSI serimleri
yada yerleşim planlarında karşınıza tonlarca problem çıkar. İşte, bir tanesi.. Bir entegre devrenin çok sayıdaki
özellikleri ile karşı karşıyasınız.
Onları birbirlerine fazla yaklaştırmadan
devrenizde düzenlemek istiyorsunuz. Örneğin üst üste gelmelerini önleyecek şekilde
asgari ayrımlar var. Belki aralarından iletkenlerin geçmesi için mesafe
bırakmanıza yada öyle şeylere gerek var.. Yani
herhangi iki parçayı çok yan yana gelmeyecek şekilde ayrı tutmaya ihtiyacınız
var. Pekala,
sırf bir fikir vermek için, elimde bazı parçalar var; bunun nasıl çalıştığı
konusunda çok açık olmayacağım. Bazı özellikler var. Bu parçalarınız yongalar
ve benzeri şeyler. Şekillerine fazla aldırmıyoruz. Sadece onları dilediğim şekilde
hareket ettirebilmeyi istiyorum, böylece belli bir noktadaki boşluk -- boşluk
demişken biraz bu boşluğu düşüneyim. Bu boşluğun en az birkaç delta olması lazım.
Ya da, deltayı kullanmak istemiyorum, epsilon diyelim. İyi, küçük bir sayı.
Yani sadece parçalarımın arasında belli bir
ayrım olmasına ihtiyacım var. Ve bu problemi basit kılmak için parçaların sadece
yatay yönde kaymalarına izin verdiğimi söyleyeceğim. Öyleyse,
tek-boyutlu bir problem. Bu şeyler, iki boyutlu veya ne olurlarsa
olsunlar, onları sadece x ekseninde kaydıracağım. Bunu modellemek için, her parçanın
sol kenarına bakacağım ve “bu iki sol kenar en azından birazcık ayrı olmalılar”,
diyeceğim.
Böylece mesafe ne olursa olsun, birkaç
epsilon artı olacak. Ancak, hesaplamanız gereken üç boyutlu acayip şekilleriniz
varsa, bunlar aynı hizaya geldiklerinde, mesela bu çok yakın
olabilir. Ancak, belli kısıtlar var, öyleyse, her iki parçanın, birbirlerine en
çok ne kadar yaklaşabileceğini bilmem lazım. Çünkü birbirlerine çok da yakın olmamaları
lazım. Öyle ise, buna diyorum. Buna, diyorum. Öyleyse, eksi ’lik
bir kısıtımız var ve bu da en az d artı epsilon’ dur, yada
o ağırlığı ne kadar hesapladıysanız.
Böylece, her çift parça için bunu
yapabilirim, birbirinden ayrı durmaları gereken ölçüde belli bir kısıt
hesaplarım. Şimdi bu x-koordinatlarını belirlemek istiyorum. Şimdilik onları değişken
farz ediyorum. Dağınık durumdaki bu parçaları azami ölçüde derli toplu hale getirmek
ve böylece yapabileceğim en küçük yonganın içine sığabilmeleri için yatay yönde
kaydırmak istiyorum; çünkü bu para, zaman, enerji ve daha pek çok şeyden
tasarruf demek. Yonganızın daima küçük olmasını istersiniz.
Bellman-Ford bunu sağlar. Pekala,
Bellman-Ford, bu kısıtları çözümler; çünkü bunlar bir takım fark kısıtlarıdır. Ve
bunların çözümlenebilir olduklarını biliyoruz çünkü parçaları dilediğimiz kadar
uzaklıkta etrafa serpiştirebiliriz. Ayrıca, yayılmayı da en aza indirdiğinden ihtiyacım
olan yonganın boyutunu da maks. eksi min boyutuna minimize eder. Öyleyse bu, derli
topluluğu maksimize ediyor, ya da yonga boyutunu minimize ediyor. Pekala bu tek boyutlu bir program olduğundan biraz yapay
gelebilir ama iki-boyutlu problemin çözümü gerçekten güçtür. Polinomsal bir algoritma
ile yapabileceğinizin en iyisi budur.
Eğer multimedya ortamı gibi olayların zaman
çizelgesini yapıyorsanız, başka uygulamalar da vardır ve örneğin bu audio’nun
yani sesin, bu videodan en az iki saniye sonra oynamasını garanti etmek istiyorsunuz ve
ayrıca aynı zamanda oynayan başka şeyler de var ve bunların birbirlerinden ayrı
belli aralarda olmalarını istiyorsunuz; multimedya ortamındaki fark kısıtlarını
çözümlemek ve olayı mümkün kılmak için Bellman-Ford’un kullanım yolları
konusunda pek çok makale bulunmaktadır. İşte böyle..
Gelecek ders, Bellman-Ford’un tüm çiftler enkısa yollarındaki uygulamalarından
başka örnekler göreceğiz. Sorular var mı? Şahane.