Python ile Temel Programlamaya Giriş

Bir önceki yazıda Python nedir ve hangi alanlarla kullanılır gibi pek çok konudan bahsetmiştim. Bu yazıda ise Python ile temel programlamaya giriş yapacağım. Python ile kod yazarken bir IDE’ye ihtiyaç duyulur. Bir IDE(Integrated Development Environment, Tümleşik Geliştirme Ortamı), yazılım geliştirme için bilgisayar programcılarına kapsamlı olanaklar sağlayan bir yazılım uygulamasıdır. Atom, Pycharm, IDLE, Jupyter, Spyder gibi IDE’leri kullanabilirsiniz. Bu yazıda sizlere örnek olarak göstereceğim kodlar Jupyter tabanlı Google Colab’ta hazırlanmıştır. Google Colab, Python kodlarını yazmaya yarayan, kurulum gerektirmeyen, ücretsiz, birçok kütüphaneyi içerisinde barındıran ve olmayan kütüphaneleri yüklemeye izin veren; web tarayıcıda çalışan ve bilgisayarınızdan GPU ve RAM kullanmayan bir geliştirme ortamıdır.

Google Colab ile ücretsiz olarak Tesla K80 GPU üzerinde uygulamalar geliştirebilirsiniz.  Çalışmalarınız Google Drive’e kaydedebilir ya da Google Drive’ınıza yüklediğiniz bir çalışmayı Google Colab’ta inceleyebilir ve düzenleyebilirsiniz. Google Colab hakkında daha fazla bilgi almak istiyorsanız buraya tıklayarak resmi sayfaya gidebilirsiniz.

Programlama Hataları

Her programlama dilinde olduğu gibi Python’da da çalışırken hata yapmamak mümkün değildir. Bir uygulama geliştirirken yazılan kodlardaki hataları bulmak ve çözmek geliştirme sürecinde en fazla zaman harcanan bölümü olabilir. Yazacağınız en küçük programda bile onlarca farklı hata çıkma ihtimali vardır. Kod yazarken karşımıza çıkabilecek hataların ne tür bir hata olduğunu bilmek hatayı daha kolay çözmemizi sağlayacaktır.

Yazım Hataları

Syntax (söz dizimi), üzerinde çalıştığımız programlama dilinin kendine has program yapısını ve bu yapının kurulmasında kullanılan kuralları ifade eder. Her programlama dilinin yazımı farklıdır. Python derleyicisi yazdığımız kodlarda bir syntax hatası fark ederse programı durdurur ve nerede syntax hatası olduğunu gösterir. Böylece bizler nerede ve ne tür bir hata yaptığımızı görmüş oluruz. Örnek olarak ad = “Mehmet yazarsak Python derleyicisi bize burada bir hata olduğunu söyleyecektir.

ad = "Mehmet

     File "<ipython-input-1-e098e0017e34>", line 1
          ad ="Mehmet
                     ^
SyntaxError: EOL while scanning string literal

Çünkü string bir değişken tanımlanmaya çalışılmış ancak doğru bir şekilde yazılmamıştır. String ifadeler (” “) arasına yazılarak tanımlanır. Doğrusu ad = “Mehmet” şeklinde olmalıdır.

Çalışma Zamanı Hataları

Bu tür hatalar kodların hatalı yazılmasından ziyade beklenilmeyen durumlarda ortaya çıkabilen hatalardır. Örnek olarak, çalışma yaptığımız bir dosya üzerinde düzenleme iznimiz yoksa ya da veritabanında çalışacak kodlar yazmışsak ve veritabanı ile bağlantı kurmamışsak program hata verecektir.

Anlamsal Hatalar

Python’da kod yazarken, yazdığımız kodlar hatasız bir şekilde çalışır ancak istediğimiz sonuçları vermez ve farklı sonuçlar verirse anlamsal hata ortaya çıkmış demektir. Bu tür hatalar farkedilmesi zor hatalardır. Örnek olarak 13 sonucunu elde edeceğiniz 6 + 20/2 işlemini Python kullanarak çözdünüz. Ancak program size 16 sonucunu verdi.  Burada program size bir hata çıktısı vermeyecektir. Çünkü bu durumda işlem önceliği hatası yapılmıştır. Program ilk olarak 20/2 işlemini gerçekleştirir, ardından bu sonuca 6 ekleyerek sonucu elde edip size gösterir. Düşündüğümüz sonucu elde etmek için ise (6+20)/2 şeklinde yazmamız gerekirdi.

