Soru sorBelli şartlara göre çarpım yaparak matris oluşturma
genetiksavar tarafından 2 yıl önce soruldu

Genetik algoritma üzerinde çalışıyorum, bu yüzden matlab kullanıyorum.Ancak bilgilerim yetersiz kaldığı için yardıma ihtiyacım var.
Örnek üzerinden anlatacağım.
A matrisinin ilk sütununda 2,1,3 yazıyor. Fabrikamda ürettiğim ürünler bunlar. ikinci ürün, birinci ürün ve üçüncü ürün. Bu ürünleri hangi makinenin üreteceğini rastgele belirliyorum. Bunu A matrisinin ikinci, üçüncü ve dördüncü satırlarında görebilirsiniz. Örneğin, A matrisindeki ikinci ürünü 7,2,5 makinede ürettim.
Bu ürünleri her makinede üretebilirim. Ancak süreler ürettiğim makineye göre değişiyor. Süre matrisi B, C, D matrisleridir. 1,2 ve 3. makinede ürettiysem B matrisindeki süreleri kullanırım. 4. ve 6. makinede ürettiysem C matrisindeki süreleri dikkate alırım. 7,8 ve dokuzuncu makinede üretim yaptıysam D matrisindeki zamanları dikkate alıyorum. Bu yüzden aslında makineleri üç gruba ayırdım.
Son olarak, bu var. E matrisinde ne kadar ürün üreteceğimi görebiliyorum. Örneğin, ikinci ürünün 10'unu üreteceğimi E matrisinde görebiliyorum. Ürün adedini ürünlerin üretim süresi ile çarparak toplam üretim süresini bulmak istiyorum.
Örneğin ilk ürün ilk makinede üretilmiştir. Birinci çarpımın süreleri B, C, D matrisinin ilk satırındadır. İlk makinede üretildiği için B matrisinde ilk satırdaki değeri alıyorum. E matrisinde 10 adet ürün üreteceğim diyor. Yani 10'u 0,1 ile çarparak toplam 1 üretim süresi elde ederim.
Başka bir örnek vermek gerekirse, üçüncü ürün üçüncü makinede üretilmiş gibi görünüyor. Üçüncü makinede üretildiği için B grubundaki üçüncü sıranın değerini alıyorum. (Üçüncü ürünün üretim süreleri B,C,D matrisinde üçüncü satırdadır) (0,8 yazıyor)
Ürün sayısı için E matrisindeki üçüncü satıra bakıyorum. (15 yazıyor)
Toplam süreyi bulmak için 0,8 ile 15'i çarpıyorum. 12 değerini alıyorum.
Umarım anlatabilmişimdir. Şimdiye kadar bunu nasıl yapacağımı bulamadım, umarım bir yolu vardır. Örnek matrislerimi aşağıda belirtiyorum.
ilginiz için teşekkürler.
 

A = [2 1 3;

7 1 3;

2 8 6;

5 9 4];

B = [0.1; 0.7; 0.8];

C = [0.4; 0.1; 0.5];

D = [0.6; 0.5; 0.6];

E = [10; 20; 50];

Oluşturmak istediğim yeni matrisin örneği :

new-matrix = [10 1 12; …
14 6 7,5;…
10 6 7.5 ]

12 Cevap
Caglar Yönetici tarafından 2 yıl önce cevaplandı

Merhaba,
Söylediğiniz işlemlerin matrix olarak ifadelerini çıkartabilirseniz, aynı ifadeleri matlab'e girebilirsiniz.

Anlayabildiğim kadarıyla, tarif ettiğiniz şekilde adım adım şöyle yapılabilir:

for urun = 1:1:width(A)
%ucuncu urun ornegi uzerinden gidelim, yani urun = 3,
%" üçüncü ürün üçüncü makinede üretilmiş gibi görünüyor."
makine = find(A(1,:)==urun);
if makine < 4
uretim_suresi = B(makine);
elseif makine < 8
...
end
urun_sayisi = E(makine);
toplam_sure = urun_sayisi *uretim_suresi;

Ancak, bu matrisleri GA'ya nasıl besleyeceksiniz onu tam anlayamadım. Bu matrislerin matlab'in beklediği optimizasyon problemi tanımına uygun olduğuna emin misiniz?

genetiksavar tarafından 2 yıl önce cevaplandı

