python35行代码直接解决topsis模型!

python35行代码直接解决topsis模型

摘要(直接上代码结果)

在这里插入图片描述
代码部分:(解决关于河流的最优问题)
在这里插入图片描述

import numpy as np
x = np.array([[4.69,6.59,51,11.94],[2.03,7.86,19,6.46],[9.11,6.31,46,8.91],[8.61,7.05,46,26.43],[7.13,6.5,50,23.57],[2.39,6.77,38,24.62],[7.69,6.79,38,6.01],[9.3,6.81,27,31.57],[5.45,7.62,5,18.46],[6.19,7.27,17,7.51],[7.93,7.53,9,6.52],[4.4,7.28,17,25.3],[7.46,8.24,23,14.42],[2.01,5.55,47,26.31],[2.04,6.4,23,17.91],[7.73,6.14,52,15.72],[6.35,7.58,25,29.46],[8.29,8.41,39,12.02],[3.54,7.27,54,3.16],[7.44,6.26,8,28.41]])
(n,m)=x.shape;
print('共有%d(n)个评价对象,'%n,'%d(m)个评价指标'%m)
count=int(input("你有几项需要正向化处理:"));
t=[]
for i in range(count):
    judge = int(input("请输入需要正向化的类型(1:极小型;2:中间型;3:区间型):"))
    if judge == 1:  # 处理极小型
        position = int(input("请输入它所在的列:")) - 1
        b = max(x[:, position])
        x[:, position] = np.tile(b, 20) - x[:, position]

    if judge == 2:  # 处理中间型
        position = int(input("请输入它所在的列:")) - 1
        best = int(input("请输入最佳值:"))
        x[:, position] = 1 - abs(x[:, position] - np.tile(best, 20)) / np.tile(best, 20)

    if judge == 3:  # 处理区间型
        position = int(input("请输入它所在的列:")) - 1
        left = int(input("请输入左区间值:"))
        rigjt=int(input("请输入右区间值:"))
        for i in range(n):
            if left<=x[:, position][i]<=rigjt:
                t.append(1)
            if  x[:, position][i] > rigjt:
                b= max(x[:, position])-rigjt
                t.append(1-(x[:, position][i]-rigjt)/b)
            if x[:, position][i] < left:
                b = left-max(x[:, position])
                t.append(1 - (left-x[:, position][i]) / b)
        x[:, position]=t

        x=x**2
        c=np.tile(x.sum(axis=0), [20,1])
        Z=(x/c)**0.5
D1=(np.sum((np.tile(Z.min(axis=0), [20,1])-Z)**2,axis=1))**0.5
D2=(np.sum((np.tile(Z.max(axis=0), [20,1])-Z)**2,axis=1))**0.5
S=D1/(D1+D2)

M=S
M=M.tolist();
index1=M.index(max(M))+1;index2=M.index(min(M))+1
print('最佳河流是第%d条'%index1,'得分为%s'%max(M),'(未归一化)')
print('最差河流是第%d条'%index2,'得分为%s'%min(M),'(未归一化)')

T=np.sum(S)
sort=S/T
sort=sort.tolist();
index1=sort.index(max(sort))+1;index2=sort.index(min(sort))+1
print('得分表:%s'%sort)
print('最佳河流是第%d条'%index1,'得分为%s'%max(sort),'(归一化)')
print('最差河流是第%d条'%index2,'得分为%s'%min(sort),'(归一化)')



结果:

共有20(n)个评价对象, 4(m)个评价指标
你有几项需要正向化处理:3
请输入需要正向化的类型(1:极小型;2:中间型;3:区间型)1
请输入它所在的列:3
请输入需要正向化的类型(1:极小型;2:中间型;3:区间型)2
请输入它所在的列:2
请输入最佳值:7
请输入需要正向化的类型(1:极小型;2:中间型;3:区间型)3
请输入它所在的列:4
请输入左区间值:10
请输入右区间值:20
最佳河流是第11条 得分为0.8776072101106555 (未归一化)
最差河流是第14条 得分为0.21005168925905793 (未归一化)
得分表:[0.03745607712277839, 0.05638439140175191, 0.04911516102421658, 0.03791332986470618, 0.03631217198936668, 0.03198217183587749, 0.05500730028119533, 0.04490280997470958, 0.07192839817447075, 0.07025169076130178, 0.08333012125064657, 0.052687376398011174, 0.06524290400033522, 0.01994472303008249, 0.05149157146676416, 0.042416543545980574, 0.04306115865636171, 0.05177432369632416, 0.0408262995015081, 0.057971476023611156]
最佳河流是第11条 得分为0.08333012125064657 (归一化)
最差河流是第14条 得分为0.01994472303008249 (归一化)

topsis 模型 属于综合评价模型,原模型不考虑指权重影响解决各种不同指标下各个评价问题的最优解问题,对公司遇到综合决策问题时候,以及客户如何根据指标选择方案尤为重要。

原型:

topsis原理简单,核心就是优劣解距离,什么是优劣解距离:
在这里插入图片描述
上图我们不难看出,当我们这样计算的时候,如果得分越靠近优,则它的得分就会越优,反之得分就会越差,这就是优劣解距离大的核心思想。

(看不懂联系博主哦~)

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值