Python’da Değişkenler Ve Veri Tipleri

Değişken (variable), girdiğimiz ya da atadığımız bazı değerlerin geçiçi olarak hafızada saklanması için oluşturulan alanlara denir. Bir değişkene herhangi bir değer atamak için “ = ” ifadesi kullanılır. Örnek olarak:

meslek = "Çiftçi"
dogum_yili = 1995
ondalik_sayi = 0.5

Eğer Python’da değişkene değer ataması yapılmazsa hata alınır. Yukarıda tanımlanılan üç değişkenin tipi sırasıyla string, integer ve float’tır. Burada yazılan değişkenleri kod bloğuna yazdığımızda herhangi bir çıktı göremeyiz çünkü herhangi bir komut vermedik. Ekranda çıktı görmek için print() fonksiyonunu kullanmalıyız. Böylece değişkenlerin değerlerini çıktı olarak görebiliriz. Eğer tanımladığımız bir değişkenin tipini görmek istersek type() fonksiyonunu kullanmalıyız.

type(meslek)
str

type(dogum_yili)
int

type(ondalik_sayi)
float

Tanımlanılan değişkenler harf ile başlayabilir, içerisinde sayı ve alt çizgi barındırabilir, büyük-küçük harf barındırabilirken herhangi bir sayıyla başlayamaz ve içerisinde alt çizgi hariç özel karakterler barındıramazlar. Değişken tanımlarken dikkat etmemiz gereken bir diğer hususta değişkenlere ileride hatırlanabilecek anlamlar verilerek tanımlamaktır. Örnek olarak 5 kişinin not ortalamasını hesaplayacak bir program yazmak istiyoruz. Burada ortalamayı hesaplayacak olan işlemi, alakalı bir değişkenin değeri olarak atamamızda fayda vardır.

kisi1 = 10
kisi2 = 50
kisi3 = 70
kisi4 = 85
kisi5 = 60
notlarin_toplami = kisi1 + kisi2 + kisi3 + kisi4 + kisi5
not_ortalamasi = otlarin_toplami/5
print("Notların Toplamı: ", notlarin_toplami)
print("Not Ortalaması: ", not_ortalamasi)

OUTPUT------------------
Notların Toplamı: 275
Not Ortalaması: 55.0

Python’da anahtar kelime olarak belirlenmiş kelimeleri değişken adı olarak kullanamazsınız. Bunlara örnek olarak print, if-else, class, False, none, break, import, while, for gibi kelimeler verilebilir.

Veri Tipleri

Python’da bulunan başlıca veri tipleri aşağıdaki gibidir:

  • String veri tipi (Metinsel veri tipi)
  • Integer veri tipi (Sayısal veri tipi)
  • Long veri tipi   (Sayısal veri tipi)
  • Float veri tipi (Sayısal veri tipi)
  • Complex veri tipi (Sayısal veri tipi)
  • List veri tipi
  • Tuple veri tipi
  • Dictionary veri tipi

Yukarıda sıralanan veri tiplerinden bir sonraki yazıda detaylı olarak bahsedeceğim.

 

PYTN0FBN4Y72459ALA

 

Pi Sayısı Nedir? Tarihi ve Önemi

Bu yazıda sitemize de adını veren, Matematiğin en önemli sabitlerinden birisi kabul edilen Pi sayısından bahsedeceğim.

Pi sayısı nedir?

Pi sayısı herhangi bir dairenin çevresinin, çapına olan oranıdır. Çemberin boyutu fark etmeksizin bu oran her zaman pi’ye eşittir. 1647’ye kadar evrensel bir adı veya sembolü yoktu Matematikçiler 1700’lü yıllarda Yunanca “çevre” anlamına gelen περιμέτρου (perimetros) kelimesinin ilk harfi olan π’yi sembol olarak  kullanmaya başlamışlardır. William Jones tarafından 1706 yılında tanıtılan sembol, 1737’de İsviçreli matematikçi Leonhard Euler’in sembolü benimsemesinin ardından kullanımı popülerleşti.

