一种使用Python计算可达矩阵的简单方法

在进行编码前要简单介绍几个知识点:有向图,邻接矩阵,可达矩阵

有向图、邻接矩阵、可达矩阵

有向图

现实中常常会表示从一个地点到另一个地点的路径,这样的带有从起点到终点的路线表示可以用有向图表示。如下图所示:
有向图
在该图中,可以看成由地点F1到F2,以及F1到F3,F3到F2的路径。
这种有向图也表示两个因素的相互影响关系,再结合上面的有向图,我们可以理解为因素F1对因素F2有影响,对F3也有影响,因素F3对F2也有影响。

邻接矩阵

邻接矩阵内的元素表示两两元素之间的关系,在邻接矩阵中,矩阵[i,j]表示从Fi可以直接到达Fj,或者Fi可以直接影响Fj。
再看上图,F1,F2,F3之间的邻接矩阵为:
在这里插入图片描述
在该邻接矩阵中,1表示可以直接影响,或者直接到达,0表示不可影响或不可到达。
邻接矩阵的元素进行运算遵循以下规则:
在这里插入图片描述

可达矩阵

可达矩阵中的元素表示从一个地点到另一个地点是否存在一个路径,或者一个因素到另一个因素是否有影响路径。
可达矩阵可由邻接矩阵得到,得到的方法有如下规则:
假设有邻接矩阵A,以及单位矩阵I(I和A的维度是相同的),则对两进行进行(A+I)运算,当满足如下关系时:
在这里插入图片描述
则M就是求出来的可达矩阵。

代码测试部分

其实这种利用邻接矩阵求可达矩阵的运算就是简单的与或运算,网上有很多代码都是根据与或运算来得到的,但是可以有另外一种思路,就是在总结上述矩阵时,先使用传统的矩阵运算获得矩阵,在获得新矩阵时,先对矩阵进行处理,处理逻辑为:若元素值大于或等于1,则该元素就是1,如果是0,则就是0,不管它。我的代码就是这种思想。
我们采用了网上有答案的一个邻接矩阵进行测试,原矩阵为:
在这里插入图片描述
可以看出已经将邻接矩阵和单位矩阵进行了初步的处理。
求可达矩阵简单代码如下:

#使用numpy包
import numpy as np
relat_matrix =np.matrix([[1,0,1,1,1,0,0],[0,1,0,0,0,1,1],[0,1,1,0,0,0,0],[0,1,0,1,0,0,0],[0,0,0,0,1,1,0],[0,0,0,0,0,1,1],[0,0,0,0,0,0,1]])
# 第K+1步更新的矩阵
new_matrix =relat_matrix
#第K步的更新的矩阵
old_matrix = new_matrix
#进行循环终止的判断条件
m =0
#统计运算的步骤K
step =1
while m ==0:
    old_matrix = new_matrix
    new_matrix =old_matrix*relat_matrix
    for i in range(0,len(new_matrix)):
        for j in range(0,len(new_matrix)):
        #如果元素大于1,就输出为1
            if(new_matrix[i,j]>=1):
                new_matrix[i,j] = 1
    step = step+1
    print(step)
    #判断K次更新的矩阵和K+1次更新的矩阵是否相等
    if( old_matrix == new_matrix).all():
    #如果相等,终止循环,让m=1,并输出结果
        m=1
        print(new_matrix,step)

输出结果为:
结果
从上述的运行结果可以看出,总共在运行到K=4的时候便得到了想要的可达矩阵,并将可达矩阵输出到界面上,与原推理的最终结果如下图是相同的。
在这里插入图片描述

  • 5
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
TODIM方法一种决策支持方法,它可以用于多属性决策问题。下面是Python实现TODIM方法的步骤: 1. 定义决策矩阵和权重矩阵 假设有n个决策对象和m个属性,那么决策矩阵X可以表示为一个n×m的矩阵,其中每行代表一个决策对象的属性值。权重矩阵W可以表示为一个m×1的矩阵,其中每个元素代表对应属性的权重。 2. 归一化决策矩阵 对于每个属性,将其值进行归一化处理,使得其取值范围为[0,1]。可以使用如下公式进行归一化: X_norm = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)) 3. 计算属性决策矩阵 将归一化后的决策矩阵X_norm与权重矩阵W相乘,得到属性决策矩阵Y: Y = X_norm.dot(W) 4. 计算距离矩阵 对于每个决策对象i,计算其与其他决策对象之间的距离di: di = np.sqrt(np.sum((Y - Y[i])**2, axis=1)) 其中,np.sqrt表示开根号,np.sum表示求和,axis=1表示沿着列的方向求和。 5. 计算可达矩阵和不可达矩阵 根据距离矩阵,可以计算可达矩阵和不可达矩阵。对于决策对象i和j,如果di<=dj,则将可达矩阵中第i行第j列的元素设为1,否则将不可达矩阵中第i行第j列的元素设为1。 6. 计算优势矩阵和劣势矩阵 根据可达矩阵和不可达矩阵,可以计算优势矩阵和劣势矩阵。对于决策对象i和j,如果可达矩阵中第i行第j列的元素为1且不可达矩阵中第i行第j列的元素为0,则将优势矩阵中第i行第j列的元素设为1,否则将劣势矩阵中第i行第j列的元素设为1。 7. 计算TODIM综合评价值 根据优势矩阵和劣势矩阵,可以计算TODIM综合评价值。对于决策对象i,其TODIM综合评价值为: TODIM(i) = np.sum(omega[np.where(adv[i] == 1)]) - np.sum(omega[np.where(dis[i] == 1)]) 其中,adv表示优势矩阵,dis表示劣势矩阵,omega表示权重矩阵。 完整代码如下: ``` import numpy as np def TODIM(X, W): # 归一化决策矩阵 X_norm = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)) # 计算属性决策矩阵 Y = X_norm.dot(W) # 计算距离矩阵 dist = np.sqrt(np.sum((Y - Y[:, np.newaxis])**2, axis=2)) # 计算可达矩阵和不可达矩阵 reach = np.where(dist <= dist.min(axis=1)[:, np.newaxis], 1, 0) not_reach = np.where(dist > dist.min(axis=1)[:, np.newaxis], 1, 0) # 计算优势矩阵和劣势矩阵 adv = np.where(reach.dot(reach.T) == 1, np.where(not_reach.dot(not_reach.T) == 0, 1, 0), 0) dis = np.where(not_reach.dot(not_reach.T) == 1, np.where(reach.dot(reach.T) == 0, 1, 0), 0) # 计算TODIM综合评价值 omega = W / np.sum(W) TODIM = np.sum(omega[np.where(adv == 1)], axis=1) - np.sum(omega[np.where(dis == 1)], axis=1) return TODIM ``` 其中,X和W分别代表决策矩阵和权重矩阵。可以使用如下代码进行调用: ``` X = np.array([[10, 2, 3], [3, 8, 6], [4, 4, 9]]) W = np.array([0.4, 0.3, 0.3]) TODIM(X, W) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值