蝴蝶破蛹¥ 2024-05-17 10:01 采纳率: 22.2%
浏览 14
已结题

yalmip+Gurobi

用yalmip+Gurobi求解优化模型,求解结果显示正确,但是结果不满足约束条件,不知道哪里出问题了。求帮我看看!!
代码如下:

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.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中第1个相关者的原始决策矩阵

F23=[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]; % DM2中第3个相关者的原始决策矩阵

adjusted_F11=sdpvar(m,m,'full'); % DM1中第1个相关者的调整决策矩阵
p1=sdpvar(m,1,'full'); % DM1的调整群体意见向量

adjusted_F23=sdpvar(m,m,'full');
p2=sdpvar(m,1,'full'); % DM2的调整群体意见向量

x11=binvar(m,m,'full'); % 0-1变量,如果F11的(i,j)位置元素调整,则x11(i,j)=1,否则x11(i,j)=0
x23=binvar(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');
d_J1J=1/(2^k);


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');
d_J2J=1/(2^k);



S11=sdpvar(m,m,'full'); % DM1中第1个相关者的总调整量
S23=sdpvar(m,m,'full');

CI11=sdpvar(1,1); % adjusted_F11的一致性指数
CI23=sdpvar(1,1);

Constraints=[];

% 求解调整的群体决策矩阵和群体偏好向量
Constraints = [Constraints, sum(adjusted_F11,2)==p1]; %求解 DM1 的调整群体偏好向量
Constraints = [Constraints, sum(adjusted_F23,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];
    end
end

for i=1:9
    for j=1:9
        Constraints = [Constraints, adjusted_F23(i,j)+adjusted_F23(j,i)==1];
    end
end

Constraints = [Constraints, 0<=adjusted_F11<=1];
Constraints = [Constraints, 0<=adjusted_F23<=1];

% 求解 DM1 的可达改良矩阵 J1J(J1+)  DM2 的可达改良矩阵 J2J(J2+)

for i=1:9
    for j=1:9
        Constraints=[Constraints, -100000*(1-J1J(i,j))+0.00000001<=J1(i,j)*(p1(j)-p1(i))<=1000000*J1J(i,j)];
    end
end


for i=1:9
    for j=1:9
        Constraints=[Constraints, -100000*(1-J2J(i,j))+0.00000001<=J2(i,j)*(p2(j)-p2(i))<=1000000*J2J(i,j)];
    end
end



% 求解 DM1 的 偏好矩阵P1Z(P1+)   DM2 的 偏好矩阵P2Z(P2+)
% 求解结果不满足约束条件:p1(j)-p1(i)>0时,P1Z(i,j)=1;p1(j)-p1(i)<0或=0时,P1Z(i,j)=0.该数学转化公式已验证正确
for i=1:9
    for j=1:9
        Constraints=[Constraints, -100000*(1-P1Z(i,j))+0.00000001<=p1(j)-p1(i)<=1000000*P1Z(i,j)];
    end
end

for i=1:9
    for j=1:9
        Constraints=[Constraints, -100000*(1-P2Z(i,j))+0.00000001<=p2(j)-p2(i)<=1000000*P2Z(i,j)];
    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, 10000*A1>=JP1];
Constraints=[Constraints, A1<=10000*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)];
        end
    end
end

Constraints=[Constraints, (0<=V1)&(V1<=1000*(1-y1))];
Constraints=[Constraints, (0<=Z1)&(Z1<=1000*y1)];

for i=1:9
    for j=1:9
        for s=1:128
            Constraints=[Constraints, O1(i,j,s)==(2^(s-1))*y1(i,j,s)];
        end
    end
end

for i=1:9
    for j=1:9
        for s=1:128
            Constraints=[Constraints, Q1(i,j,s)==(2^(s-1))*Z1(i,j,s)];
        end
    end
end

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, 10000*A2>=JP2];
Constraints=[Constraints, A2<=10000*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)];
        end
    end
end

Constraints=[Constraints, (0<=V2)&(V2<=1000*(1-y2))];
Constraints=[Constraints, (0<=U2)&(U2<=1000*y2)];

for i=1:9
    for j=1:9
        for s=1:128
            Constraints=[Constraints, O2(i,j,s)==(2^(s-1))*y2(i,j,s)];
        end
    end
end

for i=1:9
    for j=1:9
        for s=1:128
            Constraints=[Constraints, M2(i,j,s)==(2^(s-1))*U2(i,j,s)];
        end
    end
