GAMS GAMS de karakterlerin büyük, ya da küçük olması önemli değildir; Her komut «;» ile bitmelidir; Her komut kullanılırken, o komuta verilen değerler (elemanlar) önceden tanımlanmalıdır; GAMS, diğer programlama dilleri gibi bir takım ayrılmış sözleri kullanmaya özen gösteriyor. Böyle ki, GAMS metini satır -satır okur, bu sözleri arar ve onlara göre hareket eder;
Bazı komutlar ilk satırlarda tanımlanır ve sonunda “s” olup olmaması komutun anlamını değiştirmez. Örneğin, “SET” veya “sets”. Bu komut kümeyi tanımlar ve “set”, “SET”, “sets”, “SETS” gibi yazılmasından etkilenmez; Komutlar her biçimde yazılabilir. Yani, her satırda birkaç komut veya her komut bir satıra yazılabilir; Boşluk veya alanların numaralanması GAMS de önemli değildir;
Tek bir komut aynı tip bir veya daha fazla elemanları belirlemek ve tanımlamak için geçerlidir. Komutların isimlerini tekrarlamağa ihtiyaç yoktur; Dokümantasyon bilgileri GAMS koduna dâhil edilir. Bu her satırın başına “*” işareti yazarak gerçekleşe bilir. Baştaki “*” işareti o satırdaki yazıları veya komutu ignore ediyor, yani aktif olmayacak şekle getiriyor. “*” işareti kaldırılarak komut aktif hale getirile bilir. Diğer komutlar da tanımlanan komutların içine gömülebilir. Örneğin: set, scalar, parameter, table, equation, model;
Elemanlar komutlarla tanımlanır Elemanlar komutlarla tanımlanır. Bu tanımlama (scalar, papameter, matrix,..) onların GAMS de kullanılması için geçerli bir dönüşüme uğraması anlamına gelir; GAMS elemanları için geçerli adlar harfle başlamalı ve 9 harf veya rakamdan oluşmalıdır.
SET (SETS) GAMS de “set” veya “sets” adı ile tanımlanan komut, indisleri tanımlamak, kümeleri ve onların mümkün değerlerini tanımlamak için kullanılır: SETS 𝑖 fabrika sayısı / 𝑝 1 , 𝑝 2 / 𝑗 market sayısı / 𝑚 1 ∗ 𝑚 3 /;
𝑖 𝑣𝑒 𝑗 indislerinin değerleri “/ /” işaretleri arasında gösterilir 𝑖 𝑣𝑒 𝑗 indislerinin değerleri “/ /” işaretleri arasında gösterilir. " 𝒎 𝟏 ∗ 𝒎 𝟑 " ifadesindeki “*” işareti ise 𝑚 1 ile 𝑚 3 arasındaki tüm değerleri ifade ediyor. Yani, /𝒎 𝟏 ∗ 𝒎 𝟑 / ⇔ / 𝒎 𝟏 , 𝒎 𝟐 , 𝒎 𝟑 / anlamına geliyor ve komut “;” işareti ile bitiyor. Kümeler, sabit küme anlamına geliyor. Bu şekilde tanımlanan kümeler programın icrası boyunca hiç değişmez. GAMS de statik kümenin elemanlarını içeren dinamik küme de tanımlamak mümkündür. Dinamik kümenin elemanları program boyunca değişebilir.
Örneğin, GAMS de ağ modelinin düğüm noktalarını içeren kümenin tanımlanmasında kümeyi ikiboyutlu şekilde göstere biliriz: SETS N set of nodes / 𝑁 1 ∗ 𝑁 4 / MAP (N,N) mapping set of N / 𝑁 1 . 𝑁 2 , 𝑁 1 . 𝑁 3 , 𝑁 2 . 𝑁 4 , 𝑁 3 . 𝑁 4 / Bu 4 düğüm noktalı ve 4 geçişli bir ağ sistemi için yazılan koddur. N2 N1 N4 N3
Burada düğümleri “N” ve “N” olarak tanımladık Burada düğümleri “N” ve “N” olarak tanımladık. Başka şekilde, ALIAS (N,NP) ; veya IF (NP $ MAP (N,NP),…,); gibi de göstere biliriz. Bunu “IF” operatörünü anlatınca daha net göreceyiz. “ALIAS” komutu da aynı kümedeki elemanların, farklı adlandırılsa bile aynı anlama geldiğini, aynı işlemi ifade ettiğini gösteren komuttur.
GAMS de kümeleri düzenlemek için 4 geçerli operatör vardır:card, ord, +, -, Örnek üzerinde bu operatörleri açıklayalım: A1 / Salı, Çarşamba, Cuma, Perşembe / A2 / Pazar, Perşembe, Cumartesi, Cuma / A3 / Çarşamba, Cuma, Cumartesi, Pazartesi /; olsun. A1 kümesi için operatörler aşağıdaki gibi kullanılır:
Bu örnekte A1 kümesi sıralanmış kümedir, çünkü onun elemanları daha önceden tanımlanmıştır. A2 kümesi sıralanmış küme değil, çünkü “Perşembe” ve “Cuma” arasındaki durum, A1 de tanımlanmış durumdan farklıdır. Burada card (A1) – A1 kümesinin eleman sayısını gösteriyor, Ord - elemanın kümedeki yerini gösteriyor, +1 veya -1 kümenin her hangi bir elemanını ele aldığımızda ondan önceki veya sonraki elemanı kullanmak gerektiğini gösteriyor,
SKALARLAR GAMS’de skalarlar kesin olarak belirlenir. Scalar veya scalars adı altında kullanmak üzere seçilmiş bir değerin atanmasında kullanılır. scalar f nakliye (her ton ve km. başına) / 0.09 /; Burada her ton, km. başına düşen nakliye fiyatının 0.09 dolar olduğu belirtilir. Bu değer / / işaretleri arasında gösterilir ve sonuna ; işareti konur.
PARAMETRELER ve TABLOLAR. GAMS’de parametreler ve tablolar, 2 veya daha büyük boyutlarda verilen verilerin tanımlanması için kullanılır. Parametreler ve tablolar, bir boyutlu dizilerin tanımlanması hariç, birbirinin aynısıdır. Bu durumda tek parametrenin yapılanmasına izin veriliyor. Bunları araştıralım: Parameter veya parameters vektörlerin veya verilerin tanımlanması için kullanılır. Genellikle, vektör veya verilere değer atanması için kullanılır.
Parameter a(i) i. Fabrikanın kapasitesi (tonla) /p1 300 p2 500 / ; Bu örnekte a(İ) parametresi i kümesinin elemanlarını tanımlıyor. P1 ve p2 küme elemanlarına 300 ve 500 değerlerini atıyor. Bu atamalar da / işaretleri arasında gösterilir ve sonuna ; işareti konulur.
Mümkün indislerin seçilmiş sıralaması ve onlara ilişkin değerler (parametre değerleri) / işaretleri arasında yazılır ve , ile bir birinden ayrılır. İndis değeri, her hangi sıra ile verile bilir. Parametreler için varsayılan değer “0” r. Bu nedenle 0’dan farklı değerler de ala bilir. GAMS otomatik olarak verilen indis değerleri ile küme değerlerini denetler. Başka değimle, GAMS ilgili yanlışları ortaya çıkarıyor (denetliyor).
Önceden tanımlanmış fonksiyonu matris olarak tanımlamak için de parameter komutunu kullana biliriz. Örneğin: Parameter c(i,j) (ton başına taşıma ücreti, dolar olarak) / p1.m1 0.180 P2.m1 0.225 P1.m2 0.144 P2.m2 0.108 P1.m3 0.162 P2.m3 0.126 /;
Tables Veri matrisi GAMS’te tablo veya ikiboyutlu parametre şeklinde tanımlana bilir. Tablo şeklinde tanımlanma table veya tables komutu ile gerçekleşiyor. Tables iki veya daha fazla indis kullanılırken tanımlana bilir. Komut, tablonun isminden sonra yazılır:
Table d(i,j) (mesafe km.)
Bu örnekteki matris, d(i,j) i ve j indislerinin kullanımı ile tanımlanır. Elemanlar kümesinin her kesişimi ve tabloda değerleri sırası ile verilir: p1.m1, p1.m2 , p1.m3, p2.m3 ve 2.0, 1.6, 1.8, 2.5, 1.2, 1.4 Verilerin tablo, matris veya parametre olarak tanımlanması eşdeğerdir. Başka örneğe bakalım: iki veya daha fazla kümenin içerdiği tabloya bakalım. Varsayalım ki, farklı özelliklere sahip insanlardan oluşan tabloya ihtiyacımız var (din, ırk ve eğitim) .
Sets re din çeşitleri / re1. re3 / sl eğitim seviyesi /sl1 Sets re din çeşitleri / re1*re3 / sl eğitim seviyesi /sl1*sl2 / ra ırk çeşidi / ra1*ra4 / ; table c (re, sl, ra) bu özelliklere sahip insan sayısı
Display c; Tabloyu açık şekilde yazarsak, ra1 ra2 ra3 ra4 re1.sl1 2.000 4.000 10.000 2.000 re1.sl2 3.000 9.000 7.000 8.000 re2.sl1 2.000 4.000 10.000 2.000 re2.sl2 3.000 9.000 7.000 8.000 re3.sl1 6.000 2.000 5.000 7.000 re3.sl2 3.000 9.000 7.000 8.000
GAMS’de atama kuralları Matematiksel ifadelere değerler atanması için aşağıdaki kurallara uymak gerekiyor: Vektör veya matrislere değerlerin atanması, elemanların tamamı için değerlerin yazılması veya döngülerin kullanılması ile yapıla bilir. 𝑐 𝑖𝑗 matrisinin değerinin 3 olduğunu aşağıdaki gibi göstere biliriz: C(i,j)=3
ATAMALARDA MATEMATİKSELKURALLARIN İFADESİ. Belirli indislere belirli değerlerin atanması için ‘ ‘ işareti kullanılır. C(‘P1’, ‘m1’)=0,180; Skalar, parametre ve tablolara birden fazla değer atana bilir. Yeni değer eski değeri geçersiz yapar. Matematiksel ifadelere standart matematiksel fonksiyonlar ve işlemler dahil edile bilir. Aşağıdaki tabloda mevcut matematiksel fonksiyonlar yer alıyor.
Örneğin, modelde xi vektörünün rassal değeri "∀ 𝑖= 1,10 ∪(0. 1,0 Örneğin, modelde xi vektörünün rassal değeri "∀ 𝑖= 1,10 ∪(0.1,0.5) dağılımından elde edilir” ifadesinin kodu aşağıdaki gibi yazılır: Set i /i1*i10/; Parameter x(i); X(i)=uniform (0.1)*0.5
abs (x) Mutlak değer x; 𝑥 Arctan (x) Arctan (x) fonksiyonu Cos(x) cos (x) fonksiyonu sin(x) sin (x) fonksiyonu Sqrt (x) 𝑥 fonksiyonu Sqr (x) 𝑥 2 fonksiyonu Sign (x) İşaret fonksiyonu. 𝑥= 1, 𝑥>0, 0, 𝑥=0, −1, 𝑥<0,
Log (x) X’in doğal (naturel) logarirması Log 10 (x) X’in onluk logaritması Exp (x) Exponensial fonksiyon. 𝑒 𝑥 Power (x,y) Üstel fonksiyon 𝑥 𝑦 Floor (x) X’ ten büyük eşit en büyük tam sayı Ceil (x) X’ ten büyük eşit en küçük tam sayı Mapval (x) Eşleştirme fonksiyonu Normal (x,y) Ortalaması x, standart sapması y olan rassal değer Uniform (x,y) U(x,y) dağılımındaki rassal sayı
Errorf (x) N(0,1) normal dağılımı için birikimli dağılım fonksiyonu Max ( 𝑥 1 , 𝑥 2 ,…..) Sıralı değerlerin en büyüğü Min ( 𝑥 1 , 𝑥 2 ,…..) Sıralı değerlerin en küçüğü Mod (x) x/y den elde edilen kalık (kalan) X**y 𝑥 𝑦 üstel fonksiyonu (y pozitiv) Round (x) X’in tam sayıya yuvarlanması Round (x,y) X’in y’nin ondalık basamağına göre yuvarlanması
DEĞİŞKENLER. GAMS’de değişkenler aşağıdaki gibi tanımlanır: Variables X(i,j) i. Fabrikadan j. Markete taşınacak ürün miktarı Z toplam taşıma ücreti Variable veya variables ile tanımlanan komut, optimizasyon değişkenlerini göstermek için kullanılır.
GAMS’de x(i,j) değişkenlerinin alt sınırı xij >= 0 gibi tanımlanır GAMS’de x(i,j) değişkenlerinin alt sınırı xij >= 0 gibi tanımlanır. Bu durumda değişkenin boyutunu belirtmeğe gerek kalmıyor, çünkü daha önce bu işlem yapılmış oluyor. Değişkenler aynı zamanda free (sınırsız), binary, integer , negative gibi de gösterile bilir. Amaç fonksiyonunu temsil eden değişken her zaman “free” olarak tanımlanmalıdır. Değişkenler için geçerli olan çeşitler aşağıdakilerdir:
GAMS’de kullanılan değişkenlerin alt ve üst sınırları belirlenir GAMS’de kullanılan değişkenlerin alt ve üst sınırları belirlenir. Örneğin, 2.0≤𝑟≤5.0 ifadesi GAMS’de aşağıdaki gibi tanımlanır: Positive variable r; r.lo= 2.0; r.up= 5.0; Burada lo alt sınırı, up üst sınırı belirtiyor. Aşağıdaki komut, tam sayılı i değişkeninin (100 ile 1000 arasında değişen) üst sınırını belirler:
İnteger variable i; Up = 1000 ; Alt ve üst sınır değerleri aynı (benzer) olan değişkenler için fx komutu kullanılır. Örneğin, Yi = 3.0 her i için ifadesi GAMS’de y.fx(i)=3.0; gibi gösterilir.
Belirtelim ki, GAMS’de vektörlerin (matrisin)tüm bileşenleri için aynı değerin atanması, aşağıdaki şekilde gerçekleşe bilir: Sij matrisi için Sij ---- 3.0 ( her i ve her j için) işlemi GAMS’de s.l (i,j)=3.0; şekilde yapılıyor. Buradaki l komutu, başlangıç nokta için belirtilen değerin kullanılmasını temin eder. Burada başlangıç değer 3 ‘r.
DEKLEMLER. Equations komutu GAMS’de geniş anlamda kullanılıyor. Denklemlerden başka, tanım ve kısıtlamalar da bu komutla tanımlanır. Equation ve equations komutu ele alınan problemin kısıtlarını ifade etmek için kullanılır. =e= “ eşittir” anlamına gelir, =l= “küçük eşit” anlamına gelir, =g= “büyük eşit” anlamına gelir.
EQUATIONS Cost amaç fonksiyonu Supply (i) i. Fabrikanın kapasitesi Demand (j) j. Marketin talebi ; Cost.. z =e= sum((i,j), c(i,j)*x(i,j)) ; Supply.. sum (j, x(i,j) ) =l= a(i); Demand.. sum (i, x(i,j)) =g= b(j);
sum (i, x(i,j)) ifadesi 𝑖 𝑥 𝑖𝑗 prod (i, x(i,j)) ifadesi 𝑖 𝑥 𝑖𝑗 demektir. Supply.. sum (j, x(i,j) ) =l= a(i); ifadesi açık şekilde aşağıdaki gibi gösterilir (i=1,2 ): Supply.. sum (j, x(‘p1’,j) ) =l= a(‘p1’); Supply.. sum (j, x(‘p2’,j) ) =l= a(‘p2’);
MODEL MODEL komutu model ve çözümleri kapsayan denklemleri (ifadeleri) içeriyor. Model komutu problemin önceden tanımlanmış tüm denklemlerini içeriyor. Model transport /all/; Açık şekilde Model transport /cost, supply, demand/;
Eğer modelde problemi içeren tüm denklemlerin yer almasını istemiyorsak, bunu aşağıdaki şekilde göstere biliriz: Model transport1 “ demand constraint not included “ /cost, supply/;
ÇÖZÜCÜLER GAMS’de Solve (çözücü) komutu problemi formüle eden çözücüleri düzenlemek için kullanılır. Solve transport using lp minimizing z ; Bu bir taşıma probleminin çözümlenmesinde z değişkenini minimize etmek için lineer programlama çözücüsü kullanılsın anlamına geliyor.
GAMS de çeşitli problemlerin çözülmesi için aşağıdaki çözücüler kullanılır: Lp - doğrusal programlama Nlp – doğrusal olmayan programlama Dnlp – kesikli türevli doğrusal olmayan programlama Mip – karma tam sayılı programlama Rmip- genişletilmiş (relax)karma tam sayılı programlama
Minlp - karma tam sayılı doğrusal olmayan programlama Rminlp- genişletilmiş karma tam sayılı doğrusal olmayan programlama Mcp – karışık tamamlayıcı problemler Mpec – denge sabitleri ile matematiksel problemler Cns – kısıtlı doğrusal olmayan sistemler.
GAMS’de bazı eklerin modelleme ekleri ile birleşimi, problem ve çözümü için yararlı bilgiler sağlamaktadır. Kayda değer birkaç eklenti gösterelim: Modelstat - modelin statüsünü, Solvestat – çözücünün statüsünü, Resusd – çözücünün harcadığı zamanı gösteriyor.
KOŞULLU İFADELER ($ ; IF) Koşullu ifadeler “$” işareti verilen kümenin uygun alt kümelerini üretmek için kullanılır. Demand (j) $ ( ord (j gt 1.. sum (i, x(i,j)) =g= b (j); $ (ord (j) gt 1 ) ifadesi, sıra numarası 1’den büyük olan elemanların gruba dahil edilmesinin gerektiğini belirtir. Aşağıdaki komutu inceleyelim: Supply (i) .. sum (j $ (ord (j) lt card (j)), x(i,j)) =l= a(i) $ (ord (i) eq 1); Bu komut, i=1 ‘den sonraki i’leri yok say demektir.
Bu arada lt - < le - <= eq - = ne - >< ge - >= gt - > işaretlerini ifade eder.
IF komutu “If” komutunu da $ gibi ifade ede biliriz. Örneğin, C(‘p2’ , ‘m1’) $ (z.1 ge 70) = 0.01; bu If (z.1 ge 70, c (‘p2’ , ‘m1’)= 0.01); şeklinde de gösterile bilir. Yani, eğer z(1)>= 70 ise, c (i=2, j=1) = 0.01 demektir.
DİNAMİK KÜMELER GAMS’in güçlü özelliklerinden biri de dinamik kümelerin tanımlanmasıdır. Dinamik kümeler önceden tanımlanmış statik kümelerin alt kümelerini tanımlamak için kullanılır. Bu değişkenin değerini, parametreler, tablolar ve denklemler belirler, her zaman güncelleşir ve değişebilirler.
S(k) $ (ord(k) eq card(k))= yes; Matematikte GAMS’de 𝑘= 𝑎,𝑏,𝑐 𝑠⊆𝑘 S= 𝑎,𝑏,𝑐 S=∅ S(k) = 𝑐 ; S= 𝑏,𝑐 Set k / a,b,c / S(k); S(k) = yes ; S(k) = no ; S(k) = no S(k) $ (ord(k) eq card(k))= yes; S(k) $ (ord(k) gt 1)= yes ;
A= 𝑎 1 , 𝑎 2 , 𝑎 3 , 𝑎 4 , 𝑎 5 𝑏⊆𝐴 , b= 𝑎 1 , 𝑎 2 , 𝑎 5 𝐶⊆A , C= 𝑎 2 , 𝑎 3 , 𝑎 5 𝑏∪𝐶= 𝑎 1 , 𝑎 2 , 𝑎 3 , 𝑎 5 𝑏∩𝐶= 𝑎 2 , 𝑎 5 Set A static set /a1*a5/; Set B(A) subset /a1,a2,a5/; Set C(A) subset / a2, a3,a5/; Set UN(A) dynamic subset; UN (A)= B(A)+C(A); Set IN(A) dynamic subset; IN (A)=B(A)*C(A);
DÖNGÜLER GAMS de döngüleri ifade eden komutlar aşağıdakilerdir: LOOPS WHILE Bu komutu örnek üzerinde açıklayalım:
SET K /1*3/ DYN (K); PARAMETER m(K) the slope of C2 ; m(‘1’)=1; POSITIVE VARIABLES X1, X2 ; FREE VARIABLE Z; X1.up=3; EQUATIONS COST C1 C2(K) C4 C6;
COST.. Z=3*X1+X2; C1.. -X1+X2 =L= 2; C2(DYN) .. X1+m(DYN)*X2 =L=6; C4 .. 2*X1-X2 =L=4; C6 .. –X1-X2 =L= -1; Model exchap4 /all /; Loop (K, DYN (K) = yes; Solve exchap4 using lp maximizing Z; m(K+1)=m(K)+1; ); Açıklaması: C 1.. –X1+X2 =L= 2; C4 .. 2*X1-X2 =L= 4; C6 .. -X1-X2 =L= -1;
K=1 için C2 (1) .. X1+X2 =L= 6; K=2 için C2 (2) .. X1+2*X2 =L=6; K=3 için C2 (3) .. X1+3*X2 =L= 6;
TAŞIMA PROBLEMİ Taşıma problemi, verilen koşullar altında yüklerin başlangıç noktalardan varış noktalarına en kısa zamanda taşınması şeklindeki problemleri kapsar. Problemin genel şekildeki matematiksel modeli aşağıdaki şekilde verilir:
Veriler: m : başlangıç noktalar sayısı, n: varış noktalar sayısı ui : i. Başlangıç noktasındaki yükleme miktarı vj : j. Varış noktasındaki alım miktarı cij : i. Başlangıçtan j. Varış noktasına gönderilen ürünün birim maliyeti
DEĞİŞKENLER: (karar değişkeni) Xij : i. Başlangıç noktasından j. Varış noktasına olan sevk miktarı 𝑋 𝑖𝑗 ≥0 𝑖=1,…𝑚 𝑗= 1,…𝑛
KISITLAR: 𝑗 𝑥 𝑖𝑗 = 𝑢 𝑖 𝑖=1,..𝑚 𝑖 𝑥 𝑖𝑗 = 𝑣 𝑗 𝑗=1,..𝑛
AMAÇ FONKSİYONU 𝑧= 𝑖 𝑗 𝑐 𝑖𝑗 𝑥 𝑖𝑗 → 𝑚𝑖𝑛
ÖRNEK: Bu taşıma probleminde 3 başlangıç ve 3 varış noktası olsun (n=3, m=3) ve 𝑢 1 =2, 𝑢 2 =3, 𝑢 3 =4 𝑣 1 =5, 𝑣 2 =2, 𝑣 3 =2
U1 U2 U3 𝑥 11 𝑥 12 𝑥 13 𝑥 21 𝑥 22 𝑥 23 𝑥 31 𝑥 32 𝑥 33 V1 V2 V3
𝐶𝑋= 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 = 𝑥 11 𝑥 12 𝑥 13 𝑥 21 𝑥 22 𝑥 23 𝑥 31 𝑥 32 𝑥 33 = 2 3 4 5 2 2
Amacımız taşıma maliyetlerini minimize etmek olduğu için: 𝑚𝑖𝑛 𝐶= 1 2 3 2 1 2 3 2 1 ; 𝑢= 2 3 4 ; 𝑣= 5 2 2 Amacımız taşıma maliyetlerini minimize etmek olduğu için: 𝑚𝑖𝑛 𝑍= 𝑥 11 +2 𝑥 12 +3 𝑥 13 +2 𝑥 21 + 𝑥 22 +2 𝑥 23 +3 𝑥 31 +2 𝑥 32 + 𝑥 33
SET I / I1*I3/ J / J1*J3/ ; PARAMETERS U(I) / I1 2 I2 3 I3 4/ V(J) / J1 5 J2 2 J3 2/ ; TABLE C(I,J) J1 J2 J3 I1 1 2 3 İ2 2 1 2 İ3 3 2 1 ; VARIABLES Z X(I,J) ; POSITIVE VARIABLE X(I,J) ;
EQUATIONS COST SHIP (I) RECEIVE (J ) ; COST.. Z =e= SUM( (I,J), C(I,J)*X(I,J)) ; SHIP(I).. SUM(J, X(I,J) = e = U(I) ; RECEIVE (J) .. SUM(I, X(I,J) = e = V(J) ; MODEL transport /ALL/; SOLVE transport USING LP MINIMIZING Z ;
Diyet problemi Diyet problemini bir örnek üzerinde açıklayalım: Bir anne çocuklarının kahvaltısı için besin seçmelidir. Kahvaltıda çocuklara süt veya yumurta vermek istiyor. 1 gr. Yumurta 0,10 mg. Yağ, 1,0 mg. Kalsiyum ve 110 kalori 1 gr. Süt 0,25 mg., Yağ 0,25 gr. Kalsiyum ve 120 kalori içeriyor. Bunun dışında, çocukların sağlıklı büyümesi için her sabah 1 mg. Yağ, 5 mg. Kalsiyum ve 400 kalori almaları gerekiyor. 1 gr. Yumurtanın fiyatı 3,8 kuruş, 1 gr. Sütün fiyatı da 4,2 kuruştur.
Anne çocuklarının her sabah yeteri kadar yağ, kalsiyum, kalori almasını ve bunu nasıl ucuza getireceğinin yollarını arıyor. Bu işi dengeli çözmek için lineer programlamaya ihtiyaç duyulur. Problemin modelini oluşturmaya çalışalım ve bunu matematiksel şekilde gösterelim:
1 gr. yumurta 1 gr. süt Talep yağ 0,10 mg 0,25 mg 1 mg kalsiyum 1,00 mg 5 mg kalori 110 120 400 1 gr. maliyeti 3,8 kuruş 4,2 kuruş
Karar değişkenleri: Karar değişkenimizi 𝑥 𝑗 ile gösterelim: 𝑥 1 𝑖𝑙𝑒 𝑎𝑙𝚤𝑛𝑎𝑐𝑎𝑘 𝑦𝑢𝑚𝑢𝑟𝑡𝑎 𝑚𝑖𝑘𝑡𝑎𝑟𝚤𝑛𝚤, 𝑥 2 𝑖𝑙𝑒 𝑎𝑙𝚤𝑛𝑎𝑐𝑎𝑘 𝑠ü𝑡 𝑚𝑖𝑘𝑡𝑎𝑟𝚤𝑛𝚤 𝑖𝑓𝑎𝑑𝑒 𝑒𝑡𝑠𝑖𝑛.
Kısıtlar 0,10 𝑥 1 +0,25 𝑥 2 ≥1 (yağ) 1,00 𝑥 1 +0,25 𝑥 2 ≥5 (kalsiyum) 110, 0 𝑥 1 +120, 0 𝑥 2 ≥400 (kalori) 𝑥 1 ≥0; 𝑥 2 ≥0
Amaç fonksiyonu min 𝑍=3,8 x 1 +4,2 x 2 Dolayısı ile problem, verilen koşulları sağlamakla maliyeti en küçüklemek şeklinde veriliyor.
Bu problemin optimal çözümü: «Anne çocuklarına 60/9 gr Bu problemin optimal çözümü: «Anne çocuklarına 60/9 gr. yumurta, 20/9 gr. süt vermekle kahvaltıyı 26,2 kuruşa getirebilir» şeklindedir. Fakat, bu durumda çocuklar gereken besinleri almakla beraber 755,5 kalori de almış oluyorlar (yani gerekenden 355,5 kalori fazla). Problem maliyeti en küçüklemek olduğu için bunu göze alabiliriz
Genel Şekilde DIYET PROBLEMİ (Diet): Veriler: m : besin sayısı, n: farklı gıda sayısı, aij : j. Gıdadaki i.besin miktarı, bi : i. besinin min. Kullanım miktarı, cj : j. Gıdanın birim maliyeti.
Karar değişkeni ve Kısıtlar Xj : alınan j. Gıda miktarı 𝑗 𝑎 𝑖𝑗 𝑥 𝑗 ≥ 𝑏 𝑖 𝑖=1,..𝑚 𝑥 𝑗 ≥0 ; 𝑗=1,….,𝑛
AMAÇ FONKSİYONU 𝑧= 𝑗 𝑐 𝑗 𝑥 𝑗 → 𝑚𝑖𝑛 𝑧= 𝑗 𝑐 𝑗 𝑥 𝑗 → 𝑚𝑖𝑛 Buradaki 𝑐 𝑗 j. Gıdanın birim maliyetidir.
ÖRNEK: Bu diyet probleminde verilen parametreler:
𝐴𝑋= 78.6 70.1 80.1 67.2 77.0 6.50 9.4 8.80 13.7 30.4 0.02 0.09 0.03 0.14 0.41 0.27 0.34 0.30 1.29 0.86 𝑥 1 𝑥 2 𝑥 3 𝑥 4 𝑥 5 ≥ 74.2 14.7 0.14 0.55 𝑥 1 , 𝑥 2 , 𝑥 3 , 𝑥 4 , 𝑥 5 ≥0
Amacımız satın alma maliyetlerini minimize etmek olduğu için: 𝑚𝑖𝑛 𝑍= 𝑥 1 +0,5 𝑥 2 +2 𝑥 3 +1,2 𝑥 4 + 3𝑥 5 Sonuç: 𝑧=0,793
Problemin GAMS kodu $ title DIET problem ** I besin indisi ** J Gıda indisidir SET I / I1*I4/ J / J1*J5/ ; PARAMETERS B(I) / I1 74.2 I2 14.4 I3 0.14 I4 0.55/ C(J) J. Gıdanın birim maliyeti / J1 1 J2 0.5 J3 2 J4 1.2 J5 3/ ;
𝑍 𝑜𝑝𝑡 =0.793 𝑋= 0, 1.53, 0, 0.023, 0 𝑇 TABLE A(I,J) J1 J2 J3 J4 J5 VARIABLES Z X(J) ; POSITIVE VARIABLE X(J) ; EQUATIONS COST NUTFOOD (I) COST.. Z =e= SUM( (J), C(J)*X(J)) ; NUTFOOD(I).. SUM(J, A(I,J) *X(J) =G= B(I); MODEL DIET /ALL/; SOLVE DIET USING LP MINIMIZING Z ; 𝑍 𝑜𝑝𝑡 =0.793 𝑋= 0, 1.53, 0, 0.023, 0 𝑇
Ağ problemi Veriler G : G=(N,A) ağ taşımasını tanımlayan graftır. Burada N düğüm kümesi, A ise bağlantı kümesidir. n: ağdaki düğüm sayısı fi : i. Düğümden geçen akışlar (+ ise düğüme gelen, - ise düğümden çıkan) mij : i. Düğümden j. Düğüme akış kapasitesi cij : i. Düğümden j. Düğüme gönderim maliyeti
DEĞİŞKENLER: (karar değişkeni) ve Kısıtlar 𝑥 𝑖𝑗 : i. Düğümden j. Düğüme akış miktarı 𝑗 𝑥 𝑖𝑗 − 𝑥 𝑗𝑖 = 𝑓 𝑖 𝑖=1,..𝑛 (1) Tüm düğümlerden akış kontrol ediliyor ve kapasite aşılmıyor. −𝑚 𝑖𝑗 ≤ 𝑥 𝑖𝑗 ≤ 𝑚 𝑖𝑗 ∀𝑖<𝑗 (2)
AMAÇ FONKSİYONU 𝑧= 𝑖 𝑗 𝑐 𝑖𝑗 𝑥 𝑖𝑗 → 𝑚𝑖𝑛 (3)
ÖRNEK: Aşağıdaki şekilde bir ağ akış problemi verilmiştir. f2 2 1 x12 x24 4 f1 x14 f4 x13 x34 f3 3
Kısıtlar 1 1 1 −1 0 0 0 −1 0 0 0 1 0 0 1 0 0 −1 −1 −1 𝑥 12 𝑥 13 𝑥 14 𝑥 24 𝑥 34 = 𝑓 1 𝑓 2 𝑓 3 𝑓 4 𝑥 𝑖𝑗 ≤ 𝑚 𝑖𝑗 ∀ 𝑖≤𝑗 −𝑥 𝑖𝑗 ≤ 𝑚 𝑖𝑗 ∀ 𝑖≤𝑗 𝑚 𝑖𝑗 =4 olduğu varsayılır, ∀ 𝑖<𝑗 ve 𝑓 1 , 𝑓 2 , 𝑓 3 , 𝑓 4 = 7, −4, −1, −2
Amaç fonksiyonu Z= 𝑖 𝑗 𝑐 𝑖𝑗 𝑥 𝑖𝑗 =𝑥 12 + 𝑥 13 + 𝑥 14 + 𝑥 24 + 𝑥 34 Hem de 𝑐 𝑖𝑗 =1 ∀𝑖,𝑗 olsun. O zaman minimize ettiğimiz fonksiyon : Z= 𝑖 𝑗 𝑐 𝑖𝑗 𝑥 𝑖𝑗 =𝑥 12 + 𝑥 13 + 𝑥 14 + 𝑥 24 + 𝑥 34 oluyor .
Problemin GAMS kodu SET I set of nodes in the network / I1*I4/ CONEX (I,I) set of node connections /I1.I2, I1.I3, I1.I4, I2.I4, I3.I4/; ALIAS (I,J) PARAMETERS F(I) the input or output flow at node I / I1 7 I2 -4 I3 -1 I4 -2/ FMAX (I,J) maximum flow capacity of conduction going from I to J ; FMAX (I,J)=4 VARIABLES Z objective function variable X(I,J) the flow going from node I to node J; X. lo(I,J) := - FMAX(I,J); X. up(I,J) := FMAX(I,J);
EQUATIONS COST objective function BALANCE conservation of flow conditions COST.. Z =e= SUM(CONEX(I,J),X(I,J)) ; BALANCE(I).. SUM(J$CONEX(I,J),X(I,J))- SUM(J$CONEX(J,I),X(J,I)) = e = F(I) ; MODEL network /ALL/; SOLVE network USİNG LP MINIMIZING Z Z=5, 𝑥 12 =0, 𝑥 13 =3, 𝑥 14 =4, 𝑥 24 =−4, 𝑥 34 =2
Portföy problemi Önce problemle tanışalım: 𝐴 𝑖 hisse senetleri olsun ve bir yatırımcı da bu hisse senetlerinin 𝑏 𝑖 hissesine sahip olsun. (i=1,…m) Bu hisse senetlerinin mevcut fiyatı 𝑣 𝑖 olsun. Varsayalım ki, alındığı tarihten 1 yıl sonra bu hisse senetlerinin getirisi di, yeni fiyatları da wi olacaktır. Amacımız geliri maksimize etmek için hisse senetlerinin sayısını ayarlamaktır. 𝑥 𝑖 değişkeni 𝐴 𝑖 hisse senetleri sayısındaki değişimi göstersin. O zaman elimizde olan 𝑏 𝑖 hissesi ayarlamadan sonra 𝑏 𝑖 + 𝑥 𝑖 olacaktır.
Veriler: 𝐴 𝑖 – 𝑖. Stok (hisse senedi) 𝑖=1,..m m – stok sayısı (yatırım aracı) 𝑏 𝑖 – 𝑖 hisse senedinin elimizde olan miktarı 𝑣 𝑖 - 𝐴𝑖 nin şimdiki değeri (fiyatı) 𝑑 𝑖 - alındığı tarihten 1 yıl sonra 𝑖. hisse senedinin getirisi (kar) 𝑤 𝑖 - 𝐴𝑖 nin 1 yıl sonraki değeri (fiyatı) 𝑟 – değişim sonrası portföyün vazgeçilmeyecek hissesi 𝑠 – enflasyona ayak uydurmak için, hisse senetlerinin gelecek toplam değerinin, şimdiki toplam değerinin belli bir katının üzerinde olmasını gösteren değer (kesir).
DEĞİŞKENLER: (karar değişkeni) ve Kısıtlar 𝑥 𝑖 – 𝑖. Stokun elimizdeki miktarının ne kadar değişeceğini gösteren sayı 1. Hisse senedi ne kadar değişirse değişsin, gelecekteki toplam miktar negatif olmasın: 𝒙 𝒊 + 𝒃 𝒊 ≥𝟎 veya 𝒙 𝒊 ≥− 𝒃 𝒊 2. Bu kısıt tek bir stoka yatırım yapmasını engellemek içindir. Bunun için her bir hisse senedinin gelecekteki miktarının şimdiki fiyata göre değerinin, toplam hisse senetlerinin şimdiki değerlerinin belli bir katının üzerinde olmasını talep etmektedir. Yani, 𝒓 𝒊 𝒗 𝒊 𝒃 𝒊 + 𝒙 𝒊 ≤ 𝒗 𝒋 𝒃 𝒋 + 𝒙 𝒋 ℎ𝑒𝑟 𝑗 𝑖ç𝑖𝑛
𝑖 𝑣 𝑖 𝑏 𝑖 + 𝑥 𝑖 = 𝑖 𝑣 𝑖 𝑏 𝑖 + 𝑖 𝑣 𝑖 𝑥 𝑖 3. 𝒊 𝒗 𝒊 𝒙 𝒊 =𝟎 Şimdiki fiyata göre değişmiş miktarların toplam değeri aşağıdaki gibi olacaktır. 𝑖 𝑣 𝑖 𝑏 𝑖 + 𝑥 𝑖 Burada 𝑖 𝑣 𝑖 𝑏 𝑖 + 𝑥 𝑖 = 𝑖 𝑣 𝑖 𝑏 𝑖 + 𝑖 𝑣 𝑖 𝑥 𝑖 Bu kısıt yatırım için ek para harcanmamasını ön görmektedir. Dolayısı ile 𝒊 𝒗 𝒊 𝒙 𝒊 =𝟎 olacaktır. 4. Enflasyona ayak uydurmak için elimizde olan yatırım araçlarının toplam gelecek değeri (fiyatı), şimdiki toplam değerin en az bir s hissesi kadar fazla olmalıdır. Yani, 𝑖 𝑤 𝑖 𝑏 𝑖 +𝑥 𝑖 ≥ 1+𝑠 𝒊 𝑣 𝑖 𝑏 𝑖
Amaç Fonksiyonu Amacımız toplam karı maksimize etmektir. 𝒊 𝒅 𝒊 𝒃 𝒊 + 𝒙 𝒊 →𝒎𝒂𝒙
ÖRNEK: Elimizde 3 yatırım aracı olsun; A, B, C (m=3 ) ve A hisse senedinden 75 adet, B hisse senedinden 100 adet, C hisse senedinden 35 adet bulunsun. Bu hisse senetlerinin fiyatları da sırası ile 20$ , 20$, 100$ olsun. Ek olarak aşağıdaki bilgiye sahibiz: 1 yıl sonra A senedi kar getirmeyecek ve yeni fiyatı 18$ olacak, B senedi 3$ kar getirecek ve gelecek fiyatı 23$ olacak, C senedi de hisse başına 5 $ kar getirecek ve fiyatı 102$ olacaktır. Yatırımcı tarafından bize verilen değerler: 𝑟=0.25 ve 𝑠=0.03
Kısıtlar: 𝑥 𝐴 ≥−75 𝑥 𝐵 ≥−100 𝑥 𝐶 ≥−35
0.25 20 75+𝑥 𝐴 +20 100+𝑥 𝐵 +100 35+𝑥 𝐶 ≤20 75+𝑥 𝐴 0.25 20 75+𝑥 𝐴 +20 100+𝑥 𝐵 +100 35+𝑥 𝐶 ≤20 100+𝑥 𝐵 0.25 20 75+𝑥 𝐴 +20 100+𝑥 𝐵 +100 35+𝑥 𝐶 ≤20 35+𝑥 𝐶 20 𝑥 𝐴 +20 𝑥 𝐵 +100 𝑥 𝐶 =0 18 75+𝑥 𝐴 +23 100+𝑥 𝐵 +102 35+𝑥 𝐶 ≥1.03∗7000
15 𝑥 𝐴 −5 𝑥 𝐵 −25 𝑥 𝐶 ≥250 −5 𝑥 𝐴 +15 𝑥 𝐵 −25 𝑥 𝐶 ≥−250 −5 𝑥 𝐴 −5 𝑥 𝐵 +75 𝑥 𝐶 ≥−1750 20 𝑥 𝐴 +20 𝑥 𝐵 +100 𝑥 𝐶 =0 18 𝑥 𝐴 +23 𝑥 𝐵 +102 𝑥 𝐶 ≥−10 Sonuç: 𝑧=612.5 $ 𝑣𝑒 𝑥 𝐴 =12.5 ; 𝑥 𝐵 =75; 𝑥 𝐶 =−17.5 Yani, toplam maksimum gelirimiz 612.5 $ olacak. Bunun için A senedinden 12.5 adet, B senedinden 75 adet almak, C senedinden de 17.5 adet satmak gerekecek
Problemin GAMS Kodu $title the portfolio problem SET I set of stocks /A1,A2,A3/; ALIAS(I,J); SCALARS r percentage /0.25/ s percentage /0.03/;
TABLE data(I,*) B V D W * $ $ $ A1 75 20 0 18 A2 100 20 3 23 A3 35 100 5 102; Variables z objective function variable x(I) number of shares of stock I; POSITIVE VARIABLE x(I); x.lo(I)= - data(I,'B');
EQUATIONS COST objective function NOCHANGE no change in the current value INFLATION future value must be 3% greater than the current value BALANCE(I) to avoid excessive reliance on a single stock; COST.. z =E= SUM(I,data(I,'D')*(x(I)+data(I,'B'))); NOCHANGE.. SUM(I,data(I,'V')*x(I))=E= 0; INFLATION.. SUM(I,data(I,'W')*(x(I)+data(I,'B')))=G= (1+s)*SUM(I,data(I,'V')*data(I,'B')); BALANCE(I).. r*SUM(J,data(I,'V')*(x(J)+data(I,'B'))) =L= data(I,'V')*(x(I)+data(I,'B')); MODEL portfolio /ALL/; SOLVE portfolio USING lp MAXIMIZING z;
Sonuç Z=612.5 𝑥 𝐴 =12.5 𝑥 𝐵 =75.0 𝑥 𝐶 =−17.5