lindo kullanım kılavuzu

30
!"# $# %$ &’$$ ( !" #$% # " &’(’)* + , -./0 &12 34 5673873 "938 9: ;,99 <&’=’1 > # ;’’1 ) ) # *+ # #, $# # " ## ’ " - ’+ - # ) " . # " ’ ## ’ )/ # " 00 # &’+ ## , 00 " $$ # ) ’ # ’ # # # 1 - &$$ - &$$ - - &$$ 2# -34 ) 566 56 56 (76 " # ) 766 76 76 876 ) 8666 866 866 (666 ) 9666 966 966 :666 *# ) 58666 5866 5866 (;666 <# ) &$#$ ) $$ " # # " $ # ’$$ "# & " $#$ ) $$ # + # ) # +# + 000+ " $+# ) - $$$$ $$$ & #= ) # " " , ’ " ’$ # + + # 51’ ) " # + , " $ ’$#$ & , + , $ " $ 7 # $ $$ " # # $$ # $$ ’$$ " ’$ #$# # $$ , + $$ ) # " & $ 00 # ## $

Upload: darkennimbus

Post on 01-Jul-2015

1.526 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

1

L I N G O 6 . 0 K U L L A N I M K I L A V U Z U

(Ekim.2003)

Hazırlayanlar: Yrd. Doç. Dr. Aydın SİPAHİOĞLU, Araş. Gör. Tuğba SARAÇ

Osmangazi Üniversitesi Endüstri Müh. Bölümü -ESKİŞEHİR

1. LINGO HAKKINDA GENEL BİLGİLER

Lingo, Lindo Systems Inc. şirketi tarafından üretilmiş, doğrusal, tamsayılı ve doğrusal olmayan matematiksel modelleri çözebilen, duyarlılık analizi yapan bir eniyileme yazılımı ve modelleme dilidir. Daha önce Dos ortamında kullanılan Lindo ve Gino yazılımlarının bir araya getirilmesi ve yeni özellikler eklenmesiyle oluşturulmuştur. En önemli iki yenilik,Lingo’nun bir modelleme dili olarak tasarlanması ve windows ortamında çalışmasıdır. Böylece matematiksel modellerin kapalı formda yazılması sağlanmış, diğer windows programlarıyla kolay bilgi alış verişi mümkün hale gelmiştir. Lingo, çözebildiği karar modeli boyutlarına göre aşağıdaki tabloda belirtilen isimlerle anılmaktadır.

İsimToplam Değişken Sayısı

En BüyükTamsayı

Değişken Sayısı

En Büyük Doğrusal Olmayan Değişken

Sayısı

En Büyük Kısıt Sayısı

Demo/Web Lingo 300 30 30 150Solver Suite Lingo 500 50 50 250Super Lingo 2.000 200 200 1.000Hyper Lingo 8.000 800 800 4.000Industrial Lingo 32.000 3.200 3.200 16.000Extended Lingo sınırsız sınırsız sınırsız sınırsız

Bütün Lingo sürümlerinde bu kılavuzda anlatılan komutlar ve menüler kullanılmakta, modelin çözümüne dair raporlar aynı yapıda verilmektedir. Bu nedenle kılavuz, bütün Lingo sürümleri için geçerli bilgiler içermektedir. Ancak yazılımın kullanımıyla ilgili daha detaylı bilgiler edinmek için Lingo kullanım el kitabına bakmak yerinde olacaktır. Ayrıca www.lindo.com adresinden yazılımlarla ilgili olarak bilgi edinmek ve ücretsiz olarak Lingo Demo sürümünü indirmek mümkündür.

Bu metin; Lingo kullanarak doğrusal, tamsayılı ve doğrusal olmayan karar modellerini kapalı veya açık formda yazmak, modelleri çözmek, duyarlılık analizi yapmak ve çözüm raporu sonuçlarını doğru yorumlamak isteyen kişilere yardımcı olmak amacıyla hazırlanmıştır.

2. LINGO MENÜLERİ

Lingo yazılımının kurulmasından ve çalıştırılmasından sonra kullanıcıya ilk olarak boş bir sayfa ve ana menü görüntülenir. Boş sayfa modelin girileceği yazım sayfasıdır. Ana menü ise File, Edit, Lingo, Window ve Help olmak üzere 5 alt menüden oluşur. File menüsü girdi ve çıktılarla ilgili komutları, Edit menüsü yazımla ilgili komutları, Lingo menüsü modelin çözümü ve çözüm sonuçlarının türetilmesiyle ilgili komutları içerir. Window menüsü, farklı pencerelere geçişi sağlar. Help menüsü ile Lingo ile ilgili yardım hizmetinin verildiği yerdir. Bu menüler esasen pek çok windows programında artık neredeyse standartlaşmış menülerle

Page 2: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

2

aynıdır. Sadece Lingo menüsü bu yazılıma ait özel komutları içerir. Dolayısıyla özellikle anlaşılması gereken menü budur. Öte yandan menülerdeki pek çok komut, kısa yol ikonu olarak programın arayüzünde mevcuttur. Aşağıda bu menüler kısaca tanıtılmaktadır:

File Menüsü:New Yeni model için bir pencere açar.Open Kayıtlı bir modeli açar.Save Seçili pencerenin içeriğini kaydeder. (Model veya çözüm raporu)Save As Seçili pencerenin içeriğini farklı bir isimle kaydeder.Close Seçili pencereyi kapatır.Print Seçili pencerenin içeriğini yazdırır.Print Setup Yazıcı ayarları yapılır.Print Preview Seçili pencerenin içeriği yazdırılırsa nasıl görüleceği izlenir.Log Output Çıktıları komut penceresine göndermek üzere bir log dosyası açar.Take Commands Bir dosyadaki komut dizisini çalıştırır veya daha önce bir başka editörle

text olarak (ascii biçiminde) Lindo formatında yazılmış olan bir modeli okur.

Import LINDO File Bir Lindo text dosyasını Lingo dosyasına dönüştürür.MPS File Diğer programlarla Lingo arasında MPS formatlı dosyaların transferi

sağlanır. (Bu format IBM tarafından geliştirilmiş ve dünyada standart olarak kabul edilmiş bir biçimdir).

License Sistemin yükseltilmesi için gerekli yeni lisans şifresine erişimi sağlar.Exit Lingo programını kapatır.

Edit Menüsü:Undo Son değişikliği geri alır.Cut Belge içinde seçili kısmı keser.Copy Seçili kısmı panoya kopyalar.Paste Panoya kopyalanmış olan içeriği belgeye yapıştırır.Paste Special Panoya kopyalanmış olan içeriği nasıl yapıştırılacağına dair seçim

yapmaya olanak tanıyarak belgeye yapıştırır.Select All Aktif pencerenin tüm içeriğini seçer.Find Belge içinde belli bir karakter dizisini arar.Find Next Belirlenmiş karakter dizisi için find işlemini tekrar eder.Replace Belirlenmiş karakter dizisini yenisiyle değiştirir.Go To Line İmlecin istenilen satıra hareketini sağlar.Match Parenthesis Seçilen bir parantezin karşılığını bulur.Paste Function Seçilen Lingo fonksiyonunun şablonunu yapıştırır. Select Font Belgenin seçilen kısmının yazı tipini seçmeye olanak tanır.Insert New Object OLE nesnesini belgenin içine yerleştirir.Links Belgedeki dış kaynaklı nesnelerin bağlantılarını kontrol eder.Object Properties Belgeye yerleştirilmiş nesnenin özelliklerini görme olanağı tanır.

Lingo Menüsü:Solve Aktif penceredeki modeli çözer. Çözüm sırasında; model öncelikle

yazım hatalarına karşı denetlenir. Eğer bir yazım hatası bulunursa, hatanın hangi satırda olduğunu ve satırda da olması muhtemel noktayı gösteren bir uyarı kutusu ekrana gelir. Hatası olmayan/düzeltilmiş model için çözüm hakkında genel bilgilerin yer aldığı solver status

Page 3: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

3

penceresi türetilir. Modelin çözümü sonuçlandıktan sonra, çözüm raporunun yer aldığı yeni bir pencere daha oluşturulur.

Solution Aktif model için çözüm raporu penceresini türetir. Çözüm raporunu text ya da grafik formatında, tüm bilgileri içerecek şekilde ya da yalnızca ilgilenilen bilgilerin yer alacağı şekilde oluşturmak mümkündür.

Range Aktif pencere için duyarlılık analizi sonuçlarını üretir. Ancak bunun için öncelikle Options seçeneğindeki General Solver sekmesinde ve Dual Computation seçeneğinde Prices & Ranges alternatifinin seçilmiş olması gerekir.

Options Modelin çözümünü etkileyecek parametrelerin seçimine olanak sağlar. Oldukça önemli seçimlerin söz konusu olduğu bu menü, “Modelin Çözümü” kısmında detaylı olarak incelenmiştir.

Generate Kapalı formda yazılmış bir modelin derlenerek açık formda görüntülenmesini sağlar. Problemin değişken sayısı, kısıt sayısı gibi özet bilgilerini görüntüler.

Picture Modelin katsayılar matrisini görüntüler.Model Statistics Modelin teknik detaylarıyla ilgili olarak (kısıt ve değişken sayısı vb.)

özet rapor sunar.Look Aktif modeli gösteren bir rapor oluşturur.Export to Database Seçilen değişkeninin değerini ODBC kullanarak bir veri tabanına

aktarır.Export to Spreadshee Seçilen değişkenin değerini Excel sayfasına aktarır.

Window Menüsü:Command Window Lingo komut satırını açar. (Lingo komutları Dos ortamında çalışan

Lindo komutlarıyla aynıdır. Lindo komutlarına alışkın birisi için bu yapıya geçerek çalışmak daha kolay olabilir. Bu ortamdaki komutları görebilmek için COM, yardım alabilmek için HELP Komut_adı yazılmalıdır. Ayrıntılar “Lingo’da Komut Kullanımı” bölümünde belirtilmiştir).

Status Window Solver status penceresini açar.Send to Back Aktif pencereyi tüm açık pencerelerin arkasına gönderir.Close All Tüm açık pencereleri kapatır.Tile Belirlenen yapıyı tüm açık pencerelere uygular.Cascade Aktif pencere üstte kalacak şekilde tüm açık pencereleri düzenler.Arrange Icons Açık pencerelerin ikonlarını düzenler.

Help Menüsü:Help Topics Lingo'nun yardım hizmetlerine erişimi sağlar.About Lingo Kullanılan Lingo programının tipini ve versiyonunu görüntüler. İletişim

için gerekli bilgiler mevcuttur.

3. KARAR MODELİNİN LINGO'YA TANITILMASI

Bir karar modelinin Lingo’ya tanıtılabilmesi için üç yol vardır. Birincisi Filemenüsündeki Take komutuyla daha önceden Lindo formatında text olarak yazılmış olan bir modeli okutmak; ikincisi daha önce Lindo’da yazılıp kaydedilmiş bir modeli Filemenüsündeki Import Lindo File komutu ile okutmaktır. Bu iki yöntem daha önce Lindo

Page 4: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

4

yazılımını kullanmış yani Lindo formatını bilen kişiler için yararlıdır ve model okunarak Lingo formatında görüntülenir. Ancak Lindo formatının sadece doğrusal karar modelleri için geçerli olduğu unutulmamalıdır. Öte yandan Take komutu, Lingo’da peş peşe yapılması istenen bir grup işi, komutlar halinde bir dosyaya yazarak bu dosyayı okutup, işleri sırayla yaptırmak için de kullanılabilir. Örneğin bir modelin bazı parametrelerini değiştirerek farklı çözümler bulunsun ve bunlar farklı dosyalara yazılsın isteniyorsa, bu işlerin yapılması için gerekli komutları bir text dosyaya yazarak Lingo’ya okutmak ve işleri sırayla yaptırmak mümkündür. (Bunun için Take komutuna ait Help bilgisini okumak açıklayıcı olacaktır).

