Sunday, November 6, 2016

Source Code Aplikasi Fuzzy Mamdani SPK Penentu Jumlah Produksi Berbasis C#

Ini sebenernya tugas kuliah kecerdasan buatan. berhubung saya sudah selesai dengan ini daripada numpuk aja di drive mending di share. Lebih bermanfaat buat teman-teman yang lain.

Aplikasi ini di buat berdasarkan contoh kasus. Terdapat penyelesaian dalam bentuk manual sekaligus implementasinya ke bahasa pemograman C#

Screenshot aplikasinya :






Contoh Kasus :



Sebuah perusahaan makanan kaleng akan memproduksi makanan jenis ABC. Dari data 1 bulan terakhir, PERMINTAAN TERBESAR mencapai 5000 kemasan/hari, dan PERMINTAAN TERKECIL 1000 kemasan/hari. PERSEDIAAN TERBANYAK digudang sampai 600 kemasan/hari, dan PERSEDIAAN TERKECIL mencapai 100 kemasan/hari. Dengan segala keterbatasan kemampuan PRODUKSI TERBANYAK adalah 7000 kemasan/hari, dan agar efisien PRODUKSI TERKECIL adalah 2000 kemasan/hari. Dalam produksi perusahaan menggunakan aturan :
R1 :         JIKA permintaan TURUN dan persediaan BANYAK maka produksi BERKURANG
R2 :         JIKA permintaan TURUN dan persediaan SEDIKIT maka produksi BERKURANG  
R3 :         JIKA permintaan NAIK dan persediaan BANYAK maka produksi BERTAMBAH     
R4 :         JIKA permintaan NAIK dan persediaan SEDIKIT maka produksi BERTAMBAH

Berapa harus diproduki jika PERMINTAAN 4000 kemasan dan PERSEDIAAN 300 kemasan.


Masalah di atas bisa di selesaikan menggunakan aplikasi yang saya bagikan ini. tapi sebelumnya mari kita bahas proses penyelesaian secara manual dulu, sehingga nantinya kita menentukan seberapa besar tingkat akurasi dari program yang kita buat ini. Berikut penyelesaiannya menggunakan metode fuzzy mamdani :

Terdapat 3 variabel fuzzy yaitu (1) permintaan, (2) persediaan, dan (3) produksi

·         PERMINTAAN
Terdiri dari 2 himpunan fuzzy, yaitu (1) TURUN, dan (2) NAIK
Diketahui :
Permintaan terendah adalah 1000 kemasan/hari
Permintaan tertinggi adalah 5000 kemasan/hari
Permintaan permasalahan = 4000 kemasan



·

·         PERSEDIAAN
Terdiri dari 2 himpunan fuzzy, yaitu (1) SEDIKIT, dan (2) BANYAK
Diketahui :
Persediaan terendah adalah 100 kemasan/hari
Persediaan tertinggi adalah 600 kemasan/hari
      Persediaan permasalahan = 300 kemasan




·         PRODUKSI
Terdiri dari 2 himpunan fuzzy, yaitu (1) BERKURANG, dan (2) BERTAMBAH
Diketahui :
Produksi terendah adalah 2000 kemasan/hari
Produksi tertinggi adalah 7000 kemasan/hari
Produksi permasalahan = ditanyakan ?? kemasan

Cari Nilai Produksi Z, dengan fungsi implikasi MIN
·         Permintaan x



·         Persediaan y
 







  
        Didapat fungsi keanggotaan hasil komposisi sbb :



Defuzzifikasi
Dengan Metode Centroid hitung momen tiap area :




Hitung luas masing2 area