William Jones (1675-1749)

Leonhard Euler (1707-1783)

Pi sayısı nasıl hesaplanır?

1767’de İsviçreli matematikçi Johann Heinrich Lambert pi’nin irrasyonel olduğunu kanıtladı ve 1882’de ise Ferdinand von Lindemann pi’nin sonsuz olduğunu kanıtladı. Bu bulgu önemlidir, çünkü bu noktaya kadar “çemberin karesini almak” olarak bilinen eşit alanlı bir kare ve bir daire oluşturulabileceğine inanılıyordu. Pi’nin sonsuz olduğunu kanıtlamak bunun mümkün olmadığını gösterdi. Pi irrasyonel olduğundan diğer tüm irrasyonel sayılar gibi bir kesir (basit veya kaba kesir olarak da bilinir) olarak gösterilemez.  π sonsuz olduğu için cebirsel değildir. Bu da bize π’nin ikinci derecen bir irrasyonel olamayacağını gösterir. İkinci dereceden bir irrasyonel olamaması π’nin periyodik bir sürekli kesire de  sahip olmadığını ifade eder. Ancak, pi dahil her irrasyonel sayı, sürekli kesir adı verilen sonsuz bir iç içe geçmiş kesirler dizisi ile temsil edilebilir:

Kesrin herhangi bir noktada kesilmesi, π için rasyonel bir yaklaşıklık verir; bunların ilk dördü 3, 22/7, 333/106 ve 355/113’tür. Bu şekilde üretilen her yaklaşım, en iyi rasyonel yaklaşımdır; yani, her biri aynı veya daha küçük paydaya sahip diğer herhangi bir kesirden π’ye daha yakındır.

Pi Sayısının Tarihi

Erken Dönem Tarihi

Pi’nin tarihi, MÖ 2000 yılına kadar uzanır. Bu dönemlerde Babilliler ve Mısırlılar π’yi kullanmışlardır. Babilliler (yaklaşık MÖ 2000) pi’yi yaklaşık olarak 3,125 kullandılar; bu değer, bir daire içine yazılmış bir altıgenin çevresini hesaplayarak, dairenin çevresine oranının 24/25 olduğunu varsayarak elde ettikleri bir değerdi. Rhind Papirüsü (yaklaşık MÖ 1650) bize eski Mısırlıların 256/81 veya yaklaşık 3.16045 değerini kullandıklarını gösteriyor. Hem Babilliler hem de Mısırlılar pi değerine ilişkin kaba sayısal tahminlere sahipti ve daha sonra Antik Yunanistan’daki matematikçiler, özellikle Arşimet, pi’yi hesaplamak için algoritmik bir yaklaşım kullanan ilk kişi oldu. Arşimet, bir çemberin içine bir çokgen ve çemberin dışına ikinci bir çokgen çizdi. Sonra sürekli olarak çokgen ekleyerek çemberin şekline gittikçe yaklaştı. Böylece 96 kenarlı çokgenlere ulaşarak 223/71 <π <22/7 veya yaklaşık 3.1418 gibi ortalama bir değer elde etti. Arşimet ayrıca bir dairenin alanının, yarıçapının karesine oranının aynı sabit olduğunu ve bir dairenin alanının, tabanı bu dairenin çevresine ve yüksekliği ise yarıçapına eşit bir üçgenin alanına eşit olduğunu kanıtlamıştır. Benzer bir yaklaşım, Çinli matematikçi ve gök bilimci olan Zu Chongzhi (429-501) tarafından da kullanıldı. Bir çemberin çevresinin çapına oranının değerini 355/113 olarak hesapladı.

Arşimet’in kullandığı yöntem
Arşimet’in kullandığı yöntem
Görsel Kaynak: piday