Lingo’da model tanıtmanın üçüncü ise yolu File menüsündeki New komutuyla yeni bir model girişi yapmaktır. Yeni model girişi seçildiğinde ekrana boş bir pencere açılır. Bu pencere, modelin açık veya kapalı formlarda yazılabileceği yerdir. Matematiksel model değişken ve kısıt sayısı açısından küçük boyutluysa açık formda yazmak, büyük boyutluysa kapalı formda yazmak tercih edilmelidir. Ancak modeli açık veya kapalı formda girmenin farklı kuralları vardır ve ayrı ayrı incelenmesi gerekir.

3.1 Modelin Açık Formda Yazımı

Herhangi bir matematiksel modelin Lingo formatında açık olarak yazımı basit olarak aşağıdaki şekildedir:

MODEL:MIN( veya MAX) = amaç fonksiyonu;

Kısıt 1 ;Kısıt 2 ; . .Kısıt n ;

ENDModelin açık yazımı sırasında uyulması gereken yazım kuralları aşağıda verilmiştir:

• Genel bir anlayış olarak modelin amaç fonksiyonu ilk satırda, kısıtlar da diğer satırlarda yazılmaktadır. Ama Lingo’da bu bir zorunluluk değildir. Lingo’daki en önemli koşul, bütün matematiksel ifadelerin birbirleriyle “;” işareti kullanılarak ayrılmış olmasıdır. Sonuçta Lingo “;” ile ayrılmış ifadeleri algılar. Max ve min ile başlayan satırın amaç fonksiyonu satırı olduğunu diğerlerinin de kısıtlar olduğunu kabul eder. Anlaşılırlığı sağlamak için her kısıtın yeni bir satırdan başlaması önerilir, kısıt sırasının önemi yoktur.

• Değişken isimleri bir harf (A-Z) ile başlamalı ve en çok 32 karakter uzunluğunda olmalıdır. Büyük ya da küçük harf kullanımları arasında fark yoktur. “TALEP” ve “talep” aynı değişken olarak kabul edilir.

• Değişken ve parametreler arasında mutlaka çarpı “*” işaretinin olması gerekir. Örnek:2x1+3x2<=10; yazımı yanlıştır .Doğrusu 2*x1+3*x2<=10; biçimindedir.

• Lingo’da ≤ / ≥ ; işareti <= / >= olarak yazılabileceği gibi < / > olarak da kullanılabilir.

• Kısıtlar yazılırken değişkenler, ifadenin (eşitliğin ya da eşitsizliğin) sol tarafında, sabit değerlerin ise ifadenin sağ tarafında olması gerekli değildir. x1=x2 yazımı ile x1-x2=0yazımı arasında fark yoktur.

Page 5: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

5

• Doğrusal karar modelleri için, değişkenlerinin negatif olamayacaklarına dair ayrıca bir kısıtyazılmasına gerek yoktur. Lingo doğrusal karar modelinden ayrıca bir koşul verilmediği taktirde modeldeki bütün değişkenleri sıfırdan büyük veya eşit reel değişken olarak kabul eder. Ama doğrusal olmayan modellerde değişkenlerin negatif olmama koşulu varsa, bunun mutlaka ayrı bir kısıt olarak modele eklenmesi gerekir. Tamsayılı modellerde de hangi değişkenlerin genel tamsayı, hangilerinin 0-1 tamsayı değişken olduğunun mutlaka belirtilmesi gerekir. Eğer negatif değer alması mümkün olan değişkenler varsa, bunların da modelde ayrıca belirtilmesi gerekir. Değişkenlerin alttan ve üstten sınırlı olması halinde de modeldeki kısıt sayısını azaltmak için değişkenin sınır değerlerinin tanımlanması mümkündür. Bu tür tanımlamaları yapabilmek için Lingo’da kullanılabilecek fonksiyonlar aşağıda verilmiştir:

@GIN(değişken-adı) genel tamsayı değişken@BIN(değişken-adı) 0-1 tamsayı değişken@FREE(değişken-adı) her türlü reel değer alabilen değişken@BND(alt sınır,değişken-adı,üst sınır) alt veya üst sınır değeri olan değişken

• Amaç fonksiyonu ya da kısıtlardan biri tek satıra sığmıyorsa, izleyen satıra geçilirken herhangi bir işaret koymadan devam edilmelidir. Lingo, noktalı virgüle kadar olan tüm satırları bir bütün olarak algılar.

• Model yazımında anlaşılırlığı sağlamak için satır başına ünlem işareti konarak çeşitli açıklamalar yazılabilir. Lingo “!” işareti ile başlayan satırları dikkate almaz. Fakat açıklama satırı noktalı virgül ile sonlandırılmalıdır.

• Kısıtlara isim vermek mümkündür.Bunun için bir harf ile başlayan toplam 32 karakter uzunluğunda ve Lingo komutu olmayan bir ifadeyi kısıtın başına köşeli parantez içinde yazmak yeterlidir. Örnek: [Kapasite] 2*x1+x2<=10;

• Lingo’da kullanıcıya kolaylık sağlamak amacıyla standart fonksiyonlar tanımlanmıştır. Bu fonksiyonlardan bazıları aşağıda sıralanmıştır.

@ABS(X) X’in mutlak değerini verir.@COS(X) radyan olarak verilmiş olan X açısının kosinüsünü verir.@EXP(X) e (2.718281...) sayısının X.kuvvetini verir.@LOG(X) log(X) değerini verir.@SIGN(X) eğer X sıfırdan küçükse –1 büyükse 1 değerini verir.@SIN(X) radyan olarak verilmiş olan X açısının sinüsünü verir.@TAN(X) radyan olarak verilmiş olan X açısının tanjantını verir.@SMAX(X1, X2,..., XN) X1, X2, ..., XN sayılarından en büyüğünü verir.@SMIN(X1, X2,..., XN) X1, X2, ..., XN sayılarından en küçüğünü verir.

Lingo’da kullanılabilecek olasılık fonksiyonlarından bazıları aşağıda sıralanmıştır.

@PSN(X) X değerinin birikimli standart normal dağılımda olasılık değerini verir.@PPS(A,X) Ortalaması A olan Poisson dağılım fonksiyonuna ait birikimli olasılık

değerini verir.@PBN(P,N,X) N deney sayısı, P bozuk çıkma olasılığı iken X’in Binom dağılım

fonksiyonuna ait birikimli olasılık değerini verir. @PFS(A,X,C) M/M/C kuyruk sisteminde sistemde beklenen ortalama müşteri sayısını

verir.@RAND(SEED) 0 ve 1 arasında rassal sayı üretir.

Page 6: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

6

Bu açıklamalar ışığında 4 değişkenli ve 3 kısıtlı örnek bir doğrusal karar modelinin gerçek yazımı ile açık Lingo formatındaki yazımı aşağıda verilmiştir:

Gerçek Model:2x1 + 2x2 + x3 + x4 ≤ 1006x1 + 2x2 + 3x3 + 2x4 ≥ 40x1 + x2 + x3 + x4 = 80x1, x2, x3 ≥ 0kısıtları altında,Enb z = 2x1 + 3x2 + 4x3 + x4

Lingo Formatı:MAX=2*x1+3*x2+4*x3+x4;2*x1+2*x2+x3+x4<=100;6*x1+2*x2+3*x3+2*x4>=40;x1+x2+x3+x4=80;END

Aynı örnekte x1 değişkeni tamsayı, x2 değişkeni 0 veya 1 tamsayı ve x3 değişkeni herhangi bir reel değeri alabiliyor olsun. Ayrıca modele 5≤x4≤20 kısıtı eklenmek isteniyor olsun. Bu durumda aynı modelin şöyle yazılması gerekir:

MAX=2*x1+3*x2+4*x3+x4;2*x1+2*x2+x3+x4<=100;6*x1+2*x2+3*x3+2*x4>=40;x1+x2+x3+x4=80;@GIN (X1);@BIN(X2);@FREE(X3);@BND(5,X4,20);END

3.2 Modelin Kapalı Formda Yazımı

Bir modeli açık halde yazarak çözüm bulmak oldukça kolaydır. Ancak modeldeki kısıt sayısı elle yazılamayacak kadar çoksa modeli kapalı formda yazmak büyük avantaj sağlar. Çünkü büyük boyutlu problemlerde çok sayıda kısıtın yazımı sıkıcı bir iştir ve üstelik hata yapma riski vardır. Sonrasında modelde değişiklik yapmak da zor olur. Lingo aynı zamanda bir modelleme dili olduğu için, modelin kapalı formda ifade edilmesine olanak tanır. Ancak bunun için bir dizi özel yapının öğrenilmesi gerekmektedir. Öncelikle belirtilmesi gereken şey kapalı formda yazımın 3 ana grupta olması gerektiğidir. İlk grup modelde kullanılacak indislerin, değişkenlerin ve parametrelerin tanımlandığı kümedir (SETS). İkinci grup modelin amaç fonksiyonunun ve kısıtların yazıldığı, değişkenlerin serbest, tamsayı vb. biçimlerde tanımlamalarının yapıldığı gruptur. Üçüncü grup ise modelde kullanılacak sayısal değerlerin verildiği veri (DATA) grubudur. Aşağıda basit bir örnek üzerinde bir karar modelinin kapalı formda nasıl yazabileceği açıklanmaktadır.

Örnek Problem (Sırt Çantası [Yükleme] Problemi=Knapsack Problem):Bir pazarlamacı, kapı kapı dolaşarak ürünlerini pazarlamaktadır. Yanına almak üzere

seçebileceği 8 çeşit ürün (A, B, C, D, E, F, G, H) vardır. Pazarlamacı en fazla 25 kg. ürün taşıyabilmektedir ve ürünlerin birim ağırlıkları ile satılmaları halinde getirecekleri kazanç aşağıdaki tabloda verilmiştir. Pazarlamacı en yüksek geliri elde etmek için yanına hangi üründen kaç tane alması gerektiğini belirlemek istemektedir. Satıcıya yardımcı olacak modeli kurunuz.

Page 7: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

7

Ürün (j) A B C D E F G HAğırlık (aj) 1 3 4 3 3 1 5 10Kazanç (cj) 2 9 3 8 10 6 4 10

Probleme ait karar modelixj: j. Üründen alınacak miktar (adet),aj: j. Ürünün birim ağırlığı (kg) vecj: j. Ürünün birim kazancı (PB), olmak üzere;yandaki gibi yazılabilir.

Modelin Lingo kapalı formdaki yazımı ise şöyledir:

Bu yazımın ilk kısmı SETS bölümünde, örnek problemde URUN adıyla bir küme tanımlandığı ve bu küme elemanlarının A, B, C, D, E, F, G, H olduğu açıklanmaktadır. Daha sonra modelde a, c ve x olmak üzere 3 tane parametre ve değişken kullanılacağı ve bunların URUN olarak tanımlanan kümesindeki elemanları indis olarak kullanacağı belirtilmektedir.

İkinci kısımda max= ifadesi ile amaç fonksiyonu, sonra problemdeki kısıt ve değişkenlerin tamsayı olacağına dair koşul

kapalı formda yazılmıştır. Burada max=@SUM(URUN:c*x) ifadesi ile, urun kümesinde tanımlı c ve x’in kümedeki bütün indisler için karşılıklı çarpımlarının toplamının en büyükleneceği anlatılmaktadır.

Üçüncü kısımdaki DATA bölümü ise modeldeki parametreleri ve alacakları değerleri göstermektedir. Örnek problemde a ve c için değerler tanımlandığından Lingo, bunların parametre olduğunu anlayacaktır. Parametrelerin değerleri de URUN kümesinde tanımlanan indislerin sırasıyla verilir. Örneğin bu problemde cA=2, aH=10’dur.