Sehingga
 


 Untuk penjelasannya silahkan di pahami masing-masing. Selanjutnya berikut adalah source code aplikasinya :

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication4 {     public partial class Form1 : Form     {         public Form1()         {             InitializeComponent();         }         private void Form1_Load(object sender, EventArgs e)         {         }         private void button1_Click(object sender, EventArgs e)         {             double PmMax, PmMin, Prm, MaxPro, MinPro;             double uTrn, uNak;             {                 PmMax = double.Parse(PemMax.Text);                 PmMin = double.Parse(PemMin.Text);                 Prm = double.Parse(Permintaan.Text);                 uTrn = rumus.turun(PmMax, PmMin, Prm);                 uTurun.Text = uTrn.ToString();                 uNak = rumus.naik(PmMax, PmMin, Prm);                 uNaik.Text = uNak.ToString();             }             double PrMax, PrMin, Pers;             double uSdk, uByk;             {                 PrMax = double.Parse(PerMax.Text);                 PrMin = double.Parse(PerMin.Text);                 Pers = double.Parse(Persediaan.Text);                 uSdk = rumus.sedikit(PrMax, PrMin, Pers);                 uByk = rumus.banyak(PrMax, PrMin, Pers);                 uSedikit.Text = uSdk.ToString();                 uBanyak.Text = uByk.ToString();             }                         double p1, p2, p3, p4, max1, max2, max, Min1, Min2, Min, a1, a2;             double m1, m2, m3, AA1, AA2, AA3, z;             // Mencari a-predikat 1 - 4             p1 = Math.Min(Math.Round(uTrn, 2), Math.Round(uByk, 2));             p2 = Math.Min(Math.Round(uTrn, 2), Math.Round(uSdk, 2));             p3 = Math.Min(Math.Round(uNak, 2), Math.Round(uByk, 2));             p4 = Math.Min(Math.Round(uNak, 2), Math.Round(uSdk , 2));             // Mencari Min             Min1 = Math.Min(p1, p2);             Min2 = Math.Min(p3, p4);             Min = Math.Min(Min1, Min2);             // Mencari Max             max1 = Math.Max(p1, p2);             max2 = Math.Max(p3, p4);             max = Math.Max(max1, max2);             // Mencari a1 dan a2             MinPro = double.Parse(MinPd.Text);             MaxPro = double.Parse(MaxPd.Text);             a1 = (Min * (MaxPro - MinPro)) + (MaxPro - PmMax); // Mencari batas area 1             a2 = (max * (MaxPro - MinPro)) + (MaxPro - PmMax); // Mencari batas area 2             ta1.Text = a1.ToString();             ta2.Text = a2.ToString();                          // Defuzzyfikasi             m1 = Math.Round((Min / 2) * (Math.Pow(a1, 2)), 2);             m2 = Math.Round((((1 / (MaxPro - MinPro)) / 2) * (Math.Pow(a2, 3))) - ((MinPro / (MaxPro-MinPro)) / 2) * Math.Pow(a2, 2)) - (((1 / (MaxPro - MinPro)) / 3) * (Math.Pow(a1, 3))) - (((MinPro / (MaxPro - MinPro)) / 2 * (Math.Pow(a1, 2))));             m3 = Math.Round(((max * Math.Pow(MaxPro, 2)) / 2) - (max * (MaxPro - MinPro) / 2) * (MaxPro - MinPro), 2);             TM1 .Text = m1.ToString();             TM2.Text = m2.ToString();             TM3.Text = m3.ToString();             // Mencari Luas Area A1,A2,A3             AA1 = a1 * Min;             AA2 = (Min + max) * (a2 - a1) / 2;             AA3 = (MaxPro - (MaxPro - MinPro)) * max;             A_1.Text = AA1.ToString();             A_2.Text = AA2.ToString();             A_3.Text = AA3.ToString();             z = (m1 + m2 + m3) / (AA1 + AA2 + AA3); // Titik Pusat             Hasil.Text = z.ToString();         }         private void uSedikit_TextChanged(object sender, EventArgs e)         {         }     } }     public partial class rumus {     public static double turun(double PmMax, double PmMin, double Prm)     {         double u;         if (Prm <= PmMin) { u = 1; }         else if ((PmMin <= Prm) && (Prm <= PmMax)) { u = (PmMax - Prm) / (PmMax - PmMin); }         else { u = 0; }         return u;     }     public static double naik(double PmMax, double PmMin, double Prm)     {         double u;         if (Prm <= PmMin) { u = 1; }         else if ((PmMin <= Prm) && (Prm <= PmMax)) { u = (Prm - PmMin) / (PmMax - PmMin); }         else { u = 0; }         return u;     }     public static double sedikit(double PrMax, double PrMin, double Pers)     {         double u;         if (Pers <= PrMin) { u = 1; }         else if ((PrMin <= Pers) && (Pers <= PrMax)) { u = (PrMax - Pers) / (PrMax - PrMin); }         else { u = 0; }         return u;     }     public static double banyak(double PrMax, double PrMin, double Pers)     {         double u;         if (Pers <= PrMin) { u = 0; }         else if ((PrMin <= Pers) && (Pers <= PrMax)) { u = (Pers - PrMin) / (PrMax - PrMin); }         else { u = 0; }         return u;     } }
 
Untuk Source Codenya, bisa di dowload disini :
 
via google drive ==> Klik Disini  
 

1 comment:
Write comments