MS 5.yüzyılda geometrik teknikleri kullanarak Hintli matematikçiler π sayısında beş haneye yaklaşırken, Çinli matematikçiler yedi basamaklı bir yaklaşım yaptı. MS 265 civarında, Wei Hanedanı matematikçisi Liu Hui, poligon tabanlı yinelemeli bir algoritma yarattı ve bunu 3.072 kenarlı bir çokgenle kullanarak 3.1416 değerini elde etti. Liu daha sonra hesaplamanın daha hızlı bir yöntemini icat etti ve ardışık çokgenlerin alanlarındaki farklılıkların 4 faktörlü bir geometrik seri oluşturmasından yararlanarak 96 kenarlı bir çokgenle 3.14 değerini elde etti. Hintli gök bilimci Aryabhata, Āryabhaṭīya’sında (MS 499) 3,1416 değerini kullandı. Fibonacci 1220’de, Arşimet’ten bağımsız bir poligonal yöntem kullanarak 3.1418’i hesapladı.

15. yüzyıl

Fars gök bilimci Jamshad al-Kāshī,  1424 yılında pi’nin yaklaşık 16 ondalık basamağına eşdeğer olan 9 altmışlık basamak üretti. Bu basamak değeri yaklaşık 180 yıldır dünya rekoru olmuştur. Madhava, 1400 civarında π’nin 11 hanesini tahmin etmek için sonsuz seriler kullandı, ancak bu değer, çokgen bir algoritma kullanarak Pers matematikçi Jamsh Jamd al-Kāshī tarafından yaklaşık 1430’da iyileştirildi.

16. ve 17. yüzyıl

Fransız matematikçi François Viète 1579’da 9 basamak elde etti. Flaman matematikçi Adriaan van Roomen ise 1593’te 15 ondalık basamağa ulaştı. 1596’da Hollandalı matematikçi Ludolph van Ceulen 20 haneye ulaştı, bu rekor daha sonra 35 haneye yükseldi. 1630’da Avusturyalı gökbilimci Christoph Grienberger, 1040 kenarlı çokgenleri kullanarak 38 basamaklı pi hesapladı.

On sekizinci yüzyıla gelindiğinde Fransız matematikçi Georges Buffon π’yi olasılığa dayalı hesaplamanın yolunu buldu (Buffon’un iğne problemi veya Buffon’s needle problem). Isaac Newton, 16 ondalık basamağı hızlı bir şekilde hesaplamak için binom teoremini kullanmış, 20. yüzyılın başlarında, Hintli matematikçi Srinivasa Ramanujan, daha sonra bilgisayar algoritmalarına dahil edilen pi hesaplamanın olağanüstü verimli yollarını geliştirmiştir.

π’nin hesaplanmasında, 16. ve 17. yüzyıllarda sonsuz seri tekniklerinin geliştirilmesi ile devrim yaratıldı. Sonsuz seriler, matematikçilerin π’nin hesaplamasını Arşimet ve geometrik teknikler kullanan diğerlerinden çok daha yüksek hassasiyetle yapmalarına olanak sağladı. π’yi hesaplamak için kullanılabilecek sonsuz bir dizinin ilk yazılı açıklaması Hintli gök bilimci Nilakantha Somayaji tarafından MS 1500 civarında Tantrasamgraha’da Sanskritçe dizesinde ortaya konmuştur. Bu açıklama seri kanıt olmadan sunulmasına rağmen kanıtlar ancak MS 1530 civarında daha sonraki bir Hint eserinde sunuldu. Nilakantha ise, bu seriyi daha önceki Hintli matematikçi Madhava’ya atfeder. Günümüzde Madhava serisi veya Gregory-Leibniz serisi olarak anılan sinüs, tanjant ve kosinüs serileri de dahil olmak üzere birkaç sonsuz dizi tanımlanmıştır.

Pi’nin Hesaplanması
Görsel Kaynak : piday
Yakın tarih ve günümüz