Aslında matlabın optimizasyon problem tanımına göre yapmıyorum adımları zaten. Çünkü projem çok büyük ve o yetersiz kalıyor. Ben bu matrisleri uygunluk fonksiyonunu hesaplamak için kullanacağım. Ancak kodu kendi koduma uyarladığımda istediğim sonucu elde edemedim.  
kodumda A matrisi ikifazson, ürün sayısı matrisinin ismi ise kalip 
kendi matrisime göre if yapısını da bu şekilde düzenledim ancak hata verdi. run yaptığımda urun hep 1 değerini alıyor.örneğin makine de 51 değerini aldı ama benim 10 makinem var onun da mantığını anlayamadım.
for urun = 1:1:width(ikifazson)
%ucuncu urun ornegi uzerinden gidelim, yani urun = 3,
%" üçüncü ürün üçüncü makinede üretilmiş gibi görünüyor."
makine = find(ikifazson(1,:)==urun);
if makine <= 5
uretim_suresi = faz2onbes(makine);
elseif makine <= 7
uretim_suresi = faz2onyedi(makine);
elseif makine <=8
uretim_suresi = faz2onsekiz(makine);
end
urun_sayisi = kalip(makine);
toplam_sure = urun_sayisi *uretim_suresi;
end

genetiksavar tarafından 2 yıl önce cevaplandı

Aslında matlabın optimizasyon problem tanımına göre yapmıyorum adımları zaten. Çünkü projem çok büyük ve o yetersiz kalıyor. Ben bu matrisleri uygunluk fonksiyonunu hesaplamak için kullanacağım. Ancak kodu kendi koduma uyarladığımda istediğim sonucu elde edemedim.  
kodumda A matrisi ikifazson, ürün sayısı matrisinin ismi ise kalip 
kendi matrisime göre if yapısını da bu şekilde düzenledim ancak hata verdi. run yaptığımda urun hep 1 değerini alıyor.örneğin makine de 51 değerini aldı ama benim 10 makinem var onun da mantığını anlayamadım.
for urun = 1:1:width(ikifazson)
%ucuncu urun ornegi uzerinden gidelim, yani urun = 3,
%" üçüncü ürün üçüncü makinede üretilmiş gibi görünüyor."
makine = find(ikifazson(1,:)==urun);
if makine <= 5
uretim_suresi = faz2onbes(makine);
elseif makine <= 7
uretim_suresi = faz2onyedi(makine);
elseif makine <=8
uretim_suresi = faz2onsekiz(makine);
end
urun_sayisi = kalip(makine);
toplam_sure = urun_sayisi *uretim_suresi;
end

genetiksavar tarafından 2 yıl önce cevaplandı

makine = find(ikifazson(1,:)==urun); 
sanırım bu kodda bir hata var ama nasıl düzeltecegimi bulamadım

Caglar Yönetici tarafından 2 yıl önce cevaplandı

urun for dongusunun kendi degiskeni, nasıl hep 1 degerinde kaliyor olabilir?

uygunluk fonksiyonu fitness-objective fonksiyonu dediğimiz şey mi?

kaç ürün var ve matlab yetersiz kalıyor?

genetiksavar tarafından 2 yıl önce cevaplandı

evet şu an kontrol ettiğimde 69 ürün var ve 69 da kalıyor az önce wrokspacedeki hatadan kaynaklanmış olabilir. şöyle aslında ürünü bulup matrisin alt satırlarında hangi makineye atandıgını bakması gerekirdi sanırım kodla bunu yapamıyorum

genetiksavar tarafından 2 yıl önce cevaplandı

uygunluk fonksiyonu derken genetik algoritmanın adımı olan fitness function u kastetmiştim.

genetiksavar tarafından 2 yıl önce cevaplandı

yetersiz kalıyor derken problemin boyutu çok büyük çok fazla değişken var o yüzden genetik algoritmanın adımlarını tek tek kodlayarak ilerledim. ancak ürünlerin sürelerini hesaplamada problem yaşadım işler sırayla atansaydı problem olmayacaktı ama A matrisindeki gibi işler sıralı değil de random gittiği için benim için sorun haline geldi.

Caglar Yönetici tarafından 2 yıl önce cevaplandı

69 ürün varsa, en son 69'da kalması normal. 1'den başlayarak tek tek 69'a gidiyor sonuçta for döngüsü?
Matlab'in kendisinden daha iyi optimizasyon nasıl yapmış olabilirsiniz GA konusunda, bir yanlışlık var gibi geliyor ama bilemiyorum tabi.
O satır aslında aradığınız sayının, matrisinin ilk satırının hangi sütununda oldugunu buluyor.

>> a
a =
3 2 6 8 11 19
9 10 2 10 7 1
3 6 10 10 2 10
>> find(a(1,:)==6)
ans =  3

İstediğiniz bu değil mi?

genetiksavar tarafından 2 yıl önce cevaplandı