Kapalı formda yazılan bir modelin istendiği gibi oluşup oluşmadığını incelemek için modeli derlemek ve sonuca bakmak mümkündür. Bunun için Lingo menüsündeki Generate/Display Model seçeneği seçilebilir ya da Ctrl+G kısayol tuşu kullanılabilir. Görüntülenecek sonuç modelin açık formda yazımı şekline çok benzer. Örnek problemin derlenmesiyle elde edilen sonuç şöyledir:

MAX 2 X(A)+9 X(B)+3 X(C)+8 X(D)+10 X(E)+6 X(F)+4 X(G)+10 X(H)SUBJECT TO2]X(A)+3 X(B)+4 X(C)+3 X(D)+3 X(E)+X(F)+5 X(G)+10 X(H) <= 15ENDGIN 8

Bu görünüm 3.1’de anlatılan modelin açık formdaki yazımından biraz farklıdır ve Lindo yazılımının kullandığı biçimdir. Ancak modelin açık olarak yazıldığında nasıl görüneceğini gösterdiği için faydalıdır. Yazımdaki 2] işareti modeldeki 2. satırda olunduğunu gösterir. 1. satır amaç fonksiyonu olduğu için 2. satır aslında modelin 1. kısıtı demektir. GIN 8 ifadesi ise modelde 8 tane değişken olduğunu ve hepsinin genel tamsayı olarak tanımlandığını belirtir. Bu nedenle bütün değişkenlerin genel tamsayı oldukları tek tek belirtilmemiştir.

∑=

≤8

125.

jjj xa

xj ≥ 0 ve tamsayı,kısıtları altında,

∑=

=8

1.z

jjj xcenb

SETS: URUN /A,B,C,D,E,F,G,H/: a, c, x;ENDSETS

MAX=@SUM(URUN: c*x);@SUM(URUN: a*x)<=25;@FOR(URUN:@GIN(x));

DATA: a=1,3,4,3,3,1,5,10; c=2,9,3,8,10,6,4,10;ENDDATA

END

Page 8: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

8

Aynı modeli a için ağırlık, c için kazanç ve x için miktar tanımlamalarını yaparak yazmak da mümkündür. Ayrıca küme tanımında da mutlaka bütün elemanların tek tek belirtilmesi gerekmez. Örneğin bu problemde 8 ürün olduğu için ürünler 1’den 8’ kadar sayılarla ifade edilebilir. Bu durumda örnek problem şöyle olacaktır:

SETS: URUN/1..8/: AGIRLIK,KAZANC,MIKTAR;ENDSETS MAX=@SUM(URUN:KAZANC*MIKTAR); @SUM(URUN:AGIRLIK*MIKTAR)<=15; @FOR(URUN:@GIN(MIKTAR));DATA: AGIRLIK=1,3,4,3,3,1,5,10; KAZANC=2,9,3,8,10,6,4,10;ENDDATAEND

Bu modelin derlenmesiyle elde edilen görüntü ise aşağıdaki gibidir:MAX 2 MIKTAR(1)+9 MIKTAR(2)+3 MIKTAR(3)+8 MIKTAR(4)+10 MIKTAR(5)+6 MIKTAR(6)+4 MIKTAR(7)+10 MIKTAR(8)SUBJECT TO2] MIKTAR(1)+3 MIKTAR(2B)+4 MIKTAR(3C)+3 MIKTAR(4D)+3 MIKTAR(5)+MIKTAR(6)+5 MIKTAR(7)+10 MIKTAR(8) <= 15ENDGIN 8

Kapalı formda yazım için dikkat edilmesi gereken koşullar ve özel durumlar izleyen bölümlerde açıklanmıştır. Ayrıca “Lingo Kapalı Formatı İçin Örnekler” bölümünde örnek 4 problem için kapalı form yazımları verilmiştir.

Modelin Sets Bölümü:

Herhangi bir problemin karar modelini oluşturmaya çalışırken sıklıkla aynı tip kısıtı sağlaması gereken yapılarla karşılaşılır. Sözgelimi kapasite kısıtını sağlaması gereken fabrikalar, talepleri karşılanması gereken müşteriler vb. Lingo bu tür birbiriyle ilişkili yapıların küme olarak tanımlanmasına olanak tanır. Kümelerin, Lingo modelinde kullanılmadan önce sets bölümünde tanımlanmaları gerekir. Bu kısımda problemde kullanılacak indislerle, bu indisleri kullanacak değişkenler ve parametreler tanımlanır. Setsbölümü SETS: anahtar kelimesiyle başlar ve ENDSETS ile son bulur. Bir kez küme tanımlandıktan sonra, yazılacak tek bir koşulun @FOR gibi döngü fonksiyonları yardımıyla tüm küme elemanları tarafından sağlanması mümkündür.

Bir modelde sets bölümü olmayabilir, bir tane olabilir ya da birden fazla olabilir. Kök ve türemiş olmak üzere iki tip küme vardır.

Kök küme: Sets bölümünde bir kök kümeyi tanımlayabilmek için aşağıdaki yapı kullanılmalıdır.

kümeadı / üye_listesi / : değişken, parametre_listesi

kümeadı, 31 haneyi aşmayacak şekilde harf ya da alt çizgi (_) karakterlerinden oluşabilir. Küçük ya da büyük harf kullanımları arasında bir fark yoktur. (Örnek problemde URUN kümesi bir kök kümedir).

Page 9: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

9

üye-listesi, kümede yer alan elemanların listesidir. Eğer üyeler küme tanımı içinde yer almazlarsa, data bölümündeki sıraya göre tanımlanmaları da mümkündür. Aşağıdaki örnekte küme elemanları özel olarak adlandırılmışlardır;

DEPOLAR/DEPO1,DEPO2,DEPO3,DEPO4/:TALEP;İzleyen örnekte ise küme elemanları data bölümünde verilerin verildiği sıra numarası ile tanımlanmışlardır.

DEPOLAR/1..4/:TALEP;Kümeye ait parametre ve değişkenler virgül ile ayrılarak yazılmalıdır.

Türemiş küme: Sets bölümünde bir türemiş kümeyi tanımlayabilmek için aşağıdaki yapı kullanılmalıdır.

kümeadı (kök küme listesi) / üye-listesi / : değişken, parametre-listesi

kök küme listesi daha önce kök küme olarak tanımlanmış kümelerin listesidir. Kümeler virgül kullanılarak birbirlerinden ayrılmalıdırlar. Eğer türemiş kümenin elemanları tariflenmezse, Lingo kök kümelerin elemanları ile oluşacak bütün olabilir kombinasyonları küme elemanı olarak kabul eder. İzleyen örneği inceleyecek olursak;

URUN/A B/;MAKINE/M N/;HAFTA/1..2/;ATAMA(URUN,MAKINE,HAFTA);Burada URUN,MAKINE ve HAFTA kümeleri kök kümelerdir. ATAMA kümesi ise

diğer kümelerden yaralanılarak türetildiği için türemiş bir kümedir. üye_listesi olmadığı için kümenin elemanları, üç kök kümenin elemanlarının tüm kombinasyonlarından oluşacaktır. Yani Atama kümesinin elemanları şunlar olacaktır: (A,M,1), (A,M,2), (A,N,1), (A,N,2), (B,M,1), (B,M,2), (B,N,1), (B,N,2). Dikkat edilirse türemiş kümenin eleman sayısı, kendisini oluşturan kök kümelerin eleman sayılarının çarpımı kadardır. Verilen örnekte Atama kümesinin 2*2*2=8 elemanı vardır ve daha önce tanımlanmış olan kök kümelerin elemanlarının tüm kombinasyonlarını içerir. Ama türemiş kümede olası bütün kombinasyonların yer almasını istemiyorsak izleyebileceğimiz iki yöntem vardır:

1. Küme hangi elemanlardan oluşacaksa üye_listesine tek tek yazmak2. Küme elemanlarını süzmek

Örneğin kümemizin (A,M,1), (A,N,2) ve (B,N,1) olmak üzere üç elemandan oluşmasını istiyorsak bunu ilk yöntemi kullanarak, izleyen şekilde ifade edebiliriz;

ATAMA(URUN,MAKINE,HAFTA)/A M 1, A N 2, B N 1 /;Eğer çok elemanı olan kümelerle çalışıyorsak bu yöntem yararlı olabilir. Ama büyük

kümelerle çalışılıyorsa bazı kriterlere göre süzdürme işlemi yaparak alt kümeler oluşturmak küme elemanlarını tek tek yazmaktan çok daha kullanışlıdır. Satıcı örneğine geri dönecek olursak, “|” koşul işaretini kullanarak URUN kümesinden KAZANC’ı 7’den büyük olanlar süzülerek KAZANCLIURUN kümesi oluşturulabilir.

KAZANCLIURUN(URUN) | KAZANC(&1) #GT# 7;Bu ifade ile URUN isimli kök kümede yer alan ve birim kazancı 7’den daha büyük olan ürünlerin, KAZANCLIURUN kümesinde tanımlanması sağlanmaktadır. Burada &1 sembolü süzdürme işleminin hangi kök kümeden yapılacağını gösterir. Kök kümeler Lingo tarafından tanımlanma sırasına göre numaralandırılmışlardır. Bizim örneğimizde tek bir kök küme

Page 10: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

10

olduğundan bu örnek için, &2 sembolünü kullanmak mümkün olamaz. #GT# büyüktür anlamına gelen mantık operatörüdür. Kullanılabilecek diğer mantık operatörleri ve anlamları aşağıda listelenmiştir.

#EQ# eşit#NE# eşit değil#GE# büyük eşit#GT# büyük#LT# küçük#LE# küçük eşit

Data Bölümü:

Parametre değerlerinin girildiği bölümdür. DATA: anahtar kelimesi ile başlar ENDDATA ile son bulur. Yazım sırasında kullanılması gereken yapı aşağıda verilmiştir.

Parametrenin_adı = değer_listesi;

• Eğer bir kümeye ait birden fazla parametre varsa değerleri iki farklı şekilde girmek mümkündür.

SETS: KUME1/1..3/:X,Y;ENDSETSDATA: X=1 2 3; Y=4 5 6;ENDDATA

• X ve Y parametrelerinin değerleri ilk örnekteki gibi ayrı ya da izleyen örnekte olduğu gibi birlikte girilebilir.

SETS: KUME1/1..3/:X,Y;ENDSETSDATA: X Y = 1 4 2 5 3 6;ENDDATA

• Bazı durumlarda modeldeki parametrelerin hangi değeri alması gerektiği kesin olarak belirlenemeyebilir. Örneğin enflasyon oranı parametresine sahip bir model üzerinde çalıştığımızı düşünelim. Gelecekte enflasyon oranının nasıl gerçekleşeceği kestirilemiyorsa data bölümünde bu değerin karşılığı olarak “?” yazılır.

DATA: ENFLASYON_ORANI=?;ENDDATA

Bu durumda model çalıştırıldığında enflasyon oranı için bir değer girilmesini isteyecektir. Böylelikle model farklı enflasyon değerleri için kolaylıkla çözülebilecektir.

• Eğer kümeye ait parametrelerden birisi kümenin tüm elemanları için aynı değeri alıyorsa bu değeri izleyen örnekte olduğu gibi tek bir kez girmek yeterlidir.

SETS: GUNLER/ PT SA CA PE CU CT PA/: TALEP;ENDSETSDATA:

Page 11: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

11

TALEP=20;ENDDATA

• Aynı kümeye ait birden fazla sabit değerli parametre söz konusu olduğunda aşağıdaki gibi bir yapı kullanmak mümkündür.

SETS: GUNLER/ PT SA CA PE CU CT PA/: TALEP,MALIYET;ENDSETSDATA: TALEP,MALİYET=20,100;ENDDATA