20. yüzyılın başlarına gelindiğinde π’nin yaklaşık 500 basamağı biliniyordu. Modern teknolojik gelişmelerle, π’nin 31 trilyon basamağı hesaplandı. Bununla birlikte, gözlemlenebilir evrenimizdeki tüm hesaplamaları neredeyse hiç hata olmadan yapabilmek için yalnızca π’nin ilk 39 basamağına ihtiyacımız vardır.

İlki 1988 yılında Larry Shaw tarafından organize edilen Pi Günü, her yıl 14 Mart’ta kutlanmaktadır.

Hepimizin Pi Günü kutlu olsun! 🙂

Pi’nin Kullanım Alanları

Pi, yayların uzunluklarını veya diğer eğrileri, elips alanlarını ve diğer eğimli yüzeyleri ve birçok katı hacmini içeren çeşitli matematik problemlerinde ortaya çıkar. Ayrıca, açısal hız, sarkaçların hareketi, sicimlerin titreşimi ve alternatif elektrik akımları gibi periyodik olayları tanımlamak için çeşitli fizik ve mühendislik formüllerinde kullanılır.

MATE577212SS3ZFP64

Simpleks Yöntem

Simpleks yöntem çok değişkenli karar değişkenleri ve kısıtlayıcılardan oluşan doğrusal programlama problemlerinde optimum çözümü bulmak için 1947 yılında George Dantizg tarafından geliştirilmiştir. Bir doğrusal programlama problemini simpleks yöntem ile çözmek için standart formda ifade etmemiz gerekir. Bu sebeple ilk önce standart biçimden bahsedelim.

Standart Biçim

Zenk/enb = c1 . x1 + c2 . x2 + … + cn . xn

a11 . x1 + a12 . x2 + a13 . x3 + … + a1n . xn = b1

a21 . x1 + a22 . x2 + a23 . x3 + … + a2n . xn = b2

a31 . x1 + a32 . x2 + a33 . x3 + … + a3n . xn = b3

…..

am1 . x1 + am2 . x2 + am3 . x3 + … + amn . xn = bn

x1, x2, x3, … xn ≥ 0

olarak ifade edilen doğrusal programlama modeli aşağıdaki koşulları sağlarsa standart biçimdedir.

  • Amaç fonksiyonu en büyükleme ya da en küçükleme olabilir.
  • Kısıtlayıcı fonksiyonların sağ taraf sabitleri negatif olmamalıdır.
  • Tüm kısıtlayıcı fonksiyonlar eşitlik halinde olmalıdır.
  • Tüm karar değişkenleri negatif olmamalıdır.

Elimizdeki doğrusal programlama modelinde bazı dönüştürmeler yapmaya ihtiyaç duyabiliriz. Bir doğrusal programlama modeli üzerinde dönüşümlere kısaca göz atalım.

  • Bir doğrusal programlama modelinin amaç fonksiyonunun anlamını değiştirmek için fonksiyonu (-1) ile çarpabiliriz. Bu durumda en büyükleme olan amaç fonksiyonu en küçükleme olacaktır.

Zenb = 2x1 + x2 + x3

Zenk = -2x1 – x2 – x3

  • Bir doğrusal programlama modelinin kısıtlarındaki eşitsizliklerin yönünü değiştirmek için kısıtı (-1) ile çarpabiliriz.

3x1 + 4x2 ≥ 6

-3x1 – 4x2 ≤ -6

  • Eşitsizlik durumundaki bir kısıtı eşitliğe çevirmemiz gerekebilir. Bu çevirme işlemi kısıtın yönüne göre değişmektedir. Eğer a1 . x1 + a2 . x2 + a3 . x3 ≥ b1 gibi bir kısıtı eşitlik haline dönüştürmek istiyorsak, eşitsizliğin sol tarafından negatif olmayan bir değişken çıkarmamız gerekir. Bu değişkene, artık değişken denir. Eğer a1 . x1 + a2 . x2 + a3 . x3 ≤ b1 gibi bir kısıtı eşitlik haline dönüştürmemiz gerekiyorsa, eşitsizliğin sol tarafına negatif olmayan bir aylak değişken eklememiz gerekir. Böylece elimizdeki bir doğrusal programlama modelini standart biçime dönüştürerek simpleks yöntem ile çözebiliriz. Son olarak kısıtlayıcı değişkenler eşitlik durumunda ise, eşitliğin sol tarafına “A” ile gösterilen bir yapay değişken eklenmelidir. Simpleks yöntemi daha iyi anlayabilmek için örnek üzerinde inceleyelim.

