查看: 140|回复: 5|关注: 0

[未答复] MATLAB优化设计单纯形法,输出的最优解不对,但极小值正确

[复制链接]

新手

10 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
发表于 2020-6-28 18:15:53 | 显示全部楼层 |阅读模式
本人MATLAB初学者,最近在学习最优化设计,在网上找到了一个单纯形法的程序,但是运行后发生了如题所示的问题,望各位大神帮忙看一下问题出在哪里,应当怎么解决,感激不尽!

function [x,f]=DCmin(c,A,b,AR,y0,d)
% x: 最优解
% f: 目标函数最优值
% c: 目标函数系数向量
% A: 系数矩阵
% b: m维列向量
% AR: 松弛变量系数矩阵
% y0: 基矩阵初始向量
% d: 补充向量(非目标系数向量, 为一零向量)
N=1000000;
B=[A,AR,b];
[m,n]=size(B);
C=[c,d];
y=y0;
x=zeros(1,length(c));
for k=1:N
    z=B(:,end);%右端
    for j=1:n-1
        a(j)=y*B(:,j)-C(j);%检验数
    end
    f=y*z;
    %%========选取主元==========%%
    %---------选取主列---------%
    [alpha,q]=max(a);
    W(k)=q;%x下标矩阵
    %-------------------------%
    %--------选取主元----------%
    for p=1:m
        if B(p,q)<=0
            r(p)=N;
        else r(p)=z(p)/B(p,q);
        end
    end
    [beta,p]=min(r);
    y(p)=C(q);
    %-------------------------%
    %%==========================%%
    B(p,:)=B(p,:)/B(p,q);
    for i=1:m
        if i~=p
            B(i,:)=B(i,:)-B(p,:)*B(i,q);
        end
    end
    if max(a)<=0
        break;
    end
end
%++++++++++++++++++++++++++++++++++++++%
Z=B(:,end);
if length(x(W))~=length(Z)
    x=char('   NONE');
    f=char('   NONE');
    disp('   不存在有限最优解');
else x(W)=Z';
end

运行情况如下:
>> c=[-2 -3];
A=[1 1;1 2;1 0;0 1];
b=[6;8;4;3];
AR=[1 0 0 0;0 1 0 0;0 0 1 0;0 0 0 1];
y0=[0 0 0 0];
d=[0 0 0 0];
[x,f]=DCmin(c,A,b,AR,y0,d)
??? Index exceeds matrix dimensions.


Error in ==> DCmin at 50
if length(x(W))~=length(Z)


假如说删除掉最后这个判断,运行情况如下:
>> c=[-2 -3];
A=[1 1;1 2;1 0;0 1];
b=[6;8;4;3];
AR=[1 0 0 0;0 1 0 0;0 0 1 0;0 0 0 1];
y0=[0 0 0 0];
d=[0 0 0 0];
[x,f]=DCmin(c,A,b,AR,y0,d)


x =


     2     1     0     0     0     0




f =



   -14


这个结果,最优解不对,但是极小值是正确的。实验过其他例子,发现也是同样的问题。正确答案应当是:x = 4 2 0 0 0 1。还望大神指点!

回复主题 已获打赏: 0 积分

举报

新手

10 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
 楼主| 发表于 2020-6-28 19:38:59 | 显示全部楼层
我用的版本是古早版本了,MATLAB7.0
回复此楼 已获打赏: 0 积分

举报

新手

10 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
 楼主| 发表于 2020-6-28 21:50:10 | 显示全部楼层
我想了想,直接输出z,就是最后解的数值,但是顺序是不对的。要怎么按照下标把这些数字的顺序调整一下:'(
回复此楼 已获打赏: 0 积分

举报

新手

10 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
 楼主| 发表于 2020-6-28 22:23:47 | 显示全部楼层
首先发现,储存下标的矩阵数据好像不对,继续排查
回复此楼 已获打赏: 0 积分

举报

新手

10 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
 楼主| 发表于 2020-6-28 23:06:47 | 显示全部楼层
好像是搞明白了。最后的顺序不对是因为,要按照下标的顺序将这些数进行排列。那新的问题又来了,怎么实现啊.......
回复此楼 已获打赏: 0 积分

举报

新手

10 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
 楼主| 发表于 7 天前 | 显示全部楼层
感谢各位大佬,我已经自己修改明白了。重新建立了一个数组来储存下标。
回复此楼 已获打赏: 0 积分

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表