• Eğer bazı parametrelerin her değeri alması mümkünse bu tip parametrelerin değerlerini serbest bırakmak mümkündür. Bir üretim işletmesini ele alalım. İlk iki yıl için sabit bir kapasiteye sahip olsun ancak izleyen üç yıl için kapasiteyi gereksinim oranında ayarlamak mümkün olsun. Bu durumda belli bir değeri olmayan parametreler için boşluk girilir. Boşluklar virgül ile ayrılmalıdır.

SETS: YILLAR/1..5/: KAPASITE;ENDSETSDATA: KAPASITE=3400,3400, , , ;ENDDATA

Init Bölümü:

İsteğe bağlı olarak modele eklenebilecek bir bölümdür. Ancak sadece doğrusal olmayan karar modelleri için kullanılabilir. Burada amaç, başlangıç değer verilen değişken için aramanın bu değerden itibaren başlatılmasını sağlamaktır. Bu durum özellikle doğrusal olmayan programlama modellerinde yerel en iyi noktalardan kurtulmak için uygulanır. Fakat hangi değerin başlangıç değer olarak verileceğini elbette çözümü arayan kişi belirleyecektir. Bu kısım INIT: anahtar kelimesi ile başlar ENDINIT ile son bulur. İstenilen ilk değerler bu bölümde yazılır.

Model Yazımında Kullanılan Özel Fonksiyonlar:

Modelin yazımında bir dizi işlemin tüm küme elemanları için tekrar edilmesine olanak tanıyan döngü fonksiyonu, değişken veya parametrelerin toplanmasını sağlayan toplam fonksiyonu veya bir küme içindeki en büyük ya da en küçük değeri bulabilen fonksiyonlar kullanmak mümkündür. Fonksiyonların yazımı sırasında kullanılması gereken yapı aşağıda verilmiştir.

@fonksiyon(kümeadı ( indis ) | koşul : ifade)

Bu kapsamda kullanılabilecek dört fonksiyon aşağıdaki tabloda verilmiştir.

FonksiyonKullanım Alanı@FOR Kısıtların tüm küme elemanlarını kapsayacak şekilde genelleştirilebilmelerini sağlar.@SUM Matematiksel bir ifadenin tüm küme elemanlarını kapsayacak şekilde toplamını alır.@MIN Bir matematiksel ifadenin tüm kümeyi göz önünde bulundurarak en küçük değerini bulur.@MAX Bir matematiksel ifadenin tüm kümeyi göz önünde bulundurarak en büyük değerini bulur.

Kümeadı kısmında döngünün geçerli olacağı kümenin adı yazılmalıdır. Problemin yapısına bağlı olarak i, j gibi bir indis yazılabilir. Döngü kümenin tüm elemanlarını kapsamayacaksa, koşul yazılarak ilgili elemanları süzmek mümkündür. Kümenin tüm

Page 12: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

12

elemanları için tekrarlanacak matematiksel ifade, ifade kısmına yazılmalıdır. Yalnızca @FOR fonksiyonu kullanılırken birden fazla matematiksel ifade kullanılabilir. Diğer fonksiyonlar için bu mümkün değildir.

Sözü edilen dört fonksiyonu daha ayrıntılı açıklamakta izleyen örnekten yararlanacağız.SETS: DEPO/D1 D2 D3 D4 D5/:TALEP;ENDSETSDATA: TALEP= 5, 1, 3, 4, 6;ENDDATA

@SUM Fonksiyonu:

Örneğimizde farklı taleplere sahip 5 depo vardır. Bu depolara ait talep değerlerini izleyen şekilde @SUM fonksiyonunu kullanarak toplamak mümkündür.

TOPLAM_TALEP=@SUM(DEPO(J):TALEP(J));Lingo başlangıçta @SUM fonksiyonuna sıfır değerini atar. Daha sonra ilgili kümenin elemanlarına ait talep değerlerini teker teker bu değere ekler. Bu bilgi TOPLAM_TALEPdeğişkeni üzerinde depolanır.

Eğer toplama işlemi ilgili kümenin tüm elemanlarını kapsayacaksa indis yazılmayabilir.TOPLAM_TALEP=@SUM(DEPO:TALEP);

Eğer kümeyi daraltarak kullanmak istiyorsak, indis kullanmak zorunlu hale gelecektir. Sözgelimi kümenin ilk üç elemanının taleplerinin toplamını almamız gerekiyorsa; ilgili üç elemanı izleyen şekilde süzmek mümkündür.