Örnek

Zenb = 2x1 + 3x2

6x1 + 4x2 ≤ 20

3x1 + x2 ≤ 30

x1 + x2 ≤ 40

x1, x2 ≥ 0

Simpleks yöntem ile çözünüz.

İlk adım olarak doğrusal problemi standart biçime çevirelim.

Standart Biçim

6x1 + 4x2 + x3 = 20

3x1 + 2x2 + x4 = 30

x1 + x2 + x5 = 40

x1, x2, x3, x4, x5 ≥ 0

Burada x3, x4 ve x5 aylak değişkendir. Aylak değişkenler amaç fonksiyonuna eklenirken katsayısı 0 (sıfır) olarak eklenir. Bu durumda amaç fonksiyonumuz aşağıdaki gibi olur.

Zenb = 2x1 + 3x2 + 0 x3 + 0 x4 + 0 x5

Şimdi ise bu problemi çözebilmek için tablo yapmamız gerekir. Bu tablonun üst kısmında değişkenler, sol kısmında temel değişken vektörü altında aylak ve yapay değişkenler yer almalıdır. Ancak burada artık değişkenler (varsa) yer alamazlar. Çünkü temel çözüm uygun olmaz.

AFKTDVx1x2x3x4x5ÇV
0x3      
0x4      
0x5      
Zj      
Zj – Cj      
Simpleks Başlangıç Tablosu Değerler Yazılmamış Hali

AFK = Temeldeki değişkenlerin (TDV altında) amaç fonksiyonundaki katsayıları

TDV = Temel değişken vektörü

ÇV = Çözüm vektörü

Kısıtları tabloya yerleştirirken sıralamaya dikkat etmemiz gerekir. İlk kısıtımızda x3 aylak değişkeni olduğu için, ilk sıraya x3 aylak değişkenini yazıp, x3 aylak değişkeninin bulunduğu satıra ise kısıtın katsayılarını sırasıyla yerleştirmemiz gerekir. Bu işlemi diğer kısıtlar içinde yapmamız gereklidir. Ardından temeldeki değişkenlerin amaç fonksiyonundaki katsayılarını yanlarına (AFK) yazmamız bizim için faydalı olacaktır. Çünkü Zj satırını elde etmek için bu katsayıları kullanacağız. Her bir Zj değeri o sütundaki elemanlar ile temeldeki değişkenlerin amaç fonksiyonlarındaki katsayıları çarpılıp toplanmasıyla elde edilir. Böylece

Z1 = 0.6 + 0.3 +0.1 = 0

Z2 = 0.4 + 0.1 +0.1 = 0

Z3 = 0.1 + 0.0 +0.0 = 0

Z4 = 0.0 + 0.1 +0.0 = 0

Z5 = 0.0 + 0.0 +0.1 = 0

Ç.V = 0.20 + 0.3 0+0.40 = 0 olarak elde edilir.

Sırada ise Zj – Cj satırını elde etmek var. Bu satırı elde etmek için her bir Zj değerinden karşılık gelen değişkenin amaç fonksiyonu katsayısının çıkarılması gerekir. Bu durumda

Z1 – C1 = 0 – 2 = -2   ——>C1 , x1 ‘in katsayısı

Z2 – C2 = 0 – 3 = -3  ——>C2 , x2 ‘nin katsayısı

Z3 – C3 = 0 – 0 = 0   ——>C3 , x3 ‘ün katsayısı

Z4 – C4 = 0 – 0 = 0   ——>C4 , x4 ‘ün katsayısı

Z5 – C5 = 0 – 0 = 0   ——>C5 , x5 ‘in katsayısı

Bu değerler tabloda ilgili yerlere yazılmalıdır.

Simpleks Başlangıç Çözüm Tablosu

AFKTDVx1x2x3x4x5ÇV
0x36410020
0x43101030
0x51100140
Zj000000
Zj – Cj-2-3000 

