选一个海岛

选择一个海岛,对我这样选择困难症中期和拖延症晚期的人来说,就像上班准时到一样,总是要偷点懒的。

在吉隆坡转机,有不少东南亚的海岛,听说还不错,但是具体选哪一个呢? 作为一个啥都了解一点的水货,我要学以致用(开始装逼)了。

步骤

  • 新建一个 Google docs,记下海岛选项。
  • 抽几个比较关心的维度。(选择维度也有点门道,此处仅玩乐,不作细述。)
  • 最好的打 9 分, 最低的打 0 分。
  • 得到一个每个岛各个维度的分数。
../_images/island_choices.png
如果只是简单的求和,很快就可以得到得分最高的海岛。
但不同维度的重要性不同,所以要给每个维度给一个权重。
那么如何拍脑袋决定维度的权重呢?

步骤:

  • 将11个维度做成一个11x11 的二维矩阵。
  • 每个维度两两比较,相同重要 用 1 表示。 A 比 B 重要 用大于 1 (3,5,7,9)的数字表示。不重要的用 1/3, 1/5, 1/7 表示。
  • 得到一个如下的二维矩阵。

因为该矩阵是对称的,所以比较的时候,只需要填一半。

 # 因为我懒, 所以相对重要的时候 用 2 表示, 相对不重要的时候 用 1/2 表示 :-)

     In [10]: matrix
     Out[10]:
     [['1', '2', '2', '1', '1', '1', '1', '1', '1', '2', '2'],
      ['', '1', '2', '0.5', '1', '2', '2', '2', '1', '1', '0.5'],
      ['', '', '1', '0.5', '2', '1', '2', '2', '1', '1', '0.5'],
      ['', '', '', '1', '1', '2', '1', '1', '2', '0.5', '0.5'],
      ['', '', '', '', '1', '1', '1', '1', '1', '0.5', '0.5'],
      ['', '', '', '', '', '1', '2', '2', '2', '0.5', '0.5'],
      ['', '', '', '', '', '', '1', '1', '2', '0.5', '0.5'],
      ['', '', '', '', '', '', '', '1', '1', '0.5', '0.5'],
      ['', '', '', '', '', '', '', '', '1', '0.5', '0.5'],
      ['', '', '', '', '', '', '', '', '', '1', '0.5'],
      ['', '', '', '', '', '', '', '', '', '', '1']]

# 简单处理下,把矩阵补全。

     In [24]: for i in range(1,11):
         ...:        for j in range(i):
         ...:        matrix[i][j] = 1/float(matrix[j][i])



     In [25]: matrix
     Out[25]:
     array([[1. , 2. , 2. , 1. , 1. , 1. , 1. , 1. , 1. , 2. , 2. ],
            [0.5, 1. , 2. , 0.5, 1. , 2. , 2. , 2. , 1. , 1. , 0.5],
            [0.5, 0.5, 1. , 0.5, 2. , 1. , 2. , 2. , 1. , 1. , 0.5],
            [1. , 2. , 2. , 1. , 1. , 2. , 1. , 1. , 2. , 0.5, 0.5],
            [1. , 1. , 0.5, 1. , 1. , 1. , 1. , 1. , 1. , 0.5, 0.5],
            [1. , 0.5, 1. , 0.5, 1. , 1. , 2. , 2. , 2. , 0.5, 0.5],
            [1. , 0.5, 0.5, 1. , 1. , 0.5, 1. , 1. , 2. , 0.5, 0.5],
            [1. , 0.5, 0.5, 1. , 1. , 0.5, 1. , 1. , 1. , 0.5, 0.5],
            [1. , 1. , 1. , 0.5, 1. , 0.5, 0.5, 1. , 1. , 0.5, 0.5],
            [0.5, 1. , 1. , 2. , 2. , 2. , 2. , 2. , 2. , 1. , 0.5],
            [0.5, 2. , 2. , 2. , 2. , 2. , 2. , 2. , 2. , 2. , 1. ]])

# 将上面的矩阵A每一列归一化得到矩阵B;
# 将矩阵B每一行元素的平均值得到一个一列n行的矩阵C;
# 矩阵C即为所求权重向量。

# 上面的操作有点繁琐,我因为懒,也就不展示了。
# 有兴趣的同学可以看看 层次分析法: http://wiki.mbalib.com/wiki/%E5%B1%82%E6%AC%A1%E5%88%86%E6%9E%90%E6%B3%95

     # 每个维度的权重
     In [96]: n
     Out[96]:
     array([0.71739442, 0.9565259 , 1.07609164, 0.87681541, 1.11594688,
            1.07609164, 1.23551262, 1.27536786, 1.27536786, 0.79710491,
            0.59782869])

得到各个维度的权重之后,将分数矩阵和权重向量的乘积就是每个岛的加权后的得分了。

In [95]: m
Out[95]:
[[6, 6, 0, 9, 2],
 [9, 9, 4, 0, 5],
 [9, 9, 6, 0, 5],
 [9, 6, 0, 3, 8],
 [7, 0, 9, 4, 9],
 [0, 7, 9, 7, 9],
 [3, 0, 9, 9, 9],
 [7, 9, 8, 0, 7],
 [7, 6, 9, 0, 9],
 [8, 9, 0, 3, 6],
 [7, 7, 4, 0, 9]]

In [96]: n
Out[96]:
array([0.71739442, 0.9565259 , 1.07609164, 0.87681541, 1.11594688,
       1.07609164, 1.23551262, 1.27536786, 1.27536786, 0.79710491,
       0.59782869])

In [97]: numpy.matmul(n,m)
Out[97]: array([70.42421924, 65.88072124, 65.20318208, 34.59435332, 80.02933351])

最后结果是 巴厘岛得分最高,所以打算去巴厘岛了。

后记:

我曾经像你一样,打算做一个理智的人。
用理智的分析来证明我一开始拍脑袋的想法是对的。
尤其是当事情有点一团乱麻,有眉毛胡子一把抓的窘态时,
找一个框架,找个理论,来解开九连环。
选择不是件容易的事,牺牲的机会成本有时很大,我们就会犹疑不决,
把两件事两两比较的时候,其实就是自问自答,内心一开始的决定就会慢慢显现出来。
这时候, Follow your heart.

Published by Taoge on 2018-03-18 00:00:00