AHPで選ぶおうち

最近引っ越しのために家探しをしてた時の話。

会社からある程度条件を与えられ、候補を絞られてたのでかなりフィルタリングされたところからスタートしたものの…

最終的に2軒まで絞ったところで、内見。

その2つの物件はいろんな面で一長一短。
あっちはいいけどこういう点で駄目だ、とかそういうのばっかでどうにも結果が出ない。
でも、賃貸はあんまりのんびりしてると他の人に取られちゃうのですぐに決める必要があります。

そこで使ったのがAHP(階層決定法)。
オペレーションズリサーチの一手法です。

以下、復習も兼ねて適用してみる。

大雑把に概要を紹介すると、いくつかある評価基準を2つづつ取り出してどちらをどの程度優先するかを決めます。(一対比較)
その結果をまとめて対象の絶対評価と掛け算することで評価値を出し決定するもの。

この手法の面白いのは自分の価値観を定量化できる点にあります。
何を重視しているか、とかそういう。

で、原理について詳しく説明を、と思ったけど面倒なので、説明はwikipedia先生にお願いするとして、内見帰りの新幹線の中でこの一対比較のためのソースコードを一本書きました。
※動けばいいのでかなり汚い。めっちゃハードコーディングしてるしw

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class AHP {
     public static void main(String[] args) throws IOException {
          //一対比較の対象
          String itui[]={"治安","畳数","日当たり","向き","築年","宅配ボックス","駅から","風呂","洗面所","メシ屋","台所","先輩"};
          double ituirslt[][]=new double[itui.length][itui.length];
          //一対比較のスコア
          double ituipoint[]={0.0,9.0,7.0,5.0,3.0,1.0,0.33333333333333,0.2,0.14285714285,0.1111111111111111};
          double ituiavg[]=new double[itui.length];
          int k=0;

          for(int i=0;i<itui.length;i++){
               for(int j=i;j<itui.length;j++){
                    if(i==j){ituirslt[i][j]=1;continue;}

                    k++;
                    System.out.println("問"+k+": "+itui[i]+"  1..3..5..7..9"+itui[j]);
                    //標準入力
                    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                    String st = br.readLine();

                    ituirslt[i][j]=ituipoint[Integer.parseInt(st)];
                    ituirslt[j][i]=ituipoint[10-Integer.parseInt(st)];
               }
          }

          double ituisum[]=new double[itui.length];
          for(int i=0;i<itui.length;i++){
               double l=0;
               for(int j=0;j<itui.length;j++){
                    l=l+ituirslt[j][i];
               }
               ituisum[i]=l;
          }

          for(int i=0;i<itui.length;i++){
               for(int j=0;j<itui.length;j++){
                    ituirslt[j][i]=ituirslt[j][i]/ituisum[i];
               }
          }

          for(int i=0;i<itui.length;i++){
               for(int j=0;j<itui.length;j++){
                    ituiavg[i]=ituiavg[i]+ituirslt[i][j]/itui.length;
               }
          }
          System.out.println();
          for(int i=0;i<itui.length;i++){
               System.out.println(itui[i]+":"+ituiavg[i]);
          }
     }
}

当然、一対比較の対象を多くし過ぎると一対比較がものすごくめんどくさくなる(N件あるとN(N-1)/2回の比較が必要)ので、あまり差がでない比較項目とか全く重視していない比較項目は排除します。

この結果を踏まえて、定量的に評価できるものは定量評価、そうでないものは大雑把に数値化して評価します。
数値化のためのいい方法とか無いかなぁ…


すると計算の結果、0.45対0.55という結果に。
僅差だけど、これも何かの縁ということで、点数の高かった方に入居することにしました。

ちなみに、一対比較をする上で一番重視してたのは台所。
体感ではそんなに…?って感じだけど。

AHPで価値観を定量化することで自分の知らない面が見えたりして面白い家探しでした。