Buraya kadar yaptıklarımızla tabloyu doldurduk. Buradan sonra yapmamız gereken anahtar sütun, anahtar satır ve anahtar sayı değerlerini bulmaktır. Anahtar sütun, temele girecek olan değişkeni belirler. Anahtar satır, temelden çıkacak olan değişkeni belirler. Anahtar sayı ise temele yeni giren değişkenin tablodaki değerlerini belirlemek için kullanılır. Anahtar sütun, amaç fonksiyonuna göre iki şekilde belirlenir. Eğer amaç fonksiyonu en büyükleme ise,  Zj – Cj satırındaki mutlak değerce en büyük olan negatif sayının bulunduğu sütun anahtar sütundur.  Amaç fonksiyonu en küçükleme ise, Zj – Cj satırındaki en büyük sayının bulunduğu sütun anahtar sütun olur. Bu şekilde anahtar sütunu belirleyip hangi değişkenin temele gireceğini bulabiliriz. Bir değişken temele girerken, temeldeki hangi değişkenin çıkacağına karar vermek için anahtar satırı bulmamız gerekir. Anahtar satırı bulmak için çözüm vektörü kısmındaki değerleri karşılık gelen anahtar sütun elemanlarına bölerek oran sütununu elde etmemiz gerekir. Oran sütununda hangi değer daha küçük ise o değerin bulunduğu satır, anahtar satır olarak adlandırılır ve temelden çıkarılır. Anahtar sayı ise anahtar sütun ile anahtar satırın kesiştiği değerdir. Şimdi bizim tablomuzdaki değerlere göre anahtar sütun, anahtar satır ve anahtar sayıyı bulalım.

Anahtar Sütun

 X1X2X3X4X5
Zj – Cj-2-3000

Buradan da görüldüğü gibi mutlak değerce en büyük olan negatif sayının bulunduğu sütun x2 sütunudur. Böylece x2 sütunu anahtar sütundur ve temele girmelidir.

Anahtar Satır

 Anahtar sütun(X2)Çözüm Vektörü(ÇV)Oran
x3455/4
x413030
x514040

Böylece x3 ‘ün temelden çıkarılması gerekir. Anahtar sütun(x2) ve anahtar satır’ın(x3) kesiştiği değerin 4 olduğu görülür. Böylece anahtar sayı 4’tür. Bu değerleri elde ettikten sonra simpleks birinci çözüm tablosunu oluşturarak çözüme devam edelim. Burada x2 satırının yeni değerleri x3  satırının değerlerinin anahtar sayıya bölünmesiyle elde edilir.

Simpleks Birinci Çözüm Tablosu

AFKTDVx1x2x3x4x5ÇV
3x23/211/4005
0x43/20-1/41025
0x5-1/20-1/40135
Zj9/233/40015
Zj – Cj5/203/400

Burada tablonun son halini yazdık ama tablonun içerisindeki değerler yeniden hesaplanmalıdır. Bu değerlerin hesaplanmasına geçilmeden önce şunu belirtmemiz gerekir temeldeki değişkenler tabloda birim matris oluştururlar. Biz tablonun yeni değerlerini bulurken bu değişkenlerin oluşturacağı birim matrisi korumamız gerekir. Simpleks başlangıç çözüm tablosuna baktığımızda temeldeki x3, x4 ve x5 değişkenlerinin tabloda birim matris oluşturduğu görülür. Simpleks birinci çözüm tablosunda ise x2, x4 ve x5 birim matris oluşturmalıdır. Temeldeki değişkenlerin bulundukları satırların değerleri bulunurken bu birim matris gözedilerek bulunacaktır. x2 satırının değerlerinin nasıl bulunduğu söylemiştik. Şimdi x4 ve x5 satırlarındaki değerleri bulalım. İlk önce x4 satırının değerlerini hesaplayalım. Bunun için x4 satırının simpleks başlangıç çözümündeki yani eski değerleri ve yeni x2 ’nin değerlerini kullanacağız. Bu değerleri kullanarak ve birim matrisi koruyarak x4 ’ün yeni değerlerini bulacağız.

 x1x2x3x4x5ÇV