end

Constraints=[Constraints, J2J==(1/(2^k))*sum(O2,3)];
Constraints=[Constraints, (1/(2^k))*sum(M2,3)==SEQ2];


% 指定均衡解
Constraints=[Constraints, GMRR1(2,2)==0];  %要求第3个方案为DM1的GMRR解
Constraints=[Constraints, SEQ2(2,2)==0]; %要求第3个方案为DM2的SEQ解

% 求解每个相关者的调整量矩阵
Constraints=[Constraints, abs(F11-adjusted_F11)==S11]; % DM1中第1个相关者的调整量矩阵
Constraints=[Constraints, abs(F23-adjusted_F23)==S23];

% 求解每个相关者调整元素的个数
Constraints=[Constraints, abs(adjusted_F11-F11)<=100*x11]; %求解x11
Constraints=[Constraints, -100*(1-x11)+0.0001<=abs(adjusted_F11-F11)];%求解x11

Constraints=[Constraints, abs(adjusted_F23-F23)<=100*x23]; %求解x23
Constraints=[Constraints, -100*(1-x23)+0.0001<=abs(adjusted_F23-F23)];%求解x23

% 目标函数
z1=sum(S11(:))+sum(S23(:)); % 目标函数为最小化总调整量

% 求解优化模型
ops=sdpsettings('solver', 'gurobi', 'verbose', 0,'gurobi.NumericFocus' , 3); %求解
optimize(Constraints,z1,ops)
value(GMRR1),value(J1J),value(P1Z),value(A1),value(JP1),value(SEQ2),value(J2J),value(P2Z),value(A2),value(JP2),value(p1),value(p2)



  • 写回答

23条回答 默认 最新

  • 叫兽-郭老师 Java领域新星创作者 2024-05-17 10:02
    关注

    🕖上午好,题主!目前:🟢[在线]
    📢参考通义千问、由郭老师整理提供!
    📣今日诗号:昂首千丘远,啸傲风间。堪寻敌手共论剑,高处不胜寒。

    根据您提供的代码,您在求解优化模型时遇到了约束条件不满足的问题。具体来说,您提到对于约束 p1(j)-p1(i)>0 时, P1Z(i,j) 应该为 1,而对于 p1(j)-p1(i)<0=0 时,P1Z(i,j) 应该为 0,但求解结果不满足此约束。

    为了解决这个问题,您需要在约束中使用二进制变量。修改后的约束如下:

    % 求解 DM1 的偏好矩阵 P1Z(P1+)
    for i=1:9
        for j=1:9
            Constraints = [Constraints, -100000*(1-P1Z(i,j)) + 0.00000001 <= p1(j)-p1(i) <= 1000000*P1Z(i,j)];
            Constraints = [Constraints, P1Z(i,j) <= (p1(j)-p1(i)+1)/2];
            Constraints = [Constraints, P1Z(i,j) >= p1(j)-p1(i)];
        end
    end
    

    对于 DM2 的偏好矩阵 P2Z,您需要进行类似的修改。需要注意的是,在二进制扩展中,约束 0<=Z10<=U2 也应该是 0<=Z1<=1000*(1-y1)0<=U2<=1000*(1-y2)

    以下是修改后的完整代码:

    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 1 0 0 1 0 0;
    0 0 0 0 1 0 0 1 0;
    0 0 0 0 0 1 0 0 1]; % 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 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 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.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中第1个相关者的原始决策矩阵
    F23 = [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]; % DM2中第3个相关者的原始决策矩阵
    
    % DM1中第1个相关者的调整决策矩阵
    adjusted_F11 = sdpvar(m, m, 'full');
    % DM1的调整群体意见向量
    p1 = sdpvar(m, 1, 'full');
    % DM2的调整群体意见向量
    adjusted_F23 = sdpvar(m, m, 'full');
    p2 = sdpvar(m, 
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(22条)

报告相同问题?

问题事件

  • 系统已结题 5月31日
  • 已采纳回答 5月23日
  • 创建了问题 5月17日

悬赏问题

  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错
  • ¥15 拓扑学,凸集,紧集。。
  • ¥15 如何扩大AIS数据容量
  • ¥15 单纯型python实现编译报错
  • ¥15 c++2013读写oracle
  • ¥15 c++ gmssl sm2验签demo
  • ¥15 关于模的完全剩余系(关键词-数学方法)
  • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助