Advertisement
cahyadsn

SAW Method PHP+MySQL (mysqli procedural)

May 17th, 2016
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 15.97 KB | None | 0 0
  1. <?php
  2. /*
  3. -- ----------------------------
  4. -- DSS SAW METHOD
  5. -- CREATED BY : CAHYA DSN
  6. -- CREATED ON : 2014-12-01
  7. -- UPDATED ON : 2016-05-18
  8. -- ----------------------------
  9. /*
  10. Metode Simple Additive Weighting (SAW)
  11.  
  12. 1  Pengertian Metode Simple Additive Weighting (SAW)
  13.  
  14. Metode Simple Additive Weighting (SAW) sering juga dikenal istilah metode penjum
  15. lahan terbobot. Konsep dasar metode SAW adalah mencari penjumlahan terbobot dari
  16. rating kinerja pada setiap alternatif pada semua atribut (Fishburn, 1967) (Mac
  17. Crimmon, 1968). Metode SAW membutuhkan proses normalisasi matriks keputusan (X)
  18. ke suatu skala yang dapat diperbandingkan dengan semua rating alternatif yang a
  19. da.Metode ini merupakan metode yang paling terkenal dan paling banyak digunakan
  20. dalam menghadapi situasi Multiple Attribute Decision Making (MADM). MADM itu sen
  21. diri merupakan suatu metode yang digunakan untuk mencari alternatif optimal dari
  22. sejumlah alternatif dengan kriteria tertentu. Metode SAW ini mengharuskan pembuat
  23. keputusan menentukan bobot bagi setiap atribut. Skor total untuk alternatif dipe
  24. roleh dengan menjumlahkan seluruh hasil perkalian antara rating (yang dapat diban
  25. dingkan lintas atribut) dan bobot tiap atribut. Rating tiap atribut haruslah be
  26. bas dimensi dalam arti telah melewati proses normalisasi matriks sebelumnya.
  27.  
  28. 2  Langkah Penyelesaian Simple Additive Weighting (SAW)  
  29.  
  30. Langkah Penyelesaian SAW sebagai berikut :
  31.  
  32. [1]  Menentukan kriteria-kriteria yang akan dijadikan acuan dalam pengambilan
  33. keputusan, yaitu Ci.
  34.  
  35. [2]  Menentukan rating kecocokan setiap alternatif pada setiap kriteria.
  36.  
  37. [3]  Membuat matriks keputusan berdasarkan kriteria(Ci), kemudian melakukan norma
  38. lisasi matriks berdasarkan persamaan yang disesuaikan dengan jenis atribut (atri
  39. but keuntungan ataupun atribut biaya) sehingga diperoleh matriks ternormalisasi R.
  40.  
  41. [4]  Hasil akhir diperoleh dari proses perankingan yaitu penjumlahan dari perkalian
  42. matriks ternormalisasi R dengan vektor bobot sehingga diperoleh nilai terbesar
  43. yang dipilih sebagai alternatif terbaik (Ai)sebagai solusi.
  44.  
  45. Formula untuk melakukan normalisasi tersebut adalah:
  46.  
  47.         x
  48.          ij
  49.        ------   ; jika j adalah atribut keuntungan
  50.        max x  
  51.             ij
  52. r  = {  
  53.  ij    min x  
  54.             ij
  55.        ------   ; jika j adalah atribut biaya
  56.          x
  57.           ij
  58.  
  59. Dimana :
  60. r-ij    = rating kinerja ternormalisasi
  61. Max x-ij  = nilai maksimum dari setiap baris dan kolom
  62. Min x-ij  = nilai minimum dari setiap baris dan kolom
  63. X-ij    = baris dan kolom dari matriks
  64.  
  65. Dengan r-ij adalah rating kinerja ternormalisasi dari alternatif Ai pada atribut
  66. Cj; dengan i = 1,2,...,m dan j = 1,2,...,n.
  67.  
  68. Nilai preferensi untuk setiap alternatif (Vi) diberikan sebagai :
  69.  
  70. V = sigma  w r
  71.  i  j=1  n  j ij
  72.  
  73. Dimana :
  74. V-i  = Nilai akhir dari alternatif
  75. w-j  = Bobot yang telah ditentukan
  76. r-ij = Normalisasi matriks
  77. Nilai V-i yang lebih besar mengindikasikan bahwa alternatif Ai lebih terpilih
  78.  
  79. ================================================================================
  80. CREATE DATABASE IF NOT EXISTS db_saw;
  81. USE db_saw;
  82.  
  83. DROP TABLE IF EXISTS saw_criterias;
  84. CREATE TABLE IF NOT EXISTS saw_criterias(
  85.   id_criteria TINYINT(3) UNSIGNED NOT NULL,
  86.   criteria VARCHAR(100) NOT NULL,
  87.   weight FLOAT NOT NULL,
  88.   attribute SET('benefit','cost'),
  89.   PRIMARY KEY(id_criteria)
  90. )ENGINE=MyISAM;
  91.  
  92. INSERT INTO saw_criterias(id_criteria,criteria,weight,attribute)
  93. VALUES
  94. (1,'Absen',10,'benefit'),
  95. (2,'Kerajinan',20,'benefit'),
  96. (3,'Keahlian',20,'benefit'),
  97. (4,'Kedisiplinan',20,'benefit'),
  98. (5,'Kualitas Kerja',20,'benefit'),
  99. (6,'Penampilan',10,'benefit');
  100.  
  101. SELECT * FROM saw_criterias;
  102. +-------------+----------------+--------+-----------+
  103. | id_criteria | criteria       | weight | attribute |
  104. +-------------+----------------+--------+-----------+
  105. |           1 | Absen          |     10 | benefit   |
  106. |           2 | Kerajinan      |     20 | benefit   |
  107. |           3 | Keahlian       |     20 | benefit   |
  108. |           4 | Kedisiplinan   |     20 | benefit   |
  109. |           5 | Kualitas Kerja |     20 | benefit   |
  110. |           6 | Penampilan     |     10 | benefit   |
  111. +-------------+----------------+--------+-----------+
  112. 6 rows in set (0.01 sec)
  113.  
  114. DROP TABLE IF EXISTS saw_alternatives;
  115. CREATE TABLE IF NOT EXISTS saw_alternatives(
  116.   id_alternative SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  117.   name VARCHAR(30) NOT NULL,
  118.   PRIMARY KEY(id_alternative)
  119. ) ENGINE=MyISAM;
  120.  
  121. INSERT INTO saw_alternatives(name)
  122. VALUES
  123. ('Jono'),
  124. ('Rika'),
  125. ('Samuel'),
  126. ('Lono');
  127.  
  128. SELECT * FROM saw_alternatives;
  129. +----------------+--------+
  130. | id_alternative | name   |
  131. +----------------+--------+
  132. |              1 | Jono   |
  133. |              2 | Rika   |
  134. |              3 | Samuel |
  135. |              4 | Lono   |
  136. +----------------+--------+
  137. 4 rows in set (0.00 sec)
  138.  
  139. DROP TABLE IF EXISTS saw_evaluations;
  140. CREATE TABLE IF NOT EXISTS saw_evaluations(
  141.   id_alternative SMALLINT(5) UNSIGNED NOT NULL,
  142.   id_criteria TINYINT(3) UNSIGNED NOT NULL,
  143.   value FLOAT NOT NULL,
  144.   PRIMARY KEY (id_alternative,id_criteria)
  145. )ENGINE=MyISAM;
  146.  
  147. INSERT INTO saw_evaluations(id_alternative,id_criteria,value)
  148. VALUES
  149. (1,1,70),
  150. (1,2,80),
  151. (1,3,70),
  152. (1,4,60),
  153. (1,5,80),
  154. (1,6,70),
  155.  
  156. (2,1,70),
  157. (2,2,80),
  158. (2,3,85),
  159. (2,4,78),
  160. (2,5,80),
  161. (2,6,70),
  162.  
  163. (3,1,70),
  164. (3,2,70),
  165. (3,3,85),
  166. (3,4,60),
  167. (3,5,70),
  168. (3,6,80),
  169.  
  170.  
  171. (4,1,65),
  172. (4,2,70),
  173. (4,3,70),
  174. (4,4,60),
  175. (4,5,70),
  176. (4,6,100);
  177.  
  178. -- perangkingan:
  179.  
  180. SELECT
  181.   b.name,
  182.   SUM(
  183.       IF(c.attribute='benefit',
  184.          a.value/c.normalization,
  185.          c.normalization/a.value)
  186.       * c.weight
  187.       ) AS value
  188. FROM
  189.   saw_evaluations a
  190.   JOIN saw_alternatives b USING(id_alternative)
  191.   JOIN
  192.     (
  193.       SELECT
  194.         a.id_criteria,
  195.         ROUND(IF(b.attribute='benefit',MAX(a.value),MIN(a.value)),1) AS normalization,
  196.         b.attribute,
  197.         b.weight
  198.       FROM
  199.         saw_evaluations a
  200.         JOIN saw_criterias b USING(id_criteria)
  201.       GROUP BY a.id_criteria
  202.     ) c USING(id_criteria)
  203. GROUP BY a.id_alternative
  204. ORDER BY value DESC;
  205.  
  206. +--------+-------------------+
  207. | name   | value             |
  208. +--------+-------------------+
  209. | Rika   |                97 |
  210. | Jono   |  88.8552036199095 |
  211. | Samuel | 88.38461538461539 |
  212. | Lono   | 86.14091790562378 |
  213. +--------+-------------------+
  214. 4 rows in set (0.05 sec)
  215. */
  216. //-- database configuration
  217. $dbhost='localhost';
  218. $dbuser='root';
  219. $dbpass='';
  220. $dbname='db_dss';
  221. //-- database connection
  222. $db=mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
  223. ?>
  224. <!doctype html>
  225. <html>
  226. <head>
  227.   <title>DSS SAW Method</title>
  228.   <style>
  229.     * {font-family:verdana,arial,sans-serif;font-size:1em;padding:2px;}
  230.     h1 {font-size:1.5em}
  231.     h2 {font-size:1.2em}
  232.     td,th {min-width:100px;border:solid 1px #999;}
  233.     th {background-color:#99f;}
  234.     table {min-width:600px;}
  235.     .center {text-align:center}
  236.   </style>
  237. </head>
  238. <body>
  239.   <h1>DSS SAW Method</h1>
  240.   <h2>
  241.     [1] Menentukan kriteria-kriteria yang akan dijadikan acuan dalam
  242.     pengambilan keputusan, yaitu C<sub>i</sub>
  243.   </h2>
  244.   <p>
  245.     <table>
  246.       <caption>
  247.         Tabel Kriteria C<sub>i</sub>
  248.       </caption>
  249.       <tr>
  250.         <th>No</th>
  251.         <th>Symbol</th>
  252.         <th>Criteria</th>
  253.         <th>Attribute</th>
  254.       </tr>
  255.       <?php
  256.       $sql='SELECT criteria,weight,attribute FROM saw_criterias';
  257.       $result=mysqli_query($db,$sql);
  258.       $i=0;
  259.       while($row=mysqli_fetch_assoc($result)){
  260.         echo "<tr>
  261.            <td class='right'>".(++$i)."</td>
  262.            <td class='center'>C{$i}</td>
  263.            <td>{$row['criteria']}</td>
  264.            <td>{$row['attribute']}</td>
  265.          </tr>\n";
  266.       }
  267.       mysqli_free_result($result);
  268.       ?>
  269.     </table>
  270.   </p>
  271.   <h2>[2] Menentukan rating kecocokan setiap alternatif pada setiap kriteria.</h2>
  272.   <p>
  273.     Teknik pembobotan pada criteria dapat dilakukan dengan beragai macam cara
  274.     dan metode. Fase ini dikenal dengan istilah pra-proses. Namun bisa juga
  275.     dengan cara secara sederhana dengan memberikan nilai pada masing-masing
  276.     secara langsung berdasarkan persentasi nilai bobotnya. Sedangkan untuk yang
  277.     lebih lebih baik bisa digunakan fuzzy logic. Penggunaan Fuzzy logic, sangat
  278.     dianjurkan bila kritieria yang dipilih mempunyai sifat yang relative, misal
  279.     Umur, Panas, Tinggi, Baik atau sifat lainnya
  280.   </p>
  281.   <p>
  282.     <table>
  283.       <caption>
  284.         Rating Kecocokan Alternatif utk setiap Kriteria  
  285.       </caption>
  286.       <tr>
  287.         <th rowspan='2'>Alternative</th>
  288.         <th colspan='5'>Criteria</th>
  289.       </tr>
  290.       <tr>
  291.         <th>C1</th>
  292.         <th>C2</th>
  293.         <th>C3</th>
  294.         <th>C4</th>
  295.         <th>C5</th>
  296.       </tr>
  297.       <?php
  298.       $sql="SELECT
  299.              id_alternative,
  300.              SUM(IF(id_criteria=1,value,0)) AS C1,
  301.              SUM(IF(id_criteria=2,value,0)) AS C2,
  302.              SUM(IF(id_criteria=3,value,0)) AS C3,
  303.              SUM(IF(id_criteria=4,value,0)) AS C4,
  304.              SUM(IF(id_criteria=5,value,0)) AS C5
  305.            FROM
  306.              saw_evaluations
  307.            GROUP BY id_alternative
  308.            ORDER BY id_alternative
  309.           ";
  310.       $result=mysqli_query($db,$sql);
  311.       while($row=mysqli_fetch_assoc($result)){
  312.         echo "<tr class='center'>
  313.                <th>A{$row['id_alternative']}</th>
  314.                <td>".round($row['C1'],1)."</td>
  315.                <td>".round($row['C2'],1)."</td>
  316.                <td>".round($row['C3'],1)."</td>
  317.                <td>".round($row['C4'],1)."</td>
  318.                <td>".round($row['C5'],1)."</td>
  319.              </tr>\n";
  320.       }
  321.       mysql_free_result($result);
  322.       ?>
  323.     </table>
  324.   </p>
  325.   <h2>[3] Membuat matrik keputusan berdasarkan Kriteria C<sub>i</sub></h2>
  326.   <p>
  327.     <table>
  328.       <caption>
  329.         Pembobotan Kriteria (w)
  330.       </caption>
  331.       <tr>
  332.         <th>No</th>
  333.         <th>Alternative</th>
  334.         <th>Weight</th>
  335.       </tr>
  336.       <?php
  337.       $sql="SELECT weight FROM saw_criterias ORDER BY id_criteria";
  338.       $result=mysqli_query($db,$sql);
  339.       $i=0;
  340.       $W=array();
  341.       while($row=mysqli_fetch_assoc($result)){
  342.         $W[]=$row['weight'];
  343.         echo "<tr class='center'>
  344.                <td>".(++$i)."</td>
  345.                <td>C{$i}</td>
  346.                <td>{$row['weight']}</td>
  347.              </tr>";
  348.       }
  349.       ?>
  350.     </table>      
  351.   </p>
  352.   <p>
  353.     <table>
  354.       <caption>
  355.         Matrik Keputusan(X)
  356.       </caption>
  357.       <tr>
  358.         <th rowspan='2'>Alternative</th>
  359.         <th colspan='5'>Criteria</th>
  360.       </tr>
  361.       <tr>
  362.         <th>C1</th>
  363.         <th>C2</th>
  364.         <th>C3</th>
  365.         <th>C4</th>
  366.         <th>C5</th>
  367.       </tr>
  368.       <?php
  369.       $sql="SELECT
  370.              a.id_alternative,
  371.              SUM(IF(a.id_criteria=1,a.value,0)) AS C1,
  372.              SUM(IF(a.id_criteria=2,a.value,0)) AS C2,
  373.              SUM(IF(a.id_criteria=3,a.value,0)) AS C3,
  374.              SUM(IF(a.id_criteria=4,a.value,0)) AS C4,
  375.              SUM(IF(a.id_criteria=5,a.value,0)) AS C5
  376.            FROM
  377.              saw_evaluations a
  378.              JOIN saw_criterias b USING(id_criteria)
  379.            GROUP BY a.id_alternative
  380.            ORDER BY a.id_alternative
  381.           ";
  382.       $result=mysqli_query($db,$sql);
  383.       $X=array(1=>array(),2=>array(),3=>array(),4=>array(),5=>array());
  384.       while($row=mysqli_fetch_assoc($result)){
  385.         array_push($X[1],round($row['C1'],2));
  386.         array_push($X[2],round($row['C2'],2));
  387.         array_push($X[3],round($row['C3'],2));
  388.         array_push($X[4],round($row['C4'],2));
  389.         array_push($X[5],round($row['C5'],2));
  390.         echo "<tr class='center'>
  391.                <th>A{$row['id_alternative']}</th>
  392.                <td>".round($row['C1'],2)."</td>
  393.                <td>".round($row['C2'],2)."</td>
  394.                <td>".round($row['C3'],2)."</td>
  395.                <td>".round($row['C4'],2)."</td>
  396.                <td>".round($row['C5'],2)."</td>
  397.              </tr>\n";
  398.       }
  399.       mysqli_free_result($result);
  400.       ?>
  401.     </table>
  402.   </p>
  403.   <h3>Penghitungan Normalisasi</h3>
  404.   <p>
  405.     Untuk normalisai nilai, jika faktor/attribute kriteria <em>cost</em>
  406.     digunakan rumusan:
  407.   </p>
  408.   <p>
  409.     R<sub>ij</sub> = ( min{X<sub>ij</sub>} / X<sub>ij</sub>)
  410.   </p>
  411.   <p>
  412.     sedangkan jika faktor/attribute kriteria <em>benefit</em> digunakan rumusan:
  413.   </p>
  414.   <p>
  415.     R<sub>ij</sub> = ( X<sub>ij</sub>/max{X<sub>ij</sub>} )
  416.   </p>
  417.   <p>
  418.    Maka nilai-nilai ternormalisasi-nya menjadi:
  419.   </p>
  420.   <p>
  421.     <table>
  422.       <caption>
  423.           Matrik Ternormalisasi (R)
  424.       </caption>
  425.       <tr>
  426.         <th rowspan='2'>Alternative</th>
  427.         <th colspan='5'>Criteria</th>
  428.       </tr>
  429.       <tr>
  430.         <th>C1</th>
  431.         <th>C2</th>
  432.         <th>C3</th>
  433.         <th>C4</th>
  434.         <th>C5</th>
  435.       </tr>
  436.       <?php
  437.       $sql="SELECT
  438.              a.id_alternative,
  439.              SUM(
  440.                IF(
  441.                  a.id_criteria=1,
  442.                  IF(
  443.                    b.attribute='benefit',
  444.                    a.value/".max($X[1]).",
  445.                    ".min($X[1])."/a.value)
  446.                  ,0)
  447.                  ) AS C1,
  448.              SUM(
  449.                IF(
  450.                  a.id_criteria=2,
  451.                  IF(
  452.                    b.attribute='benefit',
  453.                    a.value/".max($X[2]).",
  454.                    ".min($X[2])."/a.value)
  455.                   ,0)
  456.                 ) AS C2,
  457.              SUM(
  458.                IF(
  459.                  a.id_criteria=3,
  460.                  IF(
  461.                    b.attribute='benefit',
  462.                    a.value/".max($X[3]).",
  463.                    ".min($X[3])."/a.value)
  464.                   ,0)
  465.                 ) AS C3,
  466.              SUM(
  467.                IF(
  468.                  a.id_criteria=4,
  469.                  IF(
  470.                    b.attribute='benefit',
  471.                    a.value/".max($X[4]).",
  472.                    ".min($X[4])."/a.value)
  473.                   ,0)
  474.                 ) AS C4,
  475.              SUM(
  476.                IF(
  477.                  a.id_criteria=5,
  478.                  IF(
  479.                    b.attribute='benefit',
  480.                    a.value/".max($X[5]).",
  481.                    ".min($X[5])."/a.value)
  482.                   ,0)
  483.                 ) AS C5
  484.            FROM
  485.              saw_evaluations a
  486.              JOIN saw_criterias b USING(id_criteria)
  487.            GROUP BY a.id_alternative
  488.            ORDER BY a.id_alternative
  489.           ";    
  490.       $result=mysqli_query($db,$sql);
  491.       $R=array();
  492.       while($row=mysqli_fetch_assoc($result)){
  493.         $R[$row['id_alternative']]=array($row['C1'],$row['C2'],$row['C3'],$row['C4'],$row['C5']);
  494.         echo "<tr class='center'>
  495.                <th>A{$row['id_alternative']}</th>
  496.                <td>".round($row['C1'],2)."</td>
  497.                <td>".round($row['C2'],2)."</td>
  498.                <td>".round($row['C3'],2)."</td>
  499.                <td>".round($row['C4'],2)."</td>
  500.                <td>".round($row['C5'],2)."</td>
  501.              </tr>\n";
  502.       }
  503.       ?>
  504.     </table>
  505.   </p>
  506.   <h2>[4] Perangkingan</h2>
  507.   <p>
  508.     Hasil akhir diperoleh dari proses perankingan yaitu penjumlahan dari perkalian
  509.     matriks ternormalisasi R dengan vektor bobot W sehingga diperoleh nilai terbesar
  510.     yang dipilih sebagai alternatif terbaik (Ai) sebagai solusi
  511.   </p>
  512.   <p>
  513.     <table>
  514.       <caption>
  515.         Hasil Perangkingan
  516.       </caption>
  517.       <tr>
  518.         <th>No</th>
  519.         <th>Alternative</th>
  520.         <th>Result</th>
  521.       </tr>
  522.       <?php
  523.       $V=array();
  524.       $m=count($W);
  525.       foreach($R as $i=>$r){
  526.         for($j=0;$j<$m;$j++){
  527.           $V[$i]=(isset($V[$i])?$V[$i]:0)+$r[$j]*$W[$j];
  528.         }
  529.       }
  530.       arsort($V);
  531.       $no=0;
  532.       foreach($V as $i=>$v){
  533.         echo "<tr class='center'>
  534.                <td>".(++$no)."</td>
  535.                <td>A{$i}</td>
  536.                <td>{$v}</td>
  537.              </tr>";
  538.       }
  539.       ?>
  540.     </table>
  541.   </p>
  542. </body>
  543. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement