Read 428 times | Created 2015-01-28 10:55:05 | Updated 2017-09-08 00:50:27 | | |

 

<?php
/*
-- ----------------------------
-- DSS TOPSIS METHOD
-- CREATED BY : CAHYA DSN
-- CREATED ON : 2014-12-03
-- UPDATED ON : 2015-01-27
-- ----------------------------

Metode Technique for Order of Preference by Similarity to Ideal Solution (TOPSIS)

TOPSIS adalah metode pengambilan keputusan multikriteria yang pertama kali diper
kenalkan oleh Yoon dan Hwang tahun 1981. Menurut Hwang dan Zeleny (Kusumadewi,dkk.
, 2006), TOPSIS didasarkan pada konsep dimana alternatif terpilih yang terbaik ti
dak hanya memiliki jarak terpendek dari solusi ideal positif, namun juga memiliki
jarak terpanjang dari solusi ideal negatif.

Solusi ideal positif didefinisikan sebagai jumlah dari seluruh nilai terbaik yang
dapat dicapai untuk setiap atribut, sedangkan solusi ideal negatif terdiri dari
seluruh nilai terburuk yang dicapai untuk setiap atribut (Meliana, 2011). 

Konsep ini banyak digunakan pada beberapa model MADM untuk menyelesaikan masalah 
keputusan secara praktis (Hwang, 1993; Liang,1999; Yeh, 2000). Hal ini disebabkan 
konsepnya sederhana dan, mudah dipahami, komputasinya efisien, dan memiliki kemam
puan untuk mengukur kinerja relatif dari alternatif-alternatif keputusan dalam 
bentuk matematis yang sederhana (Kusumadewi, dkk., 2006: 88). 

3.2.1 Prosedur TOPSIS
Secara umum, prosedur TOPSIS mengikuti langkah-langkah sebagai berikut:
1. Membuat matriks keputusan yang ternormalisasi 
TOPSIS membutuhkan rating kinerja setiap alternatif Ai pada setiap kriteria Cj yang 
ternormalisasi, yaitu:
 
                         2  0.5
r  = x   /(    sigma   x   )
 ij   ij    i=1     m   ij

dengan 
    i = 1, 2, ... , m; 
dan 
    j = 1, 2, 3, ... , n;

2. Membuat matriks keputusan yang ternormalisasi terbobot
Solusi ideal positif A+  dan solusi ideal negatif A- 
dapat ditentukan berdasarkan rating bobot ternormalisasi (y  ) sebagai:
                                                           ij
y  = w r
 ij   i ij
  
dengan 
  i = 1, 2, ... , m; 
dan 
  j = 1, 2, 3, ... , n;  

dimana:

r  = matriks ternormalisasi terbobot
 ij
w  = vektor bobot ke-i
 i
 
3. Menentukan matriks solusi ideal positif dan matriks solusi ideal negatif 
Solusi ideal positif dihitung berdasarkan:

 +    +   +       +
A = (y , y , ... y )
      1   2       n
Solusi ideal negatif  dihitung berdasarkan:

 -    -   -       -
A = (y , y , ... y )
      1   2       n

dengan 

      max y   ; jika j adalah atribut keuntungan
 +     i   ij
y = {  
 j    min y   ; jika j adalah atribut biaya
       i   ij
 
 
      min y   ; jika j adalah atribut keuntungan
 -     i   ij
y = {  
 j    max y   ; jika j adalah atribut biaya
       i   ij
 
dengan
 j=1,2,...,n
 
4. Menentukan jarak antara nilai setiap alternatif dengan matriks solusi 
positif dan matriks solusi ideal negatif

Jarak antara alternatif  Ai dengan solusi ideal positif dirumuskan sebagai: 

 +            +      2  0.5
D =(  sigma (y - y  )  )      ; i= 1,2,...,m
 i   j=1   n  i   ij

Jarak antara alternatif Ai dengan solusi ideal negatif dirumuskan sebagai

 -                 - 2  0.5
D =(  sigma (y  - y )  )      ; i= 1,2,...,m
 i   j=1   n  ij   i


5.Menentukan nilai preferensi untuk setiap alternatif
Nilai preferensi untuk setiap alternatif (Vi) diberikan sebagai:
     -   -    +
V = D /(D  + D )              ; i=1,2,...,m
 i   i   i    i

Nilai yang lebih besar menunjukkan bahwa alternatif Ai lebih dipilih.
//----------------

CREATE DATABASE IF NOT EXISTS db_dss;
USE db_dss;

DROP TABLE IF EXISTS topsis_criterias;
CREATE TABLE IF NOT EXISTS topsis_criterias(
  id_criteria TINYINT(3) UNSIGNED NOT NULL,
  criteria VARCHAR(100) NOT NULL,
  weight FLOAT NOT NULL,
  attribute SET('benefit','cost'),
  PRIMARY KEY(id_criteria)
)ENGINE=MyISAM;

INSERT INTO topsis_criterias(id_criteria,criteria,weight,attribute)
VALUES
(1,'Pengalaman Kerja',0.3,'benefit'),
(2,'Pendidikan',0.2,'benefit'),
(3,'Usia',0.2,'benefit'),
(4,'Status Perkawinan',0.15,'cost'),
(5,'Alamat',0.15,'cost');

SELECT * FROM topsis_criterias;
+-------------+-------------------+--------+-----------+
| id_criteria | criteria          | weight | attribute |
+-------------+-------------------+--------+-----------+
|           1 | Pengalaman Kerja  |   0.3  | benefit   |
|           2 | Pendidikan        |   0.2  | benefit   |
|           3 | Usia              |   0.2  | benefit   |
|           4 | Status Perkawinan |  0.15  | cost      |
|           5 | Alamat            |  0.15  | cost      |
+-------------+-------------------+--------+-----------+
5 rows in set (0.01 sec)

DROP TABLE IF EXISTS topsis_alternatives;
CREATE TABLE IF NOT EXISTS topsis_alternatives(
  id_alternative SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(30) NOT NULL,
  PRIMARY KEY(id_alternative)
) ENGINE=MyISAM;

INSERT INTO topsis_alternatives(name)
VALUES
('Alfian'),
('Bella'),
('Carlie'),
('Dewi'),
('Enrico');

SELECT * FROM topsis_alternatives;
+----------------+--------+
| id_alternative | name   |
+----------------+--------+
|              1 | Alfian |
|              2 | Bella  |
|              3 | Carlie |
|              4 | Dewi   |
|              5 | Enrico |
+----------------+--------+
5 rows in set (0.00 sec)

DROP TABLE IF EXISTS topsis_evaluations;
CREATE TABLE IF NOT EXISTS topsis_evaluations(
  id_alternative SMALLINT(5) UNSIGNED NOT NULL,
  id_criteria TINYINT(3) UNSIGNED NOT NULL,
  value FLOAT NOT NULL,
  PRIMARY KEY (id_alternative,id_criteria)
)ENGINE=MyISAM;

INSERT INTO topsis_evaluations(id_alternative,id_criteria,value)
VALUES
(1,1,0.5),
(1,2,1),
(1,3,0.7),
(1,4,0.7),
(1,5,0.8),
(2,1,0.8),
(2,2,0.7),
(2,3,1),
(2,4,0.5),
(2,5,1),
(3,1,1),
(3,2,0.3),
(3,3,0.4),
(3,4,0.7),
(3,5,1),
(4,1,0.2),
(4,2,1),
(4,3,0.5),
(4,4,0.9),
(4,5,0.7),
(5,1,1),
(5,2,0.7),
(5,3,0.4),
(5,4,0.7),
(5,5,1);

*/
$dbhost='localhost';
$dbuser='root';
$dbpass='';
$dbname='db_dss';
$db=new mysqli($dbhost,$dbuser,$dbpass,$dbname);
$sql="
      SELECT 
        b.name,c.criteria,a.value,c.weight,c.attribute
      FROM 
        topsis_evaluations a
        JOIN 
          topsis_alternatives b USING(id_alternative)
        JOIN 
          topsis_criterias c USING(id_criteria)
";
$result=$db->query($sql);
$data=array();
$kriterias=array();
$bobot=array();
$atribut=array();
$nilai_kuadrat=array();
while($row=$result->fetch_object()){
  if(!isset($data[$row->name])){
    $data[$row->name]=array();
  }
  if(!isset($data[$row->name][$row->criteria])){
    $data[$row->name][$row->criteria]=array();
  }
  if(!isset($nilai_kuadrat[$row->criteria])){
    $nilai_kuadrat[$row->criteria]=0;
  }
  $bobot[$row->criteria]=$row->weight;
  $atribut[$row->criteria]=$row->attribute;
  $data[$row->name][$row->criteria]=$row->value;
  $nilai_kuadrat[$row->criteria]+=pow($row->value,2);
  $kriterias[]=$row->criteria;
}
$kriteria=array_unique($kriterias);
$jml_kriteria=count($kriteria);
?>
<!doctype html>
<html>
  <head>
    <title>TOPSIS</title>
  </head>
  <body>
    <table border='1'>
      <caption>Evaluation Matrix (x<sub>ij</sub>)</caption>
      <thead>
        <tr>
          <th rowspan='3'>No</th>
          <th rowspan='3'>Alternatif</th>
          <th rowspan='3'>Nama</th>
          <th colspan='<?php echo $jml_kriteria;?>'>Kriteria</th>
        </tr>
        <tr>
          <?php
          foreach($kriteria as $k)
            echo "<th>{$k}</th>n";
          ?>
        </tr>
        <tr>
          <?php
          for($n=1;$n<=$jml_kriteria;$n++)
            echo "<th>C{$n}</th>";
          ?>
        </tr>
      </thead>
      <tbody>
        <?php
        $i=0;
        foreach($data as $nama=>$krit){
          echo "<tr>
            <td>".(++$i)."</td>
            <th>A{$i}</th>
            <td>{$nama}</td>";
          foreach($kriteria as $k){  
            echo "<td align='center'>{$krit[$k]}</td>";
          }
          echo
           "</tr>n";
        }
        ?>
      </tbody>
    </table>
    <table border='1'>
      <caption>Rating Kinerja Ternormalisasi (r<sub>ij</sub>)</caption>
      <thead>
        <tr>
          <th rowspan='3'>No</th>
          <th rowspan='3'>Alternatif</th>
          <th rowspan='3'>Nama</th>
          <th colspan='<?php echo $jml_kriteria;?>'>Kriteria</th>
        </tr>
        <tr>
          <?php
          foreach($kriteria as $k)
            echo "<th>{$k}</th>n";
          ?>
        </tr>
        <tr>
          <?php
          for($n=1;$n<=$jml_kriteria;$n++)
            echo "<th>C{$n}</th>";
          ?>
        </tr>
      </thead>
      <tbody>
        <?php
        $i=0;
        foreach($data as $nama=>$krit){
          echo "<tr>
            <td>".(++$i)."</td>
            <th>A{$i}</th>
            <td>{$nama}</td>";
          foreach($kriteria as $k){  
            echo "<td align='center'>".round(($krit[$k]/sqrt($nilai_kuadrat[$k])),4)."</td>";
          }
          echo
           "</tr>n";
        }
        ?>
      </tbody>
    </table>
    <table border='1'>
      <caption>Rating Bobot Ternormalisasi(y<sub>ij</sub>)</caption>
      <thead>
        <tr>
          <th rowspan='3'>No</th>
          <th rowspan='3'>Alternatif</th>
          <th rowspan='3'>Nama</th>
          <th colspan='<?php echo $jml_kriteria;?>'>Kriteria</th>
        </tr>
        <tr>
          <?php
          foreach($kriteria as $k)
            echo "<th>{$k}</th>n";
          ?>
        </tr>
        <tr>
          <?php
          for($n=1;$n<=$jml_kriteria;$n++)
            echo "<th>C{$n}</th>";
          ?>
        </tr>
      </thead>
      <tbody>
        <?php
        $i=0;
        $y=array();
        foreach($data as $nama=>$krit){
          echo "<tr>
            <td>".(++$i)."</td>
            <th>A{$i}</th>
            <td>{$nama}</td>";
          foreach($kriteria as $k){  
            $y[$k][$i-1]=round(($krit[$k]/sqrt($nilai_kuadrat[$k])),4)*$bobot[$k];
            echo "<td align='center'>".$y[$k][$i-1]."</td>";
          }
          echo
           "</tr>n";
        }
        ?>
      </tbody>
    </table>
    <table border='1'>
      <caption>Solusi Ideal positif (A<sup>+</sup>)</caption>
      <thead>
        <tr>
          <th colspan='<?php echo $jml_kriteria;?>'>Kriteria</th>
        </tr>
        <tr>
          <?php
          foreach($kriteria as $k)
            echo "<th>{$k}</th>n";
          ?>
        </tr>
        <tr>
          <?php
          for($n=1;$n<=$jml_kriteria;$n++)
            echo "<th>y<sub>{$n}</sub><sup>+</sup></th>";
          ?>
        </tr>
      </thead>
      <tbody>
        <tr>
          <?php
          $yplus=array();
          foreach($kriteria as $k){
            $yplus[$k]=($atribut[$k]=='benefit'?max($y[$k]):min($y[$k]));
            echo "<th>{$yplus[$k]}</th>";
          }
          ?>
        </tr>
      </tbody>
    </table>
    <table border='1'>
      <caption>Solusi Ideal negatif (A<sup>-</sup>)</caption>
      <thead>
        <tr>
          <th colspan='<?php echo $jml_kriteria;?>'>Kriteria</th>
        </tr>
        <tr>
          <?php
          foreach($kriteria as $k)
            echo "<th>{$k}</th>n";
          ?>
        </tr>
        <tr>
          <?php
          for($n=1;$n<=$jml_kriteria;$n++)
            echo "<th>y<sub>{$n}</sub><sup>-</sup></th>";
          ?>
        </tr>
      </thead>
      <tbody>
        <tr>
          <?php
          $ymin=array();
          foreach($kriteria as $k){
            $ymin[$k]=$atribut[$k]=='cost'?max($y[$k]):min($y[$k]);
            echo "<th>{$ymin[$k]}</th>";
          }
          ?>
        </tr>
      </tbody>
    </table>
    <table border='1'>
      <caption>Jarak positif (D<sub>i</sub><sup>+</sup>)</caption>
      <thead>
        <tr>
          <th>No</th>
          <th>Alternatif</th>
          <th>Nama</th>          
          <th>D<suo>+</sup></th>
        </tr>
      </thead>
      <tbody>
        <?php
        $i=0;
        $dplus=array();
        foreach($data as $nama=>$krit){
          echo "<tr>
            <td>".(++$i)."</td>
            <th>A{$i}</th>
            <td>{$nama}</td>";
          foreach($kriteria as $k){  
            if(!isset($dplus[$i-1])) $dplus[$i-1]=0;
            $dplus[$i-1]+=pow($yplus[$k]-$y[$k][$i-1],2);
          }
          echo "<td>".round(sqrt($dplus[$i-1]),6)."</td>
           </tr>n";
        }
        ?>
      </tbody>
    </table>
    <table border='1'>
      <caption>Jarak negatif (D<sub>i</sub><sup>-</sup>)</caption>
      <thead>
        <tr>
          <th>No</th>
          <th>Alternatif</th>
          <th>Nama</th>          
          <th>D<suo>+</sup></th>
        </tr>
      </thead>
      <tbody>
        <?php
        $i=0;
        $dmin=array();
        foreach($data as $nama=>$krit){
          echo "<tr>
            <td>".(++$i)."</td>
            <th>A{$i}</th>
            <td>{$nama}</td>";
          foreach($kriteria as $k){  
            if(!isset($dmin[$i-1]))$dmin[$i-1]=0;
            $dmin[$i-1]+=pow($ymin[$k]-$y[$k][$i-1],2);
          }
          echo "<td>".round(sqrt($dmin[$i-1]),6)."</td>
           </tr>n";
        }
        ?>
      </tbody>
    </table>
    <table border='1'>
      <caption>Nilai Preferensi(V<sub>i</sub>)</caption>
      <thead>
        <tr>
          <th>No</th>
          <th>Alternatif</th>
          <th>Nama</th>
          <th>V<sub>i</sub></th>
        </tr>
      </thead>
      <tbody>
        <?php
        $i=0;
        $V=array();
        foreach($data as $nama=>$krit){
          echo "<tr>
            <td>".(++$i)."</td>
            <th>A{$i}</th>
            <td>{$nama}</td>";
          foreach($kriteria as $k){  
            $V[$i-1]=$dmin[$i-1]/($dmin[$i-1]+$dplus[$i-1]);
          }
          echo "<td>{$V[$i-1]}</td></tr>n";
        }
        ?>
      </tbody>
    </table>
  </body>
</html>