Delphi XE5 - Matris İşlemleri Simpleks Algoritmaların Oluşturulması 2. Bölüm
İlk bölümde matris işlemlerine girerek matris oluşturma ve en küçük değer bulmayı yapmıştık. Bu iki kavram Simpleks algoritmalarının çözümü için yeterlidir aslında. Bu yazıda iki sütun bölümünden en küçük olan değerin satır numarasını bulmayı göstereceğim. Simpleks Algoritmaların çözümünün nasıl yapıldığını öğrenmek için ise en aşağıdaki yandex disikimden PowerPoint sunumunu indirebilirsiniz. Daha fazla kaynak internette bulunmaktadır.
Şimdi iki sütun bölümünden en küçük değeri ve bu değerin satır numarasını bulalım buda temelden çıkacak değişkenin bulunması için. Öncelikle StringGrid' lere girdiğimiz değerleri oluşturduğumuz Arrayler'in içine kaydedelim.
Bunun için:
//--değerleri arraye kaydetmek--------
for sütun := 0 to StringGrid3.ColCount-1 do amacfonk[sütun] := StrToFloat(StringGrid3.Cells[sütun,0]);
for i := 0 to StringGrid4.RowCount - 1 do sabitler[i] := StrToFloat(StringGrid4.Cells[0,i]);
for i := 0 to strtoint(edit2.Text) - 1 do
begin
for j := 0 to strtoint(edit3.Text) - 1 do
kısıt[i,j] := strtofloat(stringgrid2.Cells[i,j]);
end;
Bunu yapmadan önce de StringGridler' imizin sütun ve satırlarını önceden belirleyelim. iki adet Edit bileşeni işimizi görecektir. Birincisi sütun sayısını belirtmek diğeri ise satır sayısını belirtmek için. Editlerin change olayına kodları ekleyelim :
procedure TForm4.Edit2Change(Sender: TObject);
begin
StringGrid3.ColCount := StrToInt(edit2.Text);
StringGrid2.ColCount := StrToInt(edit2.Text);
StringGrid1.ColCount := StrToInt(edit2.Text);
StringGrid5.ColCount := StrToInt(edit2.Text);
end;
procedure TForm4.Edit3Change(Sender: TObject);
begin
StringGrid2.rowCount := StrToInt(edit3.Text);
StringGrid4.rowCount := StrToInt(edit3.Text) + 1;
StringGrid1.rowCount := StrToInt(edit3.Text);
StringGrid6.rowCount := StrToInt(edit3.Text) + 1;
end;
Artık istediğimiz kadar değişken ve kısıtla çalışma imkanımız oldu. İstersek 100 kısıtlı bir Simpleks tablo oluşturabiliriz. Sonuçta Array' imizi sıfırdan yüze kadar tanımladık.
Değerlerimizi Array' e kaydettikten sonra artık temelden çıkacak değişkenimizi belirleyebiliriz. Bunun için bir önceki yazıda bulduğumuz amaç fonksiyonundaki en küçük değerin sütun değerini kullanacağız. Amaç fonksiyonundaki en küçük değerin sütun değerini nasıl buluyoruz hatırlayalım.
//--amac fonksiyonundaki en küçük değerin olduğu sütunun bulunması (temele girecek değişken)----
enk := amacfonk[0];
for sütun := 0 to StringGrid3.ColCount - 1 do
if enk > amacfonk[sütun] then enk := amacfonk[sütun];
sütun := 0;
while enk <> amacfonk[sütun] do inc(sütun);
Label1.Caption := 'Temele girecek := ' + floattostr(sütun+1)+ '. Sütun';
Şimdi bu sütun değerini kullanalım ve sabitlerin bu sütunda bulunan kısıt değerlerine bölümünden elde edilen en küçük değerin satır numarasını bulalım:
//--temelden çıkacak değişkenin bulunması--------------
enk := sabitler[1] / kısıt[sütun,0];
for i := 0 to StringGrid2.RowCount - 1 do
if enk > (sabitler[i+1] / kısıt[sütun,i]) then enk := sabitler[i+1] / kısıt[sütun,i];
satır := 0;
while (enk <> (sabitler[satır+1] / kısıt[sütun,satır])) do inc(satır);
Label2.Caption := 'Temelden çıkacak := ' + floattostr(satır+1) + '. Satır';
Sabitlerin ilk değeri amaç fonksiyonumuzun sabiti olduğu için sabitler i+1 den başlayarak kısıtlara bölünmüştür.
Kısaca yaptığımız olay amaç fonksiyonumuzdaki en küçük değer olan -3 değerini bulmak. Ondan sonrada sabitlerimizi bu sütundaki kısıt değerlerine bölüp yine en küçük değeri bulmak yani 15/1 , 12/4 hangisi en küçükse o değeri al. Temelden çıkacak satırı yani değeri bulmuş olduk.
Uygulama şu an sadece birinci Simpleks tabloyu oluşturmakta. Uygulamanın buraya kadarki kısmını Yandex Disk' imden indirebilirsiniz.
Not uygulama şu an tam olarak hazır olmadığı için bir kaç hata olabilir örneğin sayının sıfır'a bölümü olmadığı için floating point zero hatası alabilirisiniz. Sabitlerin sıfır değerine bölünmemesi gerekli o yüzden her simpleks tablo için çalışmayabilir uygulama.
Okuduğunuz İçin Teşekkür Ederim
Hakan UÇAR
İstatistikçi ve Amatör Programcı
İçerikler Tamamen Ücretsiz Olup Özgün Anlatımdır Paylaşırken Kaynak Belirtiniz Lütfen.
Uygulamayı Yandex Diskim'den indirebilirsiniz.
0 yorum:
Yorum Gönder