Eski x43101030
Yeni x23/211/4005
Yeni x43/20-1/41025

Burada birim matrisin korunması için yeni x4 ’ün x2  sütunundaki değeri 0, x4 satırındaki değeri 1  ve x5 sütunundaki değeri 0 olmalıdır. Bunun için yeni x2 satırı (-1) ile çarpılıp toplanmalıdır. Bulunan yeni x4 satırının değerleri tabloya yazılır.

Şimdi x5 satırının değerlerini bulalım. Bunun için ise simpleks başlangıç çözüm tablosundaki yani eski x5 değerlerini ve yeni x2 değerlerini kullanacağız.

 x1x2x3x4x5ÇV
Eski x51100140
Yeni x23/211/4005
Yeni x5-1/20-1/40135

Yeni x5 değerleri bulunurken birim matrisi korumak için yeni x5‘in x2 sütunundaki değeri 0, x4 sütunundaki değeri 0 ve x5 sütunundaki değeri 1 olmalıdır. Bu sebeple yeni x2 satırı (-1) ile çarpılıp toplanmalıdır. Böylece yeni x5 satırının değerleri hesaplanmış olur. Bu değerlerde tabloya eklendiğinde hesaplamamız gereken Zj ve Zj – Cj satırı kalır. Zj satırındaki değerleri temeldeki değişkenlerin amaç fonksiyonu katsayıları ile tablodaki değerlerin çarpılıp toplanmasıyla elde ediliyordu. O zaman Zj satırındaki değerler aşağıdaki gibi hesaplanır.

Z1 = 3.(3/2)  +  0.(3/2)  +  0.(-1/2) = 9/2

Z2 = 3.1  +  0.0  +  0.0 = 3

Z3 = 3.(1/4)  +  0.(-1/4)  +  0.(-1/4) = 3/4

Z4 = 3.0 +  0.1 +  0.0 = 0

Z5 = 3.0  +  0.0  +  0.1 = 0

Ç.V = 3.5 +  0. 25+  0.35 = 15

Bu değerler tabloya yazılmalıdır. Ardından her bir Zj değeri bulunduğu sütundaki değişkenin amaç fonksiyonundaki katsayısı olan Cj ’den çıkarılarak Zj – Cj  değerleri hesaplanır.

Z1 – C1 = (9/2)– 2 = 5/2   ——>C1 , x1 ‘in katsayısı

Z2 – C2 = 3 – 3 = -0  ——>C2 , x2 ‘nin katsayısı

Z3 – C3 = 3/4 – 0 = 3/4   ——>C3 , x3 ‘ün katsayısı

Z4 – C4 = 0 – 0 = 0   ——>C4 , x4 ‘ün katsayısı

Z5 – C5 = 0 – 0 = 0   ——>C5 , x5 ‘in katsayısı

Amaç fonksiyonumuz en büyükleme olduğu için Zj – Cj satırındaki tüm değerlerin sıfır veya pozitif olması gerekir. Eğer amaç fonksiyonumuz en küçükleme olsaydı Zj – Cj satırındaki tüm değerlerin negatif veya sıfır olması gerekecekti. Yukarıdada görüldüğü gibi Zj – Cj satırındaki tüm değerler sıfır veya pozitif olduğundan en iyi çözüme ulaşmış oluruz. Böylece

Zenb = 15 , x2 = 5 , x3 = 0 , x4 = 25 , x1 = 0 , x5 = 35 olarak elde edilir.

Eğer bizim problemimizde Zj – Cj

satırındaki herhangi bir değer negatif olsaydı çözüm en iyi olmayacaktı. Bu durumda ise tekrar anahtar sütun, anahtar satır ve anahtar sayi değerlerini bulacaktık. Ardından tabloyu tekrar oluşturup buradaki gibi değerleri yeniden hesaplayıp çözümün en iyi olup olmadığını kontrol etmemiz gerekirdi. Çözüm en iyi olana kadar bu işlemleri yapmaya devam edecektik.

MATE7427Q2K8SX9066