TALEP_3=@SUM(DEPO(J)|J #LE# 3:TALEP(J));@SUM fonksiyonu aslında modelin kapalı formatındaki toplam işaretinin (Σ) bir

karşılığıdır. Bir başka deyişle modelde Σ varsa, @SUM olacak demektir.

@MIN ve @MAX Fonksiyonları:

@MIN ve @MAX fonksiyonları bir ifadenin enküçük / enbüyük değerlerini kümenin tüm elemanlarını yerine koyarak bulur. Örnekte enküçük ve enbüyük talep değerlerine izleyen şekilde ulaşmak mümkün olacaktır.

ENK_TALEP=@MIN(DEPO:TALEP);ENB_TALEP=@MAX(DEPO:TALEP);

Model çözüldüğünde aşağıdaki değerler elde edilecektir.Variable Value ENK_TALEP 1.000000 ENB_TALEP 6.000000

Kümenin ilk üç elemanı içinden enküçük/enbüyük değerler belirlenmek istenirse izleyen şekilde koşul yazılabilir;

ENK_3=@MIN(DEPO(J)|J #LE# 3:TALEP(J));ENB_3=@MAX(DEPO(J)|J #LE# 3:TALEP(J));

Model çözüldüğünde aşağıdaki değerler elde edilecektir.Variable Value

Page 13: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

13

ENK_3 1.000000 ENB_3 5.000000

@FOR Fonksiyonu:

@FOR fonksiyonu kısıtları tüm küme elemanlarını kapsayacak şekilde genelleştirmek için kullanılır. Küme bazlı modellemeyi olanaklı kıldığından oldukça önemli bir fonksiyondur. @FOR fonksiyonunun kullanımını inceleyebilmek için aşağıdaki kümeyi ele alalım;

SETS: KAMYON/ MAC PETERBILT FORD DODGE/:KAPASITE;ENDSETS

Eğer hangi marka olursa olsun tüm kamyonların kapasitelerini 2500 kg. ile sınırlamak istiyorsak aşağıdaki yapıyı kullanmak mümkündür.

@FOR(KAMYON(J):KAPASITE(J)<=2500);Eğer Lingo menüsünün altında yer alan Generate \ Display Model komutu seçilirse aşağıdaki 4 kısıt görülebilecektir.

KAPASITE(MAC)<=2500KAPASITE(PETERBILT)<=2500KAPASITE(FORD)<=2500KAPASITE(DODGE)<=2500@FOR fonksiyonu bir modelde tanımlanan işlemlerin bütün indisler için tekrar

edilmesi gereken hallerde kullanılır. Yani modelde ∀ işareti varsa @FOR olmak zorundadır.

@SUM, @MAX ve @MIN fonksiyonları herhangi bir döngü fonksiyonunun içinde kullanılabilirler. @FOR fonksiyonu ise yalnızca @FOR fonksiyonu içinde kullanılabilir.

4. MODELİN ÇÖZÜMÜ

Modelin çözümü için, model girildikten veya okutturulduktan sonra Lingo Menüsü altında yer alan Solve komutu, Ctrl+S kısayolu veya arayüzdeki hedefi 12’den vuran ikon kullanılabilir. Solve komutu ile aktif penceredeki model çözülür. Çözüm sırasında; modelöncelikle yazım hatalarına karşı denetlenir. Eğer bir yazım hatası bulunursa, hatanın hangi satırda olduğu ve hata türü bilgisi ekrana gelir. Hatası olmayan/düzeltilmiş model için çözüm hakkında genel bilgilerin yer aldığı solver status penceresi türetilir

Page 14: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

14

Şekilden görülebileceği gibi solver status penceresi altı bölümden oluşur.

Variables bölümünde modelde yer alan doğrusal, doğrusal olmayan ve toplam değişken sayıları yer alır.

Optimizer Status bölümünde şu olası bilgiler yer alır.

1° State Alanı Global Optimum (Modelin eniyi çözümü)Local Optimum (Modele ait bir yerel en iyi çözüm)Feasible (Tüm kısıtları sağlayan ancak eniyi

olmayan çözüm)Unbounded (Sınırsız çözüm)Interrupted (İşlemler durduruldu)Undetermined (Henüz bir çözüm üretilemedi)

2° Iterations Alanı Yapılan ardıştırma sayısı.3° Infeasibility Kısıtların sağlanmadığı çözümsüz bir modelde, çözümsüzlüğün

derecesini gösterir.4° Objective Alanı Amaç fonksiyonunun mevcut değeri5° Best IP Alanı Tamsayılı modelin en iyi çözümü6° IP Bound Alanı Tamsayılı modelin o ana kadar elde edilmiş olan en iyi çözümü

Diğer bölümlerde sırasıyla kısıt sayısı, sıfırdan farklı değişken sayısı, kullanılan hafıza ve çözüm süresi bilgilerini bulmak mümkündür.

Modelin çözümü sonuçlandıktan sonra, çözüm raporunun yer aldığı yeni bir pencere daha oluşturulur.

Lingo menüsünün altında yer alan options penceresi kullanılarak çözümü etkileyecek olan bazı parametrelerin seçimi yapılabilir. Options penceresi izleyen şekilde verilmiştir.

Interface sekmesinde Lingo’nun çıktı görünümü ve varsayılan dosya formatı ile ilgili ayarları yapmak mümkündür. Sözgelimi bu bölümde yer alan Errors In Dialogs seçeneği işaretlenerek hataların uyarı kutuları yardımıyla görüntülenmesi sağlanır.

General Solver sekmesinde çözümle ilgili genel ayarları yapmak mümkündür. Sözgelimi Runtime Limits seçeneğini kullanarak çözüm süresi ve ardıştırma sayısı belli değerlere ulaştığında çözümün durdurulması sağlanabilir. Dual Computations bölümünde

Page 15: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

15

Prices and Ranges seçeneği seçilerek duyarlılık analizleri yapılabilir. Modelin kullanabileceği bellek için varsayılan limit 4MB’dır. Ancak özellikle büyük modellerle çalışılırken modelin okunabilmesi ve çözümün yapılabilmesi için bu limitin arttırılması gereklidir.

Linear Solver sekmesinde doğrusal ya da karma tamsayılı karar modellerin çözüm yöntemleri seçilebilir. Method bölümünde Solver Decides seçeneği seçilirse, Lingo en uygun çözüm yöntemine kendisi karar verir. Kullanıcının Primal Simplex, Dual Simplex Barieryöntemlerinden birisini tercih etmesi de mümkündür. Lingo kısıtların sağlanıp sağlanmadığını kontrol ederken iki tolerans değerini kullanır Bu değerler .000003 ve .0000001’dir. Kullanıcının tolerans değerlerini değiştirmesi mümkündür. Primal Solver bölümünde simpleks ardıştırmalarının değişkenlerin tümüne ya da bir alt kümeye uygulanmasını seçmek ya da bu kararı Lingo’ya bırakmak mümkündür. Dual Solver bölümünde iyileştirme yapmak için amaç fonksiyonunu istenen yönde en çok etkileyen değişkenin seçilmesi, bu seçim yapılmaksızın çözümün araştırılması ya da bu kararın Lingo’ya bırakılması seçeneklerinden birisi tercih edilebilir.

Nonlinear Solver sekmesinde, çözümü etkileyen toleransların değerleri girilebilir. Bu değerlerin yalnızca uzman kullanıcılar tarafından değiştirilmesi önerilir. Lingo amaç fonksiyonunda n iterasyon iyileşme görülmezse doğrusal olmayan modelin çözümünü

Page 16: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

16

durdurur. Slow Progress Iteration Limit bölümünde n sayısını girmek mümkündür. n sayısının varsayılan değeri 5’tir. Türevin analitik ya da nümerik (sonlu farklar) olarak alınmasını tercih etmek mümkündür. Analitik yöntemleri kullanmak çözüm hızını arttırmasına rağmen analitik olarak türevi alınamayan ifadeler olduğundan her zaman kullanmak mümkün değildir.

Steepest-edge seçeneği işaretlenirse, çözümde amaç fonksiyonunu istenen yönde en çok etkileyen değişken seçilir. Bu şekilde çözüme daha az adımla yaklaşmak mümkündür ancak amaç fonksiyonunu en çok etkileyecek değişkenin araştırılması safhası çözüm süresini arttırır.

Crash inital solution seçeneği işaretlenirse, Lingo sezgisel yöntem kullanarak iyi bir başlangıç çözüm geliştirir.

Selective constraint evaluation seçeneği işaretlenirse, çözüm araştırılırken tüm kısıtlar ele alınmaz. Çözüm süresini kısaltmakla beraber uygun çözüm alanının dışında bir çözüme ulaşma riski vardır.

SLP directions seçeneği işaretlenirse, Arama yönünü belirlemek için Successive Linear Programming (SLP) yöntemini kullanır.

Lingo tamsayılı modelin çözüm performansını kesme kısıtlarını kullanarak arttırır. Integer Solver bölümünde, hangi tip kesme kısıtlarının kullanılacağına karar vermek mümkündür. Eğer en iyi çözümü aranan modele ait bir çözüm biliniyorsa, bilinen amaç fonksiyonu değeri Hurdle bölümüne girilir. (Hurdle, Lingo’nun komut biçimindeki BIP komutu ile eşdeğerdir. Geniş açıklama için BIP komutu kullanımına bakınız). Bu değer dal sınır algoritmasında budamada kullanılarak çözüm süresinin azaltılması sağlanır. Büyük modellerde, arama süresini kısaltmak için kullanılabilecek bir diğer yöntem, elde edilen amaç fonksiyonu değerlerinin belli oranda arttırılarak budama yapılmasıdır. Böyle bir oran kullanılacaksa, Optimality bölümüne girilmelidir. Ancak bu şekilde elde edilecek çözümün en iyi çözüm olmayabileceği unutulmamalıdır. (Optimality, Lingo’nun komut biçimindeki IPTOL komutu ile eşdeğerdir. Geniş açıklama için IPTOL komutu kullanımına bakınız.).

5. ÇÖZÜM RAPORUNUN YORUMLANMASI

Lingo ile modelin çözümünden sonra elde edilen çözüm raporunun da ne anlama geldiğini yorumlayabilmek gerekir. Lingo; doğrusal, doğrusal olmayan ve tamsayılı modellerin çözümünde, çözüm raporunun standart biçimde sunar. Ancak bütün modeller için

Page 17: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

17

aynı yorumlar yapılamaz. Bu bölümde Lingo ile elde edilen çözüm raporunun nasıl yorumlanacağına dair detaylı bilgiler verilmiştir. Fakat anlatılanların tümü sadece doğrusal karar modelleri için geçerlidir. Doğrusal olmayan modeller ve özellikle de tamsayılı modeller için bu yorumların bir kısmı geçerlidir. Metin içinde yeri geldikçe bu özel durumlar belirtilmiştir. Sonuçların yorumundaki farklılık, aslında doğrusal olmayan ve tamsayılı programlamanın teorisinden kaynaklanmaktadır. Dolayısıyla bu modeller için sonuçların yorumlanması biraz da kullanıcının teorik bilgisinin derinliğine bağlıdır.

Lingo’da hatası olmayan/düzeltilmiş model için Solve komutu verildiğinde çözüm hakkında genel bilgilerin yer aldığı solver status penceresi ve çözüm raporu türetilir. Bu pencere yardımıyla raporun ilk satırından çözümün genel eniyi, yerel eniyi, tüm kısıtları sağlayan bir uygun çözüm, sınırsız çözüm olup olmadığı ya da sonuca ulaşılmadan işlemlerin durdurulduğu veya bir çözüm bulunamadığını öğrenilebilir.

Lingo, çözüm raporunda sonuçları 4 grupta sınıflandırarak listeler. Values, reduced cost, slack or surplus, dual price. Çözüm listesinde verilen bu ifadeler ile anlamları ve bunlar için kullanılan genel kabul görmüş simgeler i=1,2,...,m ve j=1,2,...,n olmak üzere aşağıda verilmiştir:

Değişken Simge Lingo’daki AdıAsıl modeldeki değişkenler xj ValueAsıl modelin kısıtlarına eklenen aylak/artık değişkenler

Si Slack or Surplus

İkil modeldeki ikil değişkenler wi Dual Pricesİkil modelin kısıtlarına eklenen aylak/artık değişkenler vj Reduced Cost

Aşağıda bir doğrusal karar modeli ve modelin Lingo ile çözümü sonunda elde edilen çözüm raporu verilmiş, raporun nasıl yorumlanacağı açıklanmıştır.

Model:max=2*x1+3*x2+4*x3+x4;2*x1+2*x2+x3+x4<=100;6*x1+2*x2+3*x3+2*x4>=40;x1+x2+x3+x4=80;

Çözüm Raporu:Global optimal solution found at step: 2Objective value: 320.0000

Variable Value Reduced Cost X1 0.0000000 2.000000 X2 0.0000000 1.000000 X3 80.00000 0.0000000 X4 0.0000000 3.000000

Row Slack or Surplus Dual Price 1 320.0000 1.000000 2 20.00000 0.0000000 3 200.0000 0.0000000

4 0.0000000 4.000000Bu çözüm raporundan ilk olarak modelin 2 ardıştırmada çözüldüğü, amaç fonksiyonun

320 olarak hesaplandığı ve bunun bir eniyi çözüm olduğu anlaşılmaktadır.

Page 18: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

18

Rapordaki “Value” sütunundan asıl modeldeki değişkenlerin eniyi çözümde aldıkları değerler okunmaktadır. Buna göre modelin eniyi çözümünde x1=0, x2=0, x4=0 ve x3=80 değerlerini almıştır.

Rapordaki “Reduced Cost” (indirgenmiş maliyet) sütunundan, ikil modele eklenen aylak ve artık değişkenlerin, ikil modelin eniyi çözümünde aldıkları değerler okunmaktadır. Asıl model 4 değişkenli olduğuna göre ikil model 4 kısıtlı olacak, dolayısıyla ikil modelde 4 tane aylak/artık değişken olacaktır. Nitekim rapora göre v1=2, v2=1, v3=0 ve v4=3 değerini almıştır. İndirgenmiş maliyet terimi, eniyi çözümde temelde yer almadığı halde bir değişkenin mutlaka temele girmesi istenirse, değişkenin alacağı her birimlik değer için, amaç fonksiyonu değerinden ne kadar zarar edileceğini gösterir. Örneğin x1 değişkeni eniyi çözümde temele girememişken zorla temele alınırsa ve temelde örneğin 20 değerini alırsa, amaç fonksiyonu değerinin 2*20=40 birim azalıp yeni çözümde 320-40=280 olacağı anlaşılır. Ama elbette ki bulunacak bu çözüm, eniyi çözüm değildir. İndirgenmiş maliyet değerleri aynı zamanda dual (ikil) modeldeki aylak ve artık değişkenlerin değerlerini gösterir. Rapora göre v3=0 olması, dual modelin 3. kısıtının eşitlik halinde yani sıkı olarak gerçekleştiğini, diğer kısıtlarınsa sıkı olmadığını gösterir. Bu da asıl modelin eniyi çözümünde x3 değişkeninin temel değişken olduğunu ve değer aldığını gösterir.

“Slack or Surplus” terimi, asıl modelde kısıtlara eklenen aylak veya artık değişkenlerin eniyi çözümde aldıkları değerleri gösterir. Ancak rapordaki ilk satır amaç fonksiyonunu, 2. satır ise 1. kısıtı gösterir. Çözüm raporunda da ilk satırdaki 320 ifadesi aslında amaç fonksiyonu değerini z=320 olarak temsil etmektedir. Diğer değerlere sırasıyla bakıldığında S1=20, S2=200 ve S3=0 değerini almıştır. Dikkat edilirse modelin 3. kısıtı eşitlik halindedir ve bu kısıta herhangi bir aylak/artık değişken eklenmez, yapay değişken eklenir. Modelin eniyi çözümü bulunduğuna göre yapay değişkenin temelde yer almaması gerekir. Nitekim çözüm raporundan da 3. kısıta eklenen yapay değişkenin (S3), eniyi çözümde sıfır değerini aldığı görülmektedir. Aylak ve artık değişkenlerin aldığı değerlerden 3. kısıtın sıkı (eşitlik halinde) gerçekleştiği diğerlerinin sıkı kısıtlar olmadığı (kullanılamayan kaynaklar olduğu) anlaşılmaktadır.

“Dual Prices” terimi, ikil (dual) değişkenlerin eniyi çözümde aldıkları değerleri gösterir. Asıl model 3 kısıtlı olduğu için ikil modelde 3 değişken olacaktır. Rapordan da w1=0, w2=0 ve w3=4 olarak görülmektedir. İkil değişkenler, modelin sağ taraf sabitlerinde 1 birimlik artış veya azalış yapılırsa amaç fonksiyonu değerinin bu değişiklikten nasıl etkileneceğini gösterir. Buna göre rapordan, 1. ve 2. kısıtların sağ taraf sabitlerinde 1 birimlik herhangi bir artışın ya da azalışın amaç fonksiyonu üzerinde, karşı gelen ikil değişken değerleri sıfır olduğu için, hiçbir etkisi olmayacağı anlaşılmaktadır. Ama w3=4 olduğu için, 3. kısıtın sağ taraf sabitindeki 1 birimlik artışın amaç fonksiyonu değerini 4 birim arttıracağı, 1 birimlik azalışın da amaç fonksiyonu değerini 4 birim azaltacağı anlaşılmaktadır. Ancak Lingo'da yorumun bu şekilde yapılabilmesi için amaç fonksiyonunun enbüyük (max) biçiminde olması gerekir. Fakat amaç fonksiyonu enküçük (min) biçimindeyse kısıtlara karşı gelen ikil değişken değerlerinin -1 ile çarpılması ve sonra yukardaki şekliyle yorumlanması gerekir. Bu fark, tamamen Lingo'nun modelleri çözmekte izlediği mantıktan kaynaklanmaktadır ve doğrusal programlamanın teorisiyle ilgili değildir. İkil değişkenler yorumlanırken öncelikle sağ taraf sabitlerine göre duyarlılık analizinin yapılarak, modelin sağ taraf sabitlerinde 1 birimlik artış veya azalışın yapılıp yapılamayacağının incelenmesinde fayda vardır. Böyle bir inceleme sonucunda örneğin 3. kısıtın sağ taraf sabitinde 5 birimlik artış yapılabileceği anlaşılırsa, amaç fonksiyonu değerinin de 4*5=20 birim artacağı anlaşılır.

Page 19: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

19

Lingo’da eniyi çözüm bulunduktan sonra alternatif çözümün olup olmadığını anlayabilmek için Aylaklığın Tamamlayanı (Complementary Slackness) özelliğinden yararlanmak gerekir. Aylaklığın tamamlayanı özelliği bir doğrusal karar modelinin eniyi çözümünde;

1. ∀j için (j=1,2,...,n) xj.vj=0 ve

2. ∀i için (i=1,2,...,m) Si.wi=0

eşitliklerinin sağlanması gerektiğini belirtir.

1. koşul şunu söyler: Asıl modelin eniyi çözümünde pozitif değer alan değişkenin numarası neyse, ikil modelde bu numaralı kısıta eklenen aylak/artık değişkenin ikil modelin eniyi çözümünde alacağı değer sıfır olmalıdır. Benzer şekilde asıl modelde temel dışında kalarak sıfır değerini alan değişkenin numarası neyse, ikil modelde bu numaralı kısıta eklenen aylak/artık değişkenin ikil modelin eniyi çözümünde alacağı değer sıfırdan farklı olmalıdır. Bu özelliğin verilen çözüm raporunda da sağlandığına dikkat ediniz. Öte yandan eniyi çözümde xj temel dışı değişken iken vj değeri de sıfır değerini almışsa, asıl modele ait bir alternatif çözümün daha olduğu anlaşılır. Çünkü xj’nin temel alınmasıyla amaç fonksiyonu bundan etkilenmeyecek demektir. Bu da aynı z değerine sahip bir başka çözümün bulunabileceği anlamına gelir. Böylece alternatif çözümün söz konusu olduğu anlaşılır. Sonuç olarak ilgili xj değişkeninin temele alınmasıyla diğer alternatif çözüm bulunabilir. Verilen çözüm raporu için böyle bir durum söz konusu değildir.

2. koşul şunu söyler: Asıl modelin eniyi çözümünde pozitif değer alan aylak/artık değişkenin numarası neyse, ikil modelde bu numaralı ikil değişkenin ikil modelin eniyi çözümünde alacağı değer sıfır olmalıdır. Benzer şekilde asıl modelin eniyi çözümünde temel dışında kalarak sıfır değerini alan aylak/artık değişkenin numarası neyse, ikil modelde bu numaralı ikil değişkenin ikil modelin eniyi çözümünde alacağı değer sıfırdan farklı olmalıdır. Bu özelliğin de verilen çözüm raporunda sağlandığına dikkat ediniz. Fakat eniyi çözümde Sitemel dışı değişken iken wi değeri de sıfır değerini almışsa; asıl modele ait bir alternatif çözümün daha olduğu ve ilgili Si değişkeninin temele alınmasıyla diğer alternatif çözümün bulunacağı anlaşılır. Verilen çözüm raporunda böyle bir durum söz konusu değildir.

Sonuç olarak temel dışında kalarak sıfır değerini alan xj ve Si değişkenleri için kaç tane xj=vj=0 ve Si=wi=0 durumu varsa, asıl model için o kadar daha alternatif çözüm var demektir. İlgili değişkenlerin tek tek temele alınmasıyla bulunacak uç noktaların dışbükey bileşimi, modelin genel çözümünü verir. Böyle bir durum yoksa (aylaklığın tamamlayanı özelliği sağlanıyorsa) tek noktada eniyi çözüm var demektir.

Lingo’da sınırsız çözüm, Unbounded mesajı ile anlaşılır. Lingo, modelin sınırsızlığının başladığı uç noktaya kadar işlemleri yaparak, sınırsızlığın hangi uç noktadan (çözümden) itibaren başladığını belirtir.

Lingo’da bir çözüme ulaşılamaması, Infeasible veya No Feasible Solution mesajı ile anlaşılır. Lingo, modelde o aşamaya kadar yapılan işlemler sonucunda elde edilen değerleri görüntüler. Ama bunlar gerçekte modele ait bir çözüm (uç nokta) değildir. Çünkü modelin kısıtları sağlanmaz. Bir modele ait çözüm bulunamamasının bir nedeni genellikle bazı kısıtların birbirleriyle çelişmesidir. Bu da çoğu kez model yazımında yapılan bir hatadan veya problemin modellenmesinde yapılan bir hatadan oluşur. Dolayısıyla bu tür hataları ayıklamak için hangi kısıtların birbirleriyle çeliştiğini belirlemek gerekir.

Bu aşamaya kadar yapılan yorumların hepsi sadece doğrusal modeller için geçerlidir. Doğrusal olmayan veya tamsayılı bir modelde çözüm raporu tıpkı yukarda anlatıldığı gibi

Page 20: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

20

görüntülenmesine rağmen, doğrusal modeller için yapılan yorumlar burada aynen geçerli değildir. Bu durumda sadece asıl değişkenlerin çözümde hangi değerleri aldıklarına bakılarak modelin çözümünün bulunduğu söylenebilir.

Doğrusal olmayan bir modelin çözüm raporundaki value değerleri, asıl değişkenlerin çözümde aldığı değerleri, slack or surplus değerleri de, modele eklenen aylak ve artık değişkenlerin çözümdeki değerlerini gösterir. Bunlar modelin çözüm sonuçlarıdır. Ama Lingo 6.0 bu çözümün eniyi çözüm olup olmadığını söyleyemez. Bu nedenle elde edilen çözümler için hep Local Optimum ifadesini kullanır. Bunun nedeni, amaç fonksiyonunun ve özellikle de kısıtların oluşturduğu çözüm kümesinin dışbükey olup olmadığının kolayca belirlenememesidir. Doğrusal olmayan programlamanın teorisinde göre, çözüm kümesi dışbükey küme ise ve amaç fonksiyonu da dışbükey bir fonksiyon ise bulunacak çözüm eniyi çözümdür ve bir bütünsel enküçük (global minimum) elde edilir. Benzer şekilde çözüm kümesi dışbükey küme ve amaç fonksiyonu da içbükey bir fonksiyon ise yine eniyi çözüm bulunur ama bu kez bir bütünsel enbüyük (global maximum) elde edilir. Çözüm kümesinin dışbükey olmaması halinde elde edilen çözüm için bütünsel eniyi denemez. Ancak kullanıcı elindeki problemde çözüm kümesi ve amaç fonksiyonu hakkında dışbükeylik bilgilerine sahipse, Lingo’nun bulduğu sonucun aslında eniyi çözüm olduğunu anlayabilir. Bunu haricinde yerel eniyi elde edildiğini bilmesi gerekir.

Doğrusal olmayan modelin çözüm raporundaki Dual price değerleri, kısıtlara karşı gelen dual değişkenlerin (Lagrange çarpanlarının) değerlerini gösterir. Ancak burada ilgili kısıtın sağ taraf sabitinin 1 birim değiştirilmesinin, amaç fonksiyonunun değerini yaklaşık olarak dual değişken kadar etkileyeceği bilinmelidir. Burada kesinlikten söz etmek zordur.

Tamsayılı modeller için de çözüm raporunun yorumlanmasında dikkatli olmak gerekir. Burada da sadece value başlığıyla görüntülenen ve asıl değişkenlerin çözümde aldıkları değerleri gösteren kısım ile çözümde aylak/artık değişkenlerin aldıkları değerleri gösteren kısım anlamlıdır. Rapordan modelin eniyi tamsayılı çözümü öğrenilir ama diğer değerlere bakarak doğrusal programlamada olduğu dual değişkenlere ait veya alternatif çözüme ait yorumlar yapılamaz. Ek yorumlar için daha fazla teorik bilgi gerekir.

6. DUYARLILIK ANALİZİ

Duyarlılık analizi, eniyi çözümü bulunan bir doğrusal karar modelinde, modeldeki parametrelerin çözümü nasıl etkilediklerine dair yapılan analizdir. Yani duyarlılık analizi sadece doğrusal modele yapılabilir ve eniyi çözümün de bulunmuş olması gerekir. Duyarlılık analizi yapabilmek için öncelikle Lingo/Options/General Solver/Dual Computationsbölümünde Prices and Ranges seçeneği seçilmelidir. Lingo, sadece iki tür duyarlılık analizi yapar:

1. Amaç fonksiyonu katkılarına göre duyarlılık analizi;

2. Sağ taraf sabitlerine göre duyarlılık analizi.

Duyarlılık analizi yaptırmak için Lingo menüsünün altında yer alan Range komutu seçilmelidir. Eğer modelde doğrusal olmayan değişkenler varsa bu değişkenlerin current coefficient sütununda NONLINEAR yazacaktır. Aynı şekilde doğrusal olmayan bir kısıtın current RHS sütununda da NONLINEAR bilgisi yer alacaktır. Örnek probleme ait duyarlılıkanalizi raporu aşağıda verilmiştir.

Page 21: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

21

Ranges in which the basis is unchanged:

Objective Coefficient Ranges Current Allowable Allowable Variable Coefficient Increase Decrease X1 2.000000 2.000000 INFINITY X2 3.000000 1.000000 INFINITY X3 4.000000 INFINITY 1.000000 X4 1.000000 3.000000 INFINITY

Righthand Side Ranges Row Current Allowable Allowable RHS Increase Decrease 2 100.0000 INFINITY 20.00000 3 40.00000 200.0000 INFINITY 4 80.00000 20.00000 66.66666

Duyarlılık analizi raporundaki ilk kısım, amaç fonksiyonu katkılarına göre duyarlılık analizi sonuçlarıdır. Burada değişkenin amaç fonksiyonundaki katkısı ile, bu değerin eldeki eniyi çözümü değiştirmeden ne kadar arttırılabileceği veya azaltılabileceği görüntülenir.

Rapora göre örneğin x1 değişkeninin amaç fonksiyonundaki katkısı 2'dir ve bu değer en çok 2 birim arttırılabilir. Ama istenirse eksi sonsuza kadar istenen herhangi bir değer verilebilir. Yani x1'in amaç fonksiyonu katkısı c1, (-∞,4] aralığında değiştiği sürece eldeki eniyi çözüm takımı ve onların eniyi çözümde aldıkları değerler değişmez. Ancak amaç fonksiyonu eniyi değeri (z*), x1’in katsayısındaki değişime bağlı olarak değişir. Bu aralığın dışındaysa eldeki çözüm değişir ve yeni çözümün simpleks algoritması ile bulunması gerekir. x3 içinse tersi söz konusudur. x3'ün amaç fonksiyonu katkısı 4'dür. Bu değer artı sonsuza kadar arttırılabilir ve ancak 1 birim azaltılabilir. Bu durumda x4'ün amaç fonksiyonu katkısı c3, [3,+∞) aralığında değiştiği sürece eldeki eniyi çözüm takımı, onların eniyi çözümde aldıkları değerler değişmez.

Raporun ikinci kısmı, sağ taraf sabitlerine göre duyarlılık analizi sonuçlarıdır. Burada ise her kısıtın sağ taraf sabiti değeri ve eldeki eniyi çözüm takımını değiştirmemek koşuluyla bu değerin ne kadar arttırılabileceği veya azaltılabileceği verilir.

Rapora göre örneğin 1. kısıtın sağ taraf sabiti değeri, 100'dür ve bu değer en çok 20 birim azaltılabilir ama istendiği kadar arttırılabilir. Yani b1, [80,+∞) aralığında değiştiği sürece eldeki eniyi çözüm takımı değişmez, ama değişikliğe bağlı olarak değişkenlerin eniyi çözümde aldıkları değerler ve eniyi çözüm değeri (z*) değişir. b1 için bu aralığı dışında değişiklik yapılırsa eldeki eniyi çözüm takımı da değişecektir.

Lingo ile yeni kısıt eklentisi, yeni değişken eklentisi ve teknik katsayılarda değişiklik gibi diğer duyarlılık analizleri yapılmak istenirse, modelin yeni duruma göre güncellenip yeniden çözdürülmesi gerekir.

7. LINGO’DA KOMUT KULLANIMI

Lingo’da önceki bölümlerde anlatılan işlemleri menülerden veya kısa yol tuşlarından yararlanarak yapmak mümkün olduğu gibi komut kullanarak yapmak da mümkündür. Komut kullanımı özellikle eski Lindo kullanıcılarının alışık olduğu bir yapı olduğu için tercih edilebilir.

Lingo’da komut moduna geçmek için Window/Command Window seçiminin yapılması gerekir. Bu aşamada yeni bir pencere açılarak Lingo’nun kullanıcıdan komut beklediğine dair

Page 22: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

22

: işareti görüntülenir. Kullanıcı bu aşamadan sonra komutlar girerek model çözümü, dosyaya bilgi kaydı vb işlemleri yapabilir. Bu ortamda kullanılabilecek komutların listesini görmek için COM komutu yazılmalıdır. Herhangi bir komut hakkında (Örneğin SAVE) detaylı bilgi isteniyorsa HELP SAVE yazmak yeterli olacaktır. Bazı yararlı komutların kullanımı hakkında aşağıda ayrıntılı bilgiler verilmiştir.

LOOK: Bu komut modelin ekranda görüntülenmesini sağlar. Komut yazımı LOOK Satır Numarası veya LOOK ALL biçimindedir. İlk biçimde sadece istenen satır numarasındaki ifade, ikinci biçimdeyse modelin tümü görüntülenir.SAVE: Modelin belirtilen dosyaya kaydedilmesini sağlar. Örnek: Save Deneme.txtGO: Modelin çözümünü sağlar. Komuttan sonra herhangi bir sayı yazılırsa yapılması istenen ardıştırma sayısı belirtilmiş olur. Örneğin GO 50000 komutu, 50.000 ardıştırmadan sonra işlemlerin durmasını sağlar. Bu komut özellikle iki modelin çözüm performansları açısından karşılaştırılması söz konusuysa kullanışlıdır.SOLU: Genel çözüm raporunu verir.NONZ: Çözümde sadece sıfırdan farklı değer alan değişkenlerin değerlerini ve eşitlik halinde sağlanan kısıtları görüntüler. Bu komut özellikle bütünüyle 0-1 tamsayı değişkenlerdenoluşmuş modellerin çözümünde, çözümün hızlı anlaşılması için yararlıdır.RANGE: Duyarlılık analizi sonuçlarını verir.DIV: Komutun yazılmasından sonra yapılacak bütün işlemlerin belirtilen dosyaya text olarak kaydedilmesini sağlar. Ekrana herhangi bir bilgi gelmez. Örnek:

DIV Sonuc.txtLOOK ALLNONZRVRT

komutlarının yazımıyla önce modelin tamamı, sonra çözümde sıfırdan farklı değer almış değişkenlerin değerleri sonuc.txt dosyasına kaydedilir ve dosya kapatılır. RVRT: Div ortamından çıkılarak yapılan işlemlerin tekrar ekranda görüntülenmesini sağlar.IPTOL: Tamsayılı bir modelin çözümü sırasında, o ana kadar bulunan eniyi tamsayılı çözümdeki amaç fonksiyonu değerinden, (yüzde olarak) n kadar daha iyi bir değere sahip başka bir tamsayı çözüm olup olmadığını araştırır. Komutun kullanımı, IPTOL n biçimindedir ve n değeri ondalıklı bir sayıyı gösterir. Örneğin amaç fonksiyonu enküçüklemek biçiminde olan bir tamsayılı modelde çözüme geçilmeden önce IPTOL 0.1 komutu verilmiş olsun ve ilk olarak Z=1000 olan bir tamsayılı çözüm bulmuş olsun. Lingo bundan sonra z=1000 değerinin %10’undan daha iyi bir tamsayı çözüm olup olmadığını araştırır. Yani Z≤900 koşulunu sağlayan tamsayı çözümler araştırılır. Varsa bu çözüm listelenir ve yine bulunan değerin %10’undan daha iyi bir tamsayı çözüm araştırılır. Yoksa işlem sona erer. Bu komutun dezavantajı, n değerinin bu örnekte olduğu gibi büyük tutulması halinde, modelin eniyi tamsayılı çözümü bulunamadan işlemlerin durması olasılığıdır. Örneğin az önceki örnekte eniyi çözüm Z=950 ise, IPTOL 0.1 komutu yüzünden bu değer bulunamaz. BIP: Bir tamsayılı modelin çözümünde en çok işe yarayacak komutlardan biridir. BIP komutu çözülmesi istenen model için amaç fonksiyonu yapısı enbüyük biçimindeyse alt sınır değerini, enküçük biçimindeyse üst sınır değerini simgeler. Komut şekli, BIP Sınır_Değer biçimindedir.

8. EXCEL’DEN VERİ ALMA VE GÖNDERME

DATA bölümüne, parametre değerlerinin girilmesi, özellikle büyük boyutlu problemlerle çalışırken, oldukça zahmetlidir. Bunun yerine, verilerin Excel dosyalarından okutulması hem zaman kazandırması hem de veri aktarımı sırasında oluşabilecek hataların önlenebilmesi açılarından oldukça avantaj sağlamaktadır. Modelin çözümü sonucunda elde

Page 23: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

23

edilen karar değişkeni değerleri çoğu kez analizlerde kullanılırlar ve hesap tablolarına aktarılmaları gereklidir. Bu bilgilerin direkt olarak Excel’e aktarılabilmesi yine doğruluk ve zaman tasarrufu sağlamaktadır.

@OLE Fonksiyonunu Kullanarak Excel’den Veri Almak

@OLE, Excel’den OLE bazlı veri transferi yapmak için kullanılan bir arayüz fonksiyonudur. OLE transferleri, direkt hafıza transferleridir, aracı dosya kullanımını gerektirmezler. @OLE fonksiyonu kullanıldığında, Lingo, Excel’i açar, ilgili dosya ve çalışma sayfasını çağırır. Excel 5 ve üzeri tüm versiyonlarda bu komut kullanılabilir. @OLEfonksiyonu, Lingo modelinin DATA yada INIT bölümlerinde kullanılabilir.

@OLE fonksiyonu yardımıyla, model parametrelerinin yanı sıra, küme elemanlarının isimleri de okutulabilir. Eleman adlarının metin, model parametrelerinin sayısal formda olması beklenir. Kök kümeler için, her küme elemanına bir hücre karşılık gelecek şekilde veri girilmelidir. Türemiş kümelerde ise, ilk önce kümenin birinci elemanının tüm kombinasyonlarını içerecek şekilde yine toplam küme elemanı sayısı kadar hücreye veri girişi yapılmalıdır.

@OLE iki boyutlu bir alandan okuma yapabilir, ancak kesikli yada üç boyutlu alanlardan okuma yapamaz. Aralık, soldan sağa ve yukardan aşağıya önceliklerine göre okunur.

Eğer bir Excel sayfasından okuma yapılacaksa, @OLE fonksiyonu aşağıdaki yapıya uygun olarak kullanılır:

Eleman adı/parametre_listesi=@OLE(‘çalışma sayfası_dosya’[,aralık_adı_listesi]);

@OLE fonksiyonunun üç farklı kullanımı örnekler üzerinde açıklanmıştır:

1°1°1°1° MALIYET,KAPASITE=@OLE(‘KASIM99.XLS’);Aralık adı verilmediğinde, Lingo aralık adı ile okunacak parametre adlarının aynı olduğunu varsayar. Bu örnekte, verilerin okunabilmesi için Excel dosyasında, MALIYET ve KAPASITE adlarında iki aralık tanımlanmış olması gerekir.

2°2°2°2° MALIYET,KAPASITE=@OLE(‘KASIM99.XLS’,’VERIDEPO’);Bu örnekte, MALIYET ve KAPASITE için VERIDEPO adında tek bir aralık tanımlanmıştır. VERIDEPO aralığının iki sütundan oluştuğunu varsayalım, bu durumda Lingo, ilk sütundaki verileri MALIYET parametresi, ikinci sütundaki verileri ise KAPASITE parametresi olarak atayacaktır. Bu yapıyı kullanabilmek için okunacak parametrelerin tümünün aynı küme de tanımlanmış olması gereklidir. Yine bu yapı, küme elemanlarının adları ile parametre değerlerinin birlikte okunmasına izin vermez.

3°3°3°3° MALIYET,KAPASITE=@OLE(‘KASIM99.XLS’,’MA99’,’KAP99’);Bu örnekte, MALIYET ve KAPASITE için MA99 ve KAP99 adlarında iki farklı aralık tanımlanmıştır. Sırasıyla MA99 aralığındaki veriler, MALIYET parametresine KAP99 aralığındaki veriler de KAPASITE parametresine atanır.

@OLE komutunun kullanımını örnek bir model üzerinde inceleyelim.

Page 24: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

24

Örnek Problem: Ulaştırma Modelinde @OLE Fonksiyonu ile Veri Okuma

! 6 Fabrika, 8 Bölgeli Ulaştırma Problemi Lingo Kapalı Biçimi;

SETS: ! Fabrika ve bölgeler Excel’den okunacak;

FABRIKA: KAPASITE;BOLGE: TALEP;

YOLLAR(FABRIKA, BOLGE) : MALIYET, MIKTAR;ENDSETS

!Amaç fonksiyonu; MIN = @SUM( YOLLAR(I,J): MALIYET(I,J)*MIKTAR(I,J));!Kapasite aşılamamalı kısıtı; @FOR(FABRIKA(I): @SUM(BOLGE(J): MIKTAR(I,J)) <= KAPASITE(I));!Talepler karşılanmalı kısıtı; @FOR(BOLGE(J): @SUM(FABRIKA(I): MIKTAR( I,J)) >= TALEP(J));

DATA: !Verileri Excel’den oku; FABRIKA,BOLGE,KAPASITE,TALEP,MALIYET=@OLE(‘c:\Lingo\Samples\KASIM99.xls’,’FABRIKA’,’BOLGE’,’KAPASITE’,’TALEP’,’MALIYET’);ENDDATA

END

Modelin okuyacağı verileri Excel dosyasına yazdıktan sonra, maliyet, kapasite, talep parametre değerlerinin ve fabrika, bölge adlarının yer aldığı aralıkları (hücreleri) mutlaka tanımlamamız (model yazımında kullandığımız adlarla adlandırmamız) gereklidir. Modelin kullanacağı KASIM99.xls çalışma sayfası da izleyen şekilde görülmektedir.

Page 25: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

25

Örnek problem için adlar ve aralıklar şöyle tanımlanmıştır:

Ad AralıkKAPASITE K5:K10MALIYET C5:J10TALEP C11:J11BOLGE C4:J4FABRIKA B5:B10

Excel’de aralık tanımlamak için ise aşağıda verilen süreç izlenmelidir.

1° Tanımlanmak istenen alanı işaretle.2° Menüden sırasıyla Ekle/Ad/Tanımla seç.3° Aralığa verilmek istenen adı yaz ve OK butonuna bas.

@OLE Fonksiyonunu Kullanarak Excel’e Veri Göndermek

@OLE fonksiyonu ile Excel’e OLE bazlı veri transferi yapmak da mümkündür. Lingo modelinin DATA yada INIT bölümlerinde kullanılabilir. Aralık, her hücreye bir veri denk gelecek şekilde tanımlanmalıdır.

@OLE fonksiyonu, Excel’e veri yazdırmak amacıyla aşağıdaki yapıya uygun olarak kullanılır.

@OLE(‘çalışma sayfası_dosya’[,aralık_adı_listesi])= Eleman adı/değişken_listesi;

@OLE komutunun Excel’e veri yazdırmak amacıyla kullanımını örnek bir model üzerinde inceleyelim.

Örnek Problem: Ulaştırma Modelinde @OLE Fonksiyonu ile Sonuç Yazdırma

! 6 Fabrika, 8 Bölgeli Ulaştırma Problemi;SETS:! Fabrika ve bölgeler Excel’den okunacak;

FABRIKA: KAPASITE;BOLGE: TALEP;

YOLLAR(FABRIKA, BOLGE) : MALIYET, MIKTAR;ENDSETS

!Amaç fonksiyonu; MIN = @SUM( YOLLAR(I,J):MALIYET(I,J)*MIKTAR(I,J));!Kapasite aşılamamalı kısıtı; @FOR(FABRIKA(I): @SUM(BOLGE(J): MIKTAR(I,J)) <= KAPASITE(I));!Talepler karşılanmalı kısıtı; @FOR(BOLGE(J): @SUM(FABRIKA(I): MIKTAR( I,J)) >= TALEP(J));

DATA: !Verileri Excel’den oku; FABRIKA,BOLGE,KAPASITE,TALEP,MALIYET=@OLE(‘c:\Lingo\Samples\

KASIM99.xls’,’FABRIKA’,’BOLGE’,’KAPASITE’,’TALEP’,’MALIYET’); !Taşınması gereken miktarları Excel’e yazdır; @OLE(‘c:\Lingo\Samples\SONUC99.xls’,’MIKTAR’)=MIKTAR;ENDDATA

END

Page 26: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

26

Lingo’nun MIKTAR karar değişkeni değerlerini SONUC99.xls çalışma sayfasına yazabilmesi için öncelikle yazdırma alanının tanımlanması gereklidir. Bu örnek için MIKTARaralığı C5:J10 aralığında tanımlanmıştır ve modelin kullanacağı SONUC99.xls çalışma sayfası da aşağıda verilmiştir.

Bu model çözüldüğünde; Lingo, (eğer daha önce açılmadıysa) Excel’i açar, KASIM99.xls çalışma sayfasını yükler, fabrika ve bölge adlarını ve KAPASITE, TALEP, MALIYET parametrelerinin değerlerini okur. Model çözülür. Daha sonra, SONUC99.xls çalışma sayfası açılır ve tanımlı aralığa MIKTAR karar değişkeninin değerleri yazılır.

Page 27: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

27

9. LINGO KAPALI FORMATI İÇİN ÖRNEKLER

Örnek 1: Ulaştırma Problemi (Transportation Problem): [Doğrusal Model]

10 tane fabrikadan 5 tane bölgeye, bölgelerin taleplerini karşılayacak şekilde ürün taşınması planlanmaktadır. Fabrikaların kapasiteleri 100’er birim, talepler ise sırasıyla 200, 300, 150, 250, 100 birim olarak verilmiştir. Her fabrikadan her bölgeye taşıma yapmanın birim maliyeti farklıdır (Taşıma maliyetlerine ilişkin değerler Lingo yazımında verilmiştir). Buna göre toplam taşıma maliyetini en küçük yapacak taşıma planını bulan modeli yazınız.

xij: i. Fabrikadan j. Bölgeye taşınacak miktar,ai: i. Fabrikanın kapasitesi,bj: j. Bölgenin talebi,cij: i’den j’ye bir birim ürünü taşıma maliyeti, olmak üzere genel model üstteki gibidir.

MODEL:! 10 Fabrika, 5 Bölgeli Ulaştırma Problemi;

SETS: Fabrika / 1..10/ : a; Bolge / 1..5/ : b;

Yollar ( Fabrika, Bolge) : c, x;ENDSETS

MIN = @SUM( Yollar: c*x);

! Kapasite aşılamamalı kısıtı;@FOR( Fabrika(I): @SUM(Bolge(J): x(I,J)) <= a(I));

! Talepler karşılanmalı kısıtı;@FOR( Bolge(J): @SUM(Fabrika(I): x( I, J)) >= b(J));

DATA: a =100; b = 200, 300, 150, 250, 100; c = 6,2,6,7,8, 4,9,5,3,9, 8,8,1,5,3, 3,5,5,3,9, 8,4,1,5,2, 4,7,5,3,9, 2,5,1,5,3, 2,1,5,3,2, 8,9,1,1,3, 4,9,1,3,4;ENDDATA

END

∑=

=≤n

jiij ax

1

m1,...,i

∑=

=≥m

ijij bx

1n1,...,j

xij ≥ 0 kısıtları altında,

∑∑= =

=m

i

n

jijij xcenk

1 1.z

Açıklama: c değerleri yan yana da yazılabilirdi. Bu durumda Lingo değerleri (1,1)’den itibaren başlayarak sırayla (1,2); (1,3); ... hücresine denk gelecek şekilde okurdu. Sayılar arasında virgül olması da zorunlu değildir.

Page 28: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

28

Örnek 2: Enkısa Yol Problemi: [Bütünüyle 0-1 Tamsayılı Model]

Aşağıdaki matriste bir serimdeki birbiriyle ilişkili düğümler ve aralarındaki uzaklıklar verilmiştir. (Serim simetriktir ancak matris üst üçgensel biçimde verilmiştir). 1. düğümden 10. düğüme olan en kısa uzaklığı bulacak karar modelini yazınız.

yij: i. düğümden j. düğüme geçiş yapılması hali (1 ise geçiş var; 0 ise geçiş yok),cij: i. düğüm ile j. düğüm arasındaki uzaklık, olmak üzere genel model üstteki gibidir.

! 10 Düğümlü Enkısa yol problemi;

sets: dugum / 1..10 /; akis(dugum,dugum) : c, y;endsets

min=@sum(akis:c*y);! Başlangıç düğüm kısıtlar; @sum(dugum(j)|c(1,j) #ne# 0: y(1,j))=1;! Bitiş düğümü kısıtları; @sum(dugum(i)|c(i,10) #ne# 0 : y(i,10))=1;! Ara düğümlere ait kısıtlar; @for (dugum(k)| k #ne# 1 #AND# k #NE# 10: SUM(dugum(i)|c(i,k) #ne# 0: y(i,k))=@SUM(dugum(j)|c(k,j) #ne# 0:y(k,j)));! Değişkenlerin 0-1 tamsayı olarak tanımlanması; @FOR(akis|c #ne# 0: @BIN(y));

data: c= 0, 77, 25, 82, 93, 0, 0, 0, 0, 0, 0, 0, 12, 42, 70, 0, 80, 89, 0, 0, 0, 0, 0, 55, 77, 57, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 16, 0, 33, 0, 0 0, 0, 0, 0, 50, 53, 70, 72, 88, 0, 0, 0, 0, 0, 0, 69, 48, 0, 90, 0, 0, 0, 0, 0, 0, 0, 26, 44, 135, 0, 0, 0, 0, 0, 0, 0, 72, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; enddata

end

i\j 1 2 3 4 5 6 7 8 9 101 0 77 25 82 93 0 0 0 0 02 0 0 12 42 70 0 80 89 0 03 0 0 0 55 77 57 0 0 0 04 0 0 0 0 62 0 16 0 33 05 0 0 0 0 0 50 53 70 72 886 0 0 0 0 0 0 69 48 0 907 0 0 0 0 0 0 0 26 44 1358 0 0 0 0 0 0 0 72 0 989 0 0 0 0 0 0 0 0 0 7310 0 0 0 0 0 0 0 0 0 0

1yn

2jj1∑ =

=

∑ =−

=

1n

1iin 1y

∑ ≠≠=∑−i j

kjik nk1,k0yy

yij 0 veya 1 tamsayı,

∑∑=i j

ijij y.czenk

Page 29: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

29

Örnek 3: Eşleşme Problemi (Matching Problem): [Bütünüyle 0-1 Tamsayılı Model]

Bir yönetici emrindeki 14 kişiyi ikişerli olarak eşleştirerek hepsini birer projede görevlendirmeyi istemektedir. Kişilerin birbirleriyle uyumlu çalışmaları projelerin sorunsuz yürümesi açısından önemlidir. Bu nedenle yönetici 14 elemanını proje yetenekleri, daha önceki performansları ve birbirleriyle uyumlulukları açısından değerlendirerek olası bütün ikili eşleşmeler için 10 ile 100 arasında puanlar vermiştir. (Puanlamada 100 en yüksek uyumu, 10 en düşük uyumu simgelemektedir ve değerler Lingo model yazımında verilmiştir).Toplamda en büyük uyumu sağlayacak şekilde kimlerin eşleşmesi gerektiğini bulacak karar modelini yazınız.

yij: Kümedeki i. ve j. elemanların eşleşmesi hali (1 ise eşleşiyorlar, 0 ise eşleşme yok)cij: i ile j’nin eşleşmesi halindeki uyum puanı, olmak üzere genel model üstteki gibidir.

MODEL:! 14 Elemanlı Eşleşme Problemi;

sets: Urun / 1..14/; iliski (Urun,Urun): c,y;endsets

min=@sum(iliski(i,j)|i#lt#j:(c(i,j)*y(i,j)));

@for(urun(i):@SUM(urun(j)|i#lt#j:y(i, j))+@SUM(urun(j)|i#gt#j:y(j, i))=1);

@FOR(iliski(i,j)|i #lt# j : @BIN(y(i,j)));

data:c=0 84 93 19 88 97 27 90 65 54 50 48 67 7184 0 45 45 41 37 92 77 34 88 11 82 64 5593 45 0 34 30 60 43 80 25 95 69 93 15 8619 45 34 0 29 36 40 75 57 63 73 12 76 9188 41 30 29 0 22 46 90 39 55 75 81 87 6197 37 60 36 22 0 12 70 62 77 82 93 33 9127 92 43 40 46 12 0 67 67 37 81 78 15 7190 77 80 75 90 70 67 0 58 86 61 71 30 4765 34 25 57 39 62 67 58 0 14 50 36 68 9954 88 95 63 55 77 37 86 14 0 14 87 86 7350 11 69 73 75 82 81 61 50 14 0 59 48 7348 82 93 12 81 93 78 71 36 87 59 0 33 5667 64 15 76 87 33 15 30 68 86 48 33 0 5271 55 86 91 61 91 71 47 99 73 73 56 52 0;

enddata

END

∑ ==∑+< >ji ji

jiij n1,...,i1yy

yij 0 veya 1 tamsayı,

∑ ∑=<i ji

ijij y.czenb

Page 30: LINDO Kullanım Kılavuzu

Hazırlayanlar: Aydın Sipahioğlu, Tuğba Saraç. Eskişehir Osmangazi Üniversitesi, Endüstri Müh. Bölümü.

30

Örnek 4: Tahminleme Problemi (Forecasting Problem): [Doğrusal Olmayan Model]

Bir araştırmacı firmasındaki satışların aylara göre değişimini incelediğinde x’ler ayları ve y’ler satış miktarlarını göstermek üzere, y=a.xb

ilişkisinin kurulabileceğini anlamıştır. Eşitliğin her iki tarafında logaritma alındığında bu ilişki log(y)=log(a)+b*log(x) şeklinde de ifade edilebilmektedir. Araştırmacı geçmiş dönemlere ait 10 veriyi kullanarak, verileri en az hata ile temsil edecek a ve b parametrelerinin değerlerini belirlemeyi istemektedir. Gerekli karar modelini kurunuz.

Aylar Tmz.01 Ağs.01 Eyl.01 Ekm.01 Ksm.01 Ara.01 Ock.02 Şbt.02 Mrt02 Nsn.02X 1 2 3 4 5 6 7 8 9 10Satışlar 156 330 480 1209 1756 2000 2512 2366 2942 2872

xi: i. ayı gösteren değeryi: i. aya ait satış değeria, b: Eğriye ait şekil parametreleri,hi: i. döneme ait gerçek veriyle tahmin arasındaki hata değeri, olmak üzere genel model üstteki gibidir.

MODEL:! 10 Dönemli Satış Tahminleme Problemi;

sets: Donem / 1..14 /: x,y,hata; Parametre / a, b/ ; endsets

min=@sum(donem:hata ^ 2);

@for(donem:hata=@log(y)-@log(a)-b*@log(x));

@free(a);@free(b);@for(donem:@free(hata));

data:x= 1 2 3 4 5 6 7 8 9 10 ; y= 156 330 482 1209 1756 2000 2512 2366 2942 2872 ; enddata

END

n1,..,i)log(.)log()log( =−−= iii xbayh

a, b, hi serbest değişken,

∑=

=n

iihenk

1

2z