Java代码实现IOWA算子(2020.12.9)
迭代有序加权算子IOWA的Java实现
1、IOWA简介
定义1:设
f
W
:
R
m
→
R
f_W:R^{m}→R
fW:Rm→R为
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,wi≥0,i=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=1∑mwiav−index(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)
v−index(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,wi≥0,i=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)
本文地址:https://blog.csdn.net/jing_zhong/article/details/110926774
上一篇: 使用准则进行条件查询