欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java代码实现IOWA算子(2020.12.9)

程序员文章站 2022-03-09 07:58:24
迭代有序加权算子IOWA的Java实现编程软件IDEA,编程语言Java运行结果编程软件IDEA,编程语言Javapublic class OWA{ private double owa(double[] w,double[] a)//有序加权平均算子OWA { int length = a.length; String fwstring = "fw("; for(int i=0;i

1、IOWA简介

        定义1:设 f W : R m → R f_W:R^{m}→R fW:RmR m m m元函数, W = ( w 1 , w 2 , . . . , w m ) T W=(w_1,w_2,...,w_m)^{T} W=(w1,w2,...,wm)T是与 f W f_W fW有关的加权向量,满足 ∑ i = 1 m w i = 1 , w i ≥ 0 , i = 1 , 2 , . . , m , \sum_{i=1}^{m}w_i=1,w_i≥0,i=1,2,..,m, i=1mwi=1,wi0i=1,2,..,m, f W ( a 1 , a 2 , . . . , a m ) = ∑ i = 1 m w i b i , f_W(a_1,a_2,...,a_m)=\sum_{i=1}^{m}w_ib_i, fW(a1,a2,...,am)=i=1mwibi,其中, b i b_i bi a 1 , a 2 , . . . , a m a_1,a_2,...,a_m a1,a2,...,am中按从大到小的顺序排列的第 i i i个大的数,则称函数 f W f_W fW m m m维有序加权平均算子,简记为OWA算子。
        例如,设 w 1 = 0.3 , w 2 = 0.4 , w 3 = 0.2 , w 4 = 0.1 , w_1=0.3,w_2=0.4,w_3=0.2,w_4=0.1, w1=0.3,w2=0.4,w3=0.2,w4=0.1,则按定义1得
                     f W ( 2 , 4 , 1 , 5 ) = 5 × 0.3 + 4 × 0.4 + 2 × 0.2 + 1 × 0.1 = 3.6 f_W(2,4,1,5)=5×0.3+4×0.4+2×0.2+1×0.1=3.6 fW(2,4,1,5)=5×0.3+4×0.4+2×0.2+1×0.1=3.6
        定义2:设 < v 1 , a 1 > , < v 2 , a 2 > , . . . , < v m , a m > <v_1,a_1>,<v_2,a_2>,...,<v_m,a_m> <v1,a1>,<v2,a2>,...,<vm,am> m m m个二维数组,令
f W ( < v 1 , a 1 > , < v 2 , a 2 > , . . . , < v m , a m > ) = ∑ i = 1 m w i a v − i n d e x ( i ) f_W(<v_1,a_1>,<v_2,a_2>,...,<v_m,a_m>)=\sum_{i=1}^{m}w_ia_{v-index(i)} fW(<v1,a1>,<v2,a2>,...,<vm,am>)=i=1mwiavindex(i)
        则称函数 f W f_W fW是由 v 1 , v 2 , . . . , v m v_1,v_2,...,v_m v1,v2,...,vm所产生的 m m m维诱导有序加权平均算子,简记为IOWA算子, v i v_i vi称为 a i a_i ai的诱导值。其中 v − i n d e x ( i ) v-index(i) vindex(i) v 1 , v 2 , . . . , v m v_1,v_2,...,v_m v1,v2,...,vm中按从大到小的顺序排列的第 i i i个大的数的下标, W = ( w 1 , w 2 , . . . , w m ) T W=(w_1,w_2,...,w_m)^T W=(w1,w2,...,wm)T是OWA的加权向量,满足 ∑ i = 1 m w i = 1 , w i ≥ 0 , i = 1 , 2 , . . , m 。 \sum_{i=1}^{m}w_i=1,w_i≥0,i=1,2,..,m。 i=1mwi=1,wi0i=1,2,..,m
         定义2表明IOWA算子是对又导致 v 1 , v 2 , . . . , v m v_1,v_2,...,v_m v1,v2,...,vm按从大到小的顺序排序后所对应的 a 1 , a 2 , . . . , a m a_1,a_2,...,a_m a1,a2,...,am中的数进行有序加权平均, w i w_i wi与数 a i a_i ai的大小和位置无关,而是与其诱导值所在的位置有关。
        例如,设 < 3 , 4 > , < 1 , 2 > , < 5 , 1 > , < 7 , 0 > <3,4>,<1,2>,<5,1>,<7,0> <3,4>,<1,2>,<5,1>,<7,0>为4个二维数组,OWA的加权向量为 w 1 = 0.3 , w 2 = 0.4 , w 3 = 0.2 , w 4 = 0.1 , w_1=0.3,w2=0.4,w_3=0.2,w_4=0.1, w1=0.3,w2=0.4,w3=0.2,w4=0.1,
f W = ( < 3 , 4 > , < 1 , 2 > , < 5 , 1 > , < 7 , 0 > ) = 0 × 0.3 + 1 × 0.4 + 4 × 0.2 + 2 × 0.1 = 1.4 f_W=(<3,4>,<1,2>,<5,1>,<7,0>)=0×0.3+1×0.4+4×0.2+2×0.1=1.4 fW=(<3,4>,<1,2>,<5,1>,<7,0>)=0×0.3+1×0.4+4×0.2+2×0.1=1.4

2、编程软件IDEA,编程语言Java

        Java类OWA有owa和iowa两个私有成员函数,分别对应OWA算子和IOWA算子。

public class OWA
{
    private double owa(double[] w,double[] a)//有序加权平均算子OWA
    {
        int length = a.length;
        String fwstring = "fw(";
        for(int i=0;i<length;i++)
        {
            if(i==length -1) fwstring +=(a[i]+")=");
            else fwstring +=(a[i]+",");
        }
        for(int i=0;i<length;i++)//首先将数组a从大到小排列
        {
            for(int j=i+1;j<length;j++)
            {
                if(a[j]>a[i])
                {
                    a[j] +=a[i];
                    a[i]=a[j]-a[i];
                    a[j]=a[j]-a[i];
                }
            }
        }
        double fw=0;
        if(length == w.length)//判断w、a两个数组长度是否相同
        {
            for(int i=0;i<length;i++)
                fw +=w[i]*a[i];
            for(int i=0;i<length;i++)
            {
                if(i == length-1) fwstring += w[i]+"*"+a[i]+"=";
                else fwstring += w[i]+"*"+a[i]+"+";
            }
            fwstring += fw;
        }
        System.out.println(fwstring);
        return fw;
    }
    private double iowa(double[] w,double[] v,double[] a)//诱导有序加权平均算子IOWA
    {
        int length = a.length;
        String fwstring = "fw(";
        int[] v_index = new int[length];
        for(int i=0;i<length;i++)
            v_index[i]=i;//初始化索引数组
        if(v.length == length)
        {
            for(int i=0;i<length;i++)
            {
                if(i==length -1) fwstring += "("+v[i]+","+a[i]+"))=";
                else fwstring += "("+v[i]+","+a[i]+"),";
            }
            for(int i=0;i<length;i++)//首先将数组v从大到小排列,为了给v_index按照v从大到小寻找对应索引
            {
                for(int j=i+1;j<length;j++)
                {
                    if(v[j]>v[i])
                    {
                        v[j] +=v[i];
                        v[i]=v[j]-v[i];
                        v[j]=v[j]-v[i];
                        v_index[j] +=v_index[i];
                        v_index[i]=v_index[j]-v_index[i];
                        v_index[j]=v_index[j]-v_index[i];
                    }
                }
            }
        }
        double fw=0;
        if(length == w.length)//判断a、w两个数组长度是否相同
        {
            for(int i=0;i<length;i++)
                fw +=w[i]*a[v_index[i]];
            for(int i=0;i<length;i++)
            {
                if(i == length-1) fwstring += w[i]+"*"+a[v_index[i]]+"=";
                else fwstring += w[i]+"*"+a[v_index[i]]+"+";
            }
            fwstring += fw;
        }
        System.out.println(fwstring);
        return fw;
    }
    public static void main(String[] args)
    {
        double[] W={0.3,0.4,0.2,0.1},A={2,4,1,5},V={3,1,5,7},A1={4,2,1,0};
        OWA o = new OWA();
        System.out.println("有序加权平均算子计算结果:"+o.owa(W,A));
        System.out.println("迭代有序加权平均算子计算结果:"+o.iowa(W,V,A1));
    }
}

3、Java代码运行结果(OWA和IOWA)

Java代码实现IOWA算子(2020.12.9)

本文地址:https://blog.csdn.net/jing_zhong/article/details/110926774