intuitionistic fuzzy set 运算规则python实现

模糊集运算规则合集之一,intuitionistic fuzzy set。
将直觉模糊集的运算封装到了一个py文件中,方便自己在其他文件中调用。包含的运算有交,并,和,积,数乘,乘方,q=1,2,inf情况下的距离测度和相似性测度,得分函数和精确函数,其他还在持续更新中。
可以满足计算中的基本需求,在这里分享给大家方便使用。
ps,未来计划将之前写过的直觉模糊文章全部都用该文件进行修正,还想将犹豫模糊,q阶模糊等其他模糊环境的基本运算都封装出来,写的不好,欢迎大家修改。
下面举个简单的使用例子,数据来自论文《Pythagorean Fuzzy Hamy Mean Operators in
Multiple Attribute Group Decision Making and Their
Application to Supplier Selection》实现群决策的方案选优。

使用简单的加权平均算子进行信息融合,代码只需要三行,对每个矩阵调用数乘运算加权,再调用和运算集结。

df1=IFS.plus(IFS.ltimes(w[0],data.df1),IFS.ltimes(w[1],data.df2))
df2=IFS.plus(IFS.ltimes(w[2],data.df1),IFS.ltimes(w[3],data.df2))
print(IFS.plus(df1,df2))

在这里插入图片描述
之后随便选一个决策方法选优,获得排名和论文结果一致,说明计算无误。
在这里插入图片描述
在这里插入图片描述

代码如下,py文件放在了GitHub仓库https://github.com/rivendelltom/decision-making-study

import pandas as pd#AHP方法实现
from matplotlib.cbook import flatten
import numpy as np
import scipy as sp

inf=9999999 #代表n

def ifs_jiao(coords1, coords2):  # 交运算

      t = list(zip(coords1, coords2))
      t1 = min(t[0])
      t2 = max(t[1])
      return [t1, t2]


def ifs_bing(coords1, coords2):  # 并运算

    t = list(zip(coords1, coords2))
    print(t)
    t1 = max(t[0])
    t2 = min(t[1])
    return [t1, t2]


def plus(coords1, coords2):  # 和运算,支持一对一(就算一个元素也要写成二维数组的形式),多对多
    d1=[]
    d2=[]
    d=[]
    for (x, y) in zip(coords1, coords2):
        d1.append(x[0]+y[0]-x[0]*y[0])
        d2.append(x[1]*y[1])
    t=list(zip(*[d1,d2]))
    for i in t:
        d.append(list(i))
    return d
def times(coords1, coords2):  # 机运算
    d1=[]
    d2=[]
    d=[]
    for (x, y) in zip(coords1, coords2):
        d1.append(x[0]*y[0])
        d2.append(x[1]+y[1]-x[1]*y[1])
    t=list(zip(*[d1,d2]))
    for i in t:
        d.append(list(i))
    return d
def ltimes(lamda, coords2):  # 数乘运算
    d1=[]
    d2=[]
    d=[]
    for x,y in coords2:
        d1.append((1-(1-x)**lamda))
        d2.append(y**lamda)
    t=list(zip(*[d1,d2]))
    for i in t:
        d.append(list(i))
    return d

def lpower(lamda, coords2):  # 乘方运算
    d1=[]
    d2=[]
    d=[]
    for x,y in coords2:
        # print(x)
        d1.append(x**lamda)
        # print(d1)
        d2.append((1-(1-y)**lamda))
    t=list(zip(*[d1,d2]))
    for i in t:
        d.append(list(i))
    return d


def distance(coords1, coords2,q):  # 计算距离的函数,q可以实现汉明,欧几里得,闵可夫斯基,切比雪夫距离
    n=len(coords1)
    # print(n)
    pai=[]
    d3=[]
    dis=0
    for (x, y) in zip(coords1, coords2):
        pai.append(np.array(1 -x[0]-x[1])-np.array(1- y[0]-y[1]))
        d3.append(np.ndarray.tolist(np.array(x)-np.array(y)))
    t1 ,t2= list(zip(*d3))
    if q==1:
        dis =1- (0.5*(1/n)*(sum(np.abs(t1)+np.abs(t2)+np.abs(pai))))**(1/q)
    if q>=2:
        dis =1-(0.5*(1/n)*(sum(np.power(t1,q)+np.power(t2,q)+np.power(pai,q))))**(1/q)
    if q == inf:
        t = zip(np.abs(t1) , np.abs(t2) , np.abs(pai))
        dis = 1-max(list(map(lambda x: (x[1] + x[0]+x[2])/(2*n), list(t))))
    return dis

def weight_distance(coords1, coords2,q,w):  # 计算加权的距离的函数
    n=len(coords1)
    pai=[]
    d3=[]
    dis=0
    for (x, y) in zip(coords1, coords2):
        pai.append(np.array(1 -x[0]-x[1])-np.array(1- y[0]-y[1]))
        d3.append(np.ndarray.tolist(np.array(x)-np.array(y)))
    t1 ,t2= list(zip(*d3))
    if q==1:
        dis =1- 0.5*(sum(w*(np.abs(t1)+np.abs(t2)+np.abs(pai))))
    if q>=2:
        dis =1- (0.5*np.sum(w * (np.power(t1, q) + np.power(t2, q) + np.power(pai, q))))**(1/q)
    # if q == inf:
    #懒得写了,切比雪夫距离一般用不到
    return dis
def score(coords1):  # 计算得分函数
    d=[]
    for x,y in coords1:
        d.append(0.5*(1+x**2-y**2))
    return d
def accuary(coords1):  # 计算精确函数
    d=[]
    for x,y in coords1:
        d.append(x**2+y**2)
    return d
'''一些简单的求证'''
# df1 = [[0.3, 0.5],[0.4,0.5],[0.6,0.3]]
# df2 = [[0.2,0.4],[0.5,0.4],[0.5,0.1]]
# df3=[[0.3,0.5]]
# df4=[[0.2,0.4]]
# print(ifs_plus(df1,df2))
# print(ifs_times(df1,df2))
# print(ifs_lamdatimes(2,df1))
# print(ifs_lamdapower(2,df1))
# print(distance(df1,df2,2))
# print(distance(df1,df2,1))
# print(distance(df1,df2,inf))
# w=np.array([0.5,0.2,0.3])
# print(weight_distance(df1,df2,1,w))
# print(weight_distance(df1,df2,2,w))

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值