Aslında şöyle soruyu tam doğru anlatamadığımı düşünüyorum. O yüzden basitleştirerek yeniden sormak istiyorum.
Yeni bir matris oluşturmam gerekiyor. Bu matrisi oluştururken A, B ve C matrislerindeki değerleri kullanacağım.
oluşturmak istediğimiz matris 2×4 lük matris olacak.
A matrisindeki değerler önemli.en başta ilk sütundaki değerler kontrol edilir. A (1,1) değeri 2 dir. bu yüzden B ve C deki ikinci satır değerleri çarpılır. ama B de ikinci satırda üç sütun var. Üç sutundan birini tercih etmeliyiz. Seçim yaparken A nın ikinci ve üçüncü satırındaki değerleri dikkate alırız. Eğer 10 yazıyorsa B matrisinde birinci sütun B(2,1) ile çapılır. Eğer 15 yazıyorsa B matrisinde ikinci sütun B(2,2) ile çarpılır. eğer 20 yazıyorsa B matrisinde üçüncü sütun B(2,3) ile çarpılır.
A matrix:
2   1   4   3
10 15 20 10
20 10 15 20
 
B matrix:
1 3 4
4 5 6
2 1 4
3 5 1
C matrix:
50
100
25
10
 
yeni matrix :

400 150  10  75
25   50   50  100

 
Bunu oluşturabilir miyiz kod olarak ?

genetiksavar tarafından 2 yıl önce cevaplandı

Aslında şöyle soruyu tam doğru anlatamadığımı düşünüyorum. O yüzden basitleştirerek yeniden sormak istiyorum.
Yeni bir matris oluşturmam gerekiyor. Bu matrisi oluştururken A, B ve C matrislerindeki değerleri kullanacağım.
oluşturmak istediğimiz matris 2×4 lük matris olacak.
A matrisindeki değerler önemli.en başta ilk sütundaki değerler kontrol edilir. A (1,1) değeri 2 dir. bu yüzden B ve C deki ikinci satır değerleri çarpılır. ama B de ikinci satırda üç sütun var. Üç sutundan birini tercih etmeliyiz. Seçim yaparken A nın ikinci ve üçüncü satırındaki değerleri dikkate alırız. Eğer 10 yazıyorsa B matrisinde birinci sütun B(2,1) ile çapılır. Eğer 15 yazıyorsa B matrisinde ikinci sütun B(2,2) ile çarpılır. eğer 20 yazıyorsa B matrisinde üçüncü sütun B(2,3) ile çarpılır.
A matrix:
2   1   4   3
10 15 20 10
20 10 15 20
 
B matrix:
1 3 4
4 5 6
2 1 4
3 5 1
C matrix:
50
100
25
10
 
yeni matrix :

400 150  10  75
25   50   50  100

 
Bunu oluşturabilir miyiz kod olarak ?

Caglar Yönetici tarafından 2 yıl önce cevaplandı

Merhaba,
Dediklerinizi anlayıp yazmaya çalıştım ancak aynı sonuçlara ulaşamadım. Bir süreci tarih edebiliyorsanız illaki kodu da yazılır tabi ki ama belli ki ben anlayamadım.

A = [2 1 4 3
10 15 20 10
20 10 15 20];
B = [1 3 4
4 5 6
2 1 4
3 5 1];
C = [50
100
25
10];
for sutun = 1:1:width(A)
%en başta ilk sütundaki değerler kontrol edilir.
% A (1,1) değeri 2 dir. bu yüzden B ve C deki ikinci satır değerleri çarpılır.
ilk_sutundaki_deger = A(1,sutun);
b_ilgili_satir = B(ilk_sutundaki_deger,:);
c_ilgili_deger = C(ilk_sutundaki_deger);

%Seçim yaparken A nın ikinci ve üçüncü satırındaki değerleri dikkate alırız.
a_ikinci_satir_ilgili_deger = A(2,sutun);
a_ucuncu_satir_ilgili_deger = A(3,sutun);

% Eğer 10 yazıyorsa B matrisinde birinci sütun B(2,1) ile çapılır.
% Eğer 15 yazıyorsa B matrisinde ikinci sütun B(2,2) ile çarpılır.
% eğer 20 yazıyorsa B matrisinde üçüncü sütun B(2,3) ile çarpılır.
switch a_ikinci_satir_ilgili_deger
case 10
b_ilgili_deger_1=b_ilgili_satir(1);
case 15
b_ilgili_deger_1=b_ilgili_satir(2);
case 20
b_ilgili_deger_1=b_ilgili_satir(3);
end
switch a_ucuncu_satir_ilgili_deger
case 10
b_ilgili_deger_2=b_ilgili_satir(1);
case 15
b_ilgili_deger_2=b_ilgili_satir(2);
case 20
b_ilgili_deger_2=b_ilgili_satir(3);
end

sonuc_ilk_satir(sutun) = b_ilgili_deger_1 * c_ilgili_deger;
sonuc_ikinci_satir(sutun) = b_ilgili_deger_2 * c_ilgili_deger;
end
sonuc = [sonuc_ilk_satir; sonuc_ikinci_satir]

Sonuc şu geliyor:

400 150 10 50
600 50 50 100