用yalmip+Gurobi求解混合整数规划模型,求解结果不是最优解,用check函数显示不满足约束条件。尤其是第290-291这两行的约束:Constraints=[Constraints, GMRR1(1,1)==0]; Constraints=[Constraints, SEQ2(1,1)==0]; 按道理改变这两个约束条件,目标函数值也应该改变,但实际无论怎么改变这两个约束条件,得到的目标函数值都一样。请帮我看看,代码如下:
clear
close all
clc
warning('off','YALMIP:SuspectNonSymmetry');
m=9; % 9个可行状态
E=[1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1];
O=[1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0
0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1];
J1=[0 0 0 1 0 0 1 0 0
0 0 0 0 1 0 0 1 0
0 0 0 0 0 1 0 0 1
0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0]; % DM1的可达矩阵
J2=[0 1 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 0 0 0
0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0]; % DM2的可达矩阵
F11=[0.5 0.71 0.34 0.04 0.57 0.58 0.3 0.21 0.28
0.29 0.5 0.77 0.92 0.62 0.61 0.78 0.53 0.68
0.66 0.23 0.5 0.81 0.63 0.45 0.5 0.36 0.04
0.96 0.08 0.19 0.5 0.33 0.6 0.64 0 0.81
0.43 0.38 0.37 0.67 0.5 0.63 0.07 0.51 0.91
0.42 0.39 0.55 0.4 0.37 0.5 0.1 0.36 0.22
0.7 0.22 0.5 0.36 0.93 0.9 0.5 0.22 0.94
0.79 0.47 0.64 1 0.49 0.64 0.78 0.5 0.43
0.72 0.32 0.96 0.19 0.09 0.78 0.06 0.57 0.5]; % DM1中第1个相关者的原始决策矩阵
F12=[0.5 0.83 0.99 0.87 0.22 0.77 0.78 0.82 0.25
0.17 0.5 0.46 0.87 0.6 0.09 0.37 0.32 0.08
0.01 0.54 0.5 0.35 0.63 0.99 0.66 0.18 0.39
0.13 0.13 0.65 0.5 0.52 0.91 0.47 0.3 0.79
0.78 0.4 0.37 0.48 0.5 0.77 1 0.28 0.91
0.23 0.91 0.01 0.09 0.23 0.5 0.06 0.62 0.5
0.22 0.63 0.34 0.53 0 0.94 0.5 0.52 0.29
0.18 0.68 0.82 0.7 0.72 0.38 0.48 0.5 0.44
0.75 0.92 0.61 0.21 0.09 0.5 0.71 0.56 0.5];% DM1中第2个相关者的原始决策矩阵
F13=[0.5 0.88 0.46 0.82 0.48 0.88 0.95 0.42 0.77
0.12 0.5 0.94 0.88 0.37 0.7 0.26 0.28 0.11
0.54 0.06 0.5 0.62 0.49 0.47 0.72 0.71 0.7
0.18 0.12 0.38 0.5 0.74 0.54 0.54 0.63 0.35
0.52 0.63 0.51 0.26 0.5 0.02 0.03 0.36 0.71
0.12 0.3 0.53 0.46 0.98 0.5 0.72 0.49 0.69
0.05 0.74 0.28 0.46 0.97 0.28 0.5 0.35 0.35
0.58 0.72 0.29 0.37 0.64 0.51 0.65 0.5 0.98
0.23 0.89 0.3 0.65 0.29 0.31 0.65 0.02 0.5];% DM1中第3个相关者的原始决策矩阵
F21=[0.5 0.43 0.21 0.28 0.54 0.7 0.17 0.58 0.28
0.57 0.5 0.58 0.97 0.07 0.29 0.02 0.11 0.66
0.79 0.42 0.5 0.4 0.42 0.26 0.29 0.99 0.7
0.72 0.03 0.6 0.5 0.36 0.97 0.28 0.92 0.05
0.46 0.93 0.58 0.64 0.5 0.3 0.46 0.53 0.28
0.3 0.71 0.74 0.03 0.7 0.5 0.7 0.01 0.25
0.83 0.98 0.71 0.72 0.54 0.3 0.5 0.95 0.74
0.42 0.89 0.01 0.08 0.47 0.99 0.05 0.5 0.65
0.72 0.34 0.3 0.95 0.72 0.75 0.26 0.35 0.5]; % DM2中第1个相关者的原始决策矩阵
F22=[0.5 0.07 0.95 0.19 0.44 0.49 0.08 0.81 0.77
0.93 0.5 0.25 0.09 0.49 0.25 0.83 0.28 0.29
0.05 0.75 0.5 0.07 0.15 0.1 0.33 0.62 0.83
0.81 0.91 0.93 0.5 0.43 0.35 0.89 0.47 0.68
0.56 0.51 0.85 0.57 0.5 0.01 0.94 0.98 0.32
0.51 0.75 0.9 0.65 0.99 0.5 0.05 0.41 0.24
0.92 0.17 0.67 0.11 0.06 0.95 0.5 0.41 0.05
0.19 0.72 0.38 0.53 0.02 0.59 0.59 0.5 0.51
0.23 0.71 0.17 0.32 0.68 0.76 0.95 0.49 0.5]; % DM2中第2个相关者的原始决策矩阵
F23=[0.5 0.31 0.23 0.4 0.75 0.93 0.38 0.44 0.21
0.69 0.5 0.41 0.98 0.7 0.93 0.76 0.12 0.04
0.77 0.59 0.5 0.55 0.78 0.09 0.81 0.91 0.25
0.6 0.02 0.45 0.5 0.83 0.3 0.28 0.94 0.21
0.25 0.3 0.22 0.17 0.5 0.71 0.04 0.1 0.13
0.07 0.07 0.91 0.7 0.29 0.5 0.3 0.4 0.02
0.62 0.24 0.19 0.72 0.96 0.7 0.5 0.34 0.57
0.56 0.88 0.09 0.06 0.9 0.6 0.66 0.5 0.67
0.79 0.96 0.75 0.79 0.87 0.98 0.43 0.33 0.5]; % DM2中第3个相关者的原始决策矩阵
adjusted_F11=sdpvar(m,m,'full'); % DM1中第1个相关者的调整决策矩阵
adjusted_F12=sdpvar(m,m,'full');
adjusted_F13=sdpvar(m,m,'full');
adjusted_F1=sdpvar(m,m,'full'); % DM1的调整群体意见
p1=sdpvar(m,1,'full'); % DM1的调整群体意见向量
adjusted_F21=sdpvar(m,m,'full'); % DM2中第1个相关者的调整决策矩阵
adjusted_F22=sdpvar(m,m,'full');
adjusted_F23=sdpvar(m,m,'full');
adjusted_F2=sdpvar(m,m,'full'); % DM2的调整群体意见
p2=sdpvar(m,1,'full'); % DM2的调整群体意见向量
%x11=binvar(m,m,'full'); % 0-1变量,如果F11的(i,j)位置元素调整,则x11(i,j)=1,否则x11(i,j)=0
%x12=binvar(m,m,'full');
%x13=binvar(m,m,'full');
%x21=binvar(m,m,'full');
%x22=binvar(m,m,'full');
%x23=binvar(m,m,'full');
%d11=sdpvar(m,m,'full'); % 辅助求解x11的变量
%d12=sdpvar(m,m,'full');
%d13=sdpvar(m,m,'full');
%d21=sdpvar(m,m,'full');
%d22=sdpvar(m,m,'full');
%d23=sdpvar(m,m,'full');
P1Z=binvar(m,m,'full'); % DM1的偏好矩阵 P1+
J1J=binvar(m,m,'full'); % J1J 为 DM1 的可达改良矩阵 J1+
PF1Z=sdpvar(m,m,'full'); % DM1的偏好矩阵 P1-=
PF1ZT=sdpvar(m,m,'full'); % DM1的 P1-= 的转置
JP1=sdpvar(m,m,'full'); % JP1 为 J2*(P1-=)T
A1=binvar(m,m,'full'); % A 为 sign(J2*(P1-=)T)
B1=sdpvar(m,m,'full'); % B 为 E-sign(J2*(P1-=)T)
GMRR1=sdpvar(m,m,'full'); % DM1 的 GMR矩阵
k=128; %二进制扩展线性化相乘变量
Z1=sdpvar(m,m,k,'full');
V1=sdpvar(m,m,k,'full');
O1=sdpvar(m,m,k,'full');
Q1=sdpvar(m,m,k,'full');
y1=binvar(m,m,k,'full');
P2Z=binvar(m,m,'full'); % DM2的偏好矩阵 P2+
J2J=binvar(m,m,'full'); % J2J 为 DM2 的可达改良矩阵 J2+
PF2Z=sdpvar(m,m,'full'); % DM2的偏好矩阵 P2-=
PF2ZT=sdpvar(m,m,'full');% DM2的 P2-= 的转置
JP2=sdpvar(m,m,'full');% JP2 为 J1+*(P2-=)T
A2=binvar(m,m,'full');% A2 为 sign(J1+*(P2-=)T)
B2=sdpvar(m,m,'full'); % B2 为 E-sign(J1+*(P2-=)T)
SEQ2=sdpvar(m,m,'full');% DM2 的 SEQ矩阵
U2=sdpvar(m,m,k,'full');
V2=sdpvar(m,m,k,'full');
O2=sdpvar(m,m,k,'full');
M2=sdpvar(m,m,k,'full');
y2=binvar(m,m,k,'full');
S11=sdpvar(m,m,'full'); % DM1中第1个相关者的总调整量
S12=sdpvar(m,m,'full');
S13=sdpvar(m,m,'full');
S21=sdpvar(m,m,'full');% DM2中第1个相关者的总调整量
S22=sdpvar(m,m,'full');
S23=sdpvar(m,m,'full');
Constraints=[];
% 求解调整的群体决策矩阵和群体偏好向量
Constraints = [Constraints; adjusted_F11*0.2+adjusted_F12*0.4+adjusted_F13*0.4==adjusted_F1]; % 求解 DM1 的调整群体决策矩阵
Constraints = [Constraints; adjusted_F21*0.2+adjusted_F22*0.4+adjusted_F23*0.4==adjusted_F2]; % 求解 DM2 的调整群体决策矩阵
Constraints = [Constraints, sum(adjusted_F1,2)==p1]; %求解 DM1 的调整群体偏好向量
Constraints = [Constraints, sum(adjusted_F2,2)==p2]; %求解 DM2 的调整群体偏好向量
Constraints = [Constraints, p1>=0];
Constraints = [Constraints, p2>=0];
% 加性偏好关系基本约束
for i=1:9
for j=1:9
Constraints = [Constraints; adjusted_F11(i,j)+adjusted_F11(j,i)==1];
Constraints = [Constraints; adjusted_F12(i,j)+adjusted_F12(j,i)==1];
Constraints = [Constraints; adjusted_F13(i,j)+adjusted_F13(j,i)==1];
Constraints = [Constraints; adjusted_F21(i,j)+adjusted_F21(j,i)==1];
Constraints = [Constraints; adjusted_F22(i,j)+adjusted_F22(j,i)==1];
Constraints = [Constraints; adjusted_F23(i,j)+adjusted_F23(j,i)==1];
end
end
Constraints = [Constraints, (0<=adjusted_F11)&(adjusted_F11<=1)];
Constraints = [Constraints, (0<=adjusted_F12)&(adjusted_F12<=1)];
Constraints = [Constraints, (0<=adjusted_F13)&(adjusted_F13<=1)];
Constraints = [Constraints, (0<=adjusted_F21)&(adjusted_F21<=1)];
Constraints = [Constraints, (0<=adjusted_F22)&(adjusted_F22<=1)];
Constraints = [Constraints, (0<=adjusted_F23)&(adjusted_F23<=1)];
% 求解可达改良矩阵 J1J(J1+) J2J(J2+) 偏好矩阵P1Z(P1+)P2Z(P2+)
for i=1:9
for j=1:9
Constraints=[Constraints, (-100*(1-J1J(i,j))+0.01<=J1(i,j)*(p1(j)-p1(i)))&(J1(i,j)*(p1(j)-p1(i))<=100*J1J(i,j))]; % 求解 DM1 的可达改良矩阵 J1J(J1+)
Constraints = [Constraints, J1J(i,j) <= (J1(i,j)*(p1(j)-p1(i))+1)/2];
Constraints = [Constraints, J1J(i,j) >= J1(i,j)*(p1(j)-p1(i))];
Constraints=[Constraints, (-100*(1-J2J(i,j))+0.01<=J2(i,j)*(p2(j)-p2(i)))&(J2(i,j)*(p2(j)-p2(i))<=100*J2J(i,j))]; % 求解DM2 的可达改良矩阵 J2J(J2+)
Constraints = [Constraints, J2J(i,j) <= (J2(i,j)*(p2(j)-p2(i))+1)/2];
Constraints = [Constraints, J2J(i,j) >= J2(i,j)*(p2(j)-p2(i))];
Constraints=[Constraints, (-100*(1-P1Z(i,j))+0.01<=p1(j)-p1(i))&(p1(j)-p1(i)<=100*P1Z(i,j))]; %求解 DM1 的 偏好矩阵P1Z(P1+)
Constraints = [Constraints, P1Z(i,j) <= (p1(j)-p1(i)+1)/2];
Constraints = [Constraints, P1Z(i,j) >= p1(j)-p1(i)];
Constraints=[Constraints, (-100*(1-P2Z(i,j))+0.01<=p2(j)-p2(i))&(p2(j)-p2(i)<=100*P2Z(i,j))];% 求解DM2 的 偏好矩阵P2Z(P2+)
Constraints = [Constraints, P2Z(i,j) <= (p2(j)-p2(i)+1)/2];
Constraints = [Constraints, P2Z(i,j) >= p2(j)-p2(i)];
end
end
% 求解 DM1 的 偏好矩阵 PF1Z(P1-=) DM2 的 偏好矩阵 PF2Z(P2-=)
Constraints=[Constraints, PF1Z ==E-O-P1Z];
Constraints=[Constraints, PF2Z ==E-O-P2Z];
% 求解 DM1 的 GMR矩阵
Constraints=[Constraints, PF1ZT==transpose(PF1Z)];
Constraints=[Constraints, JP1==J2*PF1ZT];
Constraints=[Constraints, 100*A1>=JP1];
Constraints=[Constraints, A1<=100*JP1];
Constraints=[Constraints, B1==E-A1];
%二进制扩展求解GMRR1==J1J*B1 将J1J*B1线性化
for i=1:9
for j=1:9
for s=1:128
Constraints=[Constraints, V1(i,j,s)==B1(i,j)-Z1(i,j,s)];
Constraints=[Constraints, O1(i,j,s)==(2^(s-1))*y1(i,j,s)];
Constraints=[Constraints, Q1(i,j,s)==(2^(s-1))*Z1(i,j,s)];
end
end
end
Constraints=[Constraints, (0<=V1)&(V1<=100*(1-y1))];
Constraints=[Constraints, (0<=Z1)&(Z1<=100*y1)];
Constraints=[Constraints, J1J==(1/(2^k))*sum(O1,3)];
Constraints=[Constraints, (1/(2^k))*sum(Q1,3)==GMRR1];
% 求解 DM2 的 SEQ矩阵
Constraints=[Constraints, PF2ZT==transpose(PF2Z)];
Constraints=[Constraints, JP2==J1*PF2ZT]; % GMR 与 SEQ 差别就在这里
Constraints=[Constraints, 100*A2>=JP2];
Constraints=[Constraints, A2<=100*JP2];
Constraints=[Constraints, B2==E-A2];
%二进制扩展求解SEQ2==J2J*B2 将J2J*B2线性化
for i=1:9
for j=1:9
for s=1:128
Constraints=[Constraints, V2(i,j,s)==B2(i,j)-U2(i,j,s)];
Constraints=[Constraints, O2(i,j,s)==(2^(s-1))*y2(i,j,s)];
Constraints=[Constraints, M2(i,j,s)==(2^(s-1))*U2(i,j,s)];
end
end
end
Constraints=[Constraints, (0<=V2)&(V2<=100*(1-y2))];
Constraints=[Constraints, (0<=U2)&(U2<=100*y2)];
Constraints=[Constraints, J2J==(1/(2^k))*sum(O2,3)];
Constraints=[Constraints, (1/(2^k))*sum(M2,3)==SEQ2];
% 指定均衡解 无论如何修改这两个约束条件 求解到的结果都是一样的 这不符合逻辑 这两个约束条件没有满足
Constraints=[Constraints, GMRR1(1,1)==0]; %要求第3个方案为DM1的GMRR解
Constraints=[Constraints, SEQ2(1,1)==0]; %要求第3个方案为DM2的SEQ解
% 求解每个相关者的调整量矩阵
Constraints=[Constraints, (-F11+adjusted_F11<=S11)&(F11-adjusted_F11<=S11)];
Constraints=[Constraints, (-F12+adjusted_F12<=S12)&(F12-adjusted_F12<=S12)];
Constraints=[Constraints, (-F13+adjusted_F13<=S13)&(F13-adjusted_F13<=S13)];
Constraints=[Constraints, (-F21+adjusted_F21<=S21)&(F21-adjusted_F21<=S21)];
Constraints=[Constraints, (-F22+adjusted_F22<=S22)&(F22-adjusted_F22<=S22)];
Constraints=[Constraints, (-F23+adjusted_F23<=S23)&(F23-adjusted_F23<=S23)];
% 求解每个相关者调整元素的个数
% 求解x11
%Constraints=[Constraints, 100*x11>=d11];
%Constraints=[Constraints, x11<=100*d11];
%Constraints=[Constraints, (-d11<=F11-adjusted_F11)&(F11-adjusted_F11<=d11),d11>=0];
% 求解x12
%Constraints=[Constraints, 100*x12>=d12];
%Constraints=[Constraints, x12<=100*d12];
%Constraints=[Constraints, (-d12<=F12-adjusted_F12)&(F12-adjusted_F12<=d12),d12>=0];
%Constraints=[Constraints, 100*x13>=d13];
%Constraints=[Constraints, x13<=100*d13];
%Constraints=[Constraints, (-d13<=F13-adjusted_F13)&(F13-adjusted_F13<=d13),d13>=0];
%Constraints=[Constraints, 100*x21>=d21];
%Constraints=[Constraints, x21<=100*d21];
%Constraints=[Constraints, (-d21<=F21-adjusted_F21)&(F21-adjusted_F21<=d21),d21>=0];
%Constraints=[Constraints, 100*x22>=d22];
%Constraints=[Constraints, x22<=100*d22];
%Constraints=[Constraints, (-d22<=F22-adjusted_F22)&(F22-adjusted_F22<=d22),d22>=0];
%Constraints=[Constraints, 100*x23>=d23];
%Constraints=[Constraints, x23<=100*d23];
%Constraints=[Constraints, (-d23<=F23-adjusted_F23)&(F23-adjusted_F23<=d23),d23>=0];
% 目标函数
z1=sum(S11(:))+sum(S12(:))+sum(S13(:))+sum(S21(:))+sum(S22(:))+sum(S23(:)); % 目标函数为最小化总调整量
%z1=sum(x11(:))+sum(x12(:))+sum(x13(:))+sum(x21(:))+sum(x22(:))+sum(x23(:)); % 目标函数为最小化调整元素个数
% 求解优化模型
ops=sdpsettings('solver', 'gurobi', 'verbose', 1); %求解
sol=optimize(Constraints, z1, ops); %求解
if sol.problem == 0
value(adjusted_F11),
value(adjusted_F12),
value(adjusted_F13),
value(adjusted_F1),
value(p1),
value(adjusted_F21),
value(adjusted_F22),
value(adjusted_F23),
value(adjusted_F2),
value(p2),
value(P1Z),
value(J1J),
value(PF1Z),
value(PF1ZT),
value(JP1),
value(A1),
value(B1),
value(GMRR1),
value(P2Z),
value(J2J),
value(PF2Z),
value(PF2ZT),
value(JP2),
value(A2),
value(B2),
value(SEQ2),
value(S11),
value(S12),
value(S13),
value(S21),
value(S22),
value(S23),
value(z1)
else
disp(sol.info)
end
%检查是否满足约束条件
if any(check(Constraints) > 1e-6)
error('Constraints not satisfied');
end