自编MATLAB版单纯性算法 可以列出单纯形表以及其他相关数据

function [dcxb,x,fval,exitflag,flag]=simplex(f,A,b,Aeq,beq)

%本程序相关说明:

%(1)本函数基本使用方法与MATLAB自身函数使用方法类似

%(2)dcxb表示整个过程的单纯形表,flag=1表示没有出现退化情况,flag=-1表示出现退化情况,改为依照勃兰德法则确定进基变量和出基变量

%(3)程序运行结果dcxb中inf无意义,表的第一行两inf中间的数字表示变量的下标,本程序默认变量下标从1开始

%(4)dcxb其余各行如果仅仅行首和行尾出现inf,则两inf中间内容为检验数

%(5)dcxb第一列列相邻两inf间的内容为基变量的下标

%(6)exitflag为负表示无解,此时x,fval并不是相应的基可行解和最有值,仅仅代表程序中止时的基解和该基解所对应的函数值

%(7)函数名暂时命名为simplex,simplex是谷歌翻译给出的单纯形法的英文翻译,不知是否为专业术语

%(8)flag=-1时dcxb中会出现一行全为inf,无实际意义,仅表示该行一下依照勃兰德法则确定进基变量和出基变量(参见用法示例(2))

%(9)其他参数与linprog中相应参数意义相似

%(10)exitflag=1表示有唯一最优解,exitflag=2表示有无穷解,exitflag=-1表示目标函数无下界,exitflag=-2表示可行域为空

%(11)flag=2表示用到了两阶段法,此时程序运行结果将出现“第一阶段单纯形表为”“第二阶段单纯形表为”字样,并显示两个阶段各自的单纯形表,详见用法示例(3)

%用法示例(1):题目为束金龙编的《线性规划理论与模型应用》P44第23题(1)小题

%在命令窗口依次输入以下语句:

%f=[1 -2 1 -3]';

%A=[1 1 3 1;0 -2 1 1;0 -1 6 -1];

%b=[6 3 4]';

%[dcxb,x,fval,exitflag,flag]=simplex(f,A,b)

%用法示例(2):题目为束金龙编的《线性规划理论与模型应用》P23例1.8

%命令窗口输入的命令为:

%f=[-0.75 20 -0.5 6 0 0 0]';

%Aeq=[0.25 -8 -1 9 1 0 0;0.5 -12 -0.5 3 0 1 0;0 0 1 0 0 0 1];

%A=[];

%b=[];

%beq=[0 0 1]';

%[dcxb,x,fval,exitflag,flag]=simplex(f,A,b,Aeq,beq)

%用法示例(3):题目为课本《线性规划理论与模型应用》P29例1.9

%命令窗口输入的命令为:

%f=[1 -2]';

%A=[-1 -1;1 -1;0 1];

%b=[-2 -1 3]';

%[dcxb,x,fval,exitflag,flag]=simplex(f,A,b)

flag=1;

if nargin < 5, beq = [];

if nargin < 4, Aeq = [];

end

end

[A_m,A_n]=size(A);

[Aeq_m,Aeq_n]=size(Aeq);

bb=[b;beq];

m=A_m+Aeq_m;

n = max([length(f),A_n,Aeq_n]); % In case A is empty

if isempty(f), f=zeros(n,1); end%4

if isempty(A), A=zeros(0,n); end

if isempty(b), b=zeros(0,1); end

if isempty(Aeq), Aeq=zeros(0,n); end

if isempty(beq), beq=zeros(0,1); end

if(all(b>=0)==0)

flag=3;

b_len=length(b);

k=1;

for r=1:inf

if(k<=b_len)

if b(k)<0

Aeq=[Aeq,zeros(Aeq_m,1);A(k,:),1];%1%5

beq=[beq;b(k)];%2

A=[A(1:k-1,:);A(k+1:A_m,:)];%3

A=[A,zeros(A_m-1,1)];

b=[b(1:k-1);b(k+1:A_m)];

k=k-1;

b_len=b_len-1;

A_m=A_m-1;

Aeq_m=Aeq_m+1;

Aeq_n=Aeq_n+1;

f=[f;0];

else

Aeq=[Aeq,zeros(Aeq_m,1);A(k,:),1];

beq=[beq;b(k)];

A=[A(1:k-1,:);A(k+1:A_m,:)];

A=[A,zeros(A_m-1,1)];

b=[b(1:k-1);b(k+1:A_m)];

k=k-1;

b_len=b_len-1;

A_m=A_m-1;

Aeq_m=Aeq_m+1;

Aeq_n=Aeq_n+1;

f=[f;0];

end

k=k+1;

else break;

end

end

A=[];

b=[];

end

for k=1:Aeq_m

if beq(k)<0

Aeq(k,:)=-Aeq(k,:);

beq(k)=-beq(k);

end

end

[A_m,A_n]=size(A);

[Aeq_m,Aeq_n]=size(Aeq);

bb=[b;beq];

m=A_m+Aeq_m;

n = max([length(f),A_n,Aeq_n]);

if isempty(f), f=zeros(n,1); end

if isempty(A), A=zeros(0,n); end

if isempty(b), b=zeros(0,1); end

if isempty(Aeq), Aeq=zeros(0,n); end

if isempty(beq), beq=zeros(0,1); end

AA=[A;Aeq];

pq=0;

PQ=zeros(n+m,1);

QP=zeros(n,1);

for k=1:n

D=AA(:,k);

[maxk,maxK]=max(D);

[mink,minK]=min(D);

if(maxk~=0)%这种情况是不正确的

if(mink==0)

D(maxK)=0;

maxk=max(D);

if(maxk==0)

pq=pq+1;

PQ(maxK)=k;

QP(pq)=maxK;

for s=1:pq-1

if(A(:,s)==A(:,pq))

pq=pq-1;

end

end

end

end

end

end

PQ=PQ(1:m);

QP=QP(1:pq);

W=eye(m);

for k=1:pq

W(:,QP(k))=zeros(m,1);

end

WW=zeros(m,0);

kk=1;

for k=1:m

if(W(:,k)==zeros(m,1))

else

for r=1:m

if PQ(r)==0

PQ(r)=n+kk;

break;

end

end

WW=[WW,W(:,k)];

kk=kk+1;

end

end

AA=[AA,WW];

Ab=[AA,bb];

FF=zeros(1,m+n-pq);

for r=n+1:m+n-pq

for s=1:m

if AA(s,r)~=0

FF=FF+AA(s,:)/AA(s,r);

end

end

end

TT=f;

FF=[FF(1:n),zeros(1,m-pq)];

if flag==3

ff=-FF';

T=[f;zeros(m-pq,1)];

else

ff=[f;zeros(m-pq,1)];

end

F=ff;

B=PQ;

BB=B;

dcxb=[inf,1:m+n-pq,inf;B,Ab;inf,ff',inf];

for loop=1:inf

[minff,i]=min(ff);

if(flag~=1)

for k=1:i

if(ff(k)<0)

i=k;

break;

end

end

end

C=inf*ones(m,1);

if(minff>=0)

exitflag=1;

break;

else

if(AA(:,i)+abs(AA(:,i))==0)%注意等号

exitflag=-1;%exitflag为负表示无解

dcxb=[dcxb;inf(1,m+n-pq)];

break;

else

for h=1:m

if(AA(h,i)>0)

C(h)=bb(h)/AA(h,i);

end

end

[minC,j]=min(C);

B(j)=i;

Ab(j,:)=Ab(j,:)/Ab(j,i);

ff=ff-AA(j,:)'*ff(i)/AA(j,i);

if flag>1

T=T-AA(j,:)'*T(i)/AA(j,i);

end

for k=1:m

if(k~=j)%不等号<>不对吗?

Ab(k,:)=Ab(k,:)-Ab(j,:)*Ab(k,i)/Ab(j,i);

end

end

bb=Ab(:,n+m-pq+1);

AA=Ab(:,1:n+m-pq);

dcxb=[dcxb;B,Ab;inf,ff',inf];

BB=[BB,B];

end

end

if flag==1

for r=1:(loop)

if(BB(:,r)==BB(:,loop+1))

flag=-1;

dcxb=[dcxb;inf*ones(1,m+n+2-pq)];

break;

end

end

end

end

if flag==3

x=zeros(length(ff),1);

for k=1:m

x(B(k))=bb(k);

end

if x'*ff~=0

exitflag=-2

end

fprintf('本题采用两阶段法求解\n第一阶段单纯形表为:\n')

dcxb

flag=2;

BB=[];

ff=T(1:n);

end

if flag==2

F=ff;

AA=AA(:,1:n);

Ab=[Ab(:,1:n),bb];

BB=B;%%%%%

dcxb=[inf,1:n,inf;B,Ab;inf,ff',inf];

for loop=1:inf

[minff,i]=min(ff);

if(flag==-1)

for k=1:i

if(ff(k)<0)

i=k;

break;

end

end

end

C=inf*ones(m,1);

if(minff>=0)

exitflag=1;

break;

else

if(AA(:,i)+abs(AA(:,i))==0)%注意等号

exitflag=-1;%exitflag为负表示无解

dcxb=[dcxb;inf(1,m+n-pq)];

break;

else

for h=1:m

if(AA(h,i)>0)

C(h)=bb(h)/AA(h,i);

end

end

[minC,j]=min(C);

B(j)=i;

Ab(j,:)=Ab(j,:)/Ab(j,i);

ff=ff-AA(j,:)'*ff(i)/AA(j,i);

for k=1:m

if(k~=j)%不等号<>不对吗?

Ab(k,:)=Ab(k,:)-Ab(j,:)*Ab(k,i)/Ab(j,i);

end

end

bb=Ab(:,n+1);

AA=Ab(:,1:n);

dcxb=[dcxb;B,Ab;inf,ff',inf];

BB=[BB,B];

end

end

if flag==1

for r=1:(loop)

if(BB(:,r)==BB(:,loop+1))

flag=-1;

dcxb=[dcxb;inf*ones(1,n+2)];

break;

end

end

end

end

end

if flag==2

x=zeros(n,1);

F=TT;

fprintf('第二阶段单纯形表为:\n')

else

x=zeros(m+n-pq,1);

end

for k=1:m

x(B(k))=bb(k);

end

if sum(ff==0)~=m

exitflag=2;

end

fval=x'*F;

程序可能会有瑕疵之处  因为我并没有怎么学过程序  MATLAB也是刚接触  若有错误请见谅  但求抛砖引玉

单纯形表的matlab输出,自编MATLAB版单纯性算法 可以列出单纯形表以及其他相关数据...相关推荐

  1. matlab 输出矩阵 逗号,matlab 矩阵输出的数值之间同时需要字符串

    matlab 矩阵输出的数值之间同时需要字符串 mip版  关注:235  答案:3  悬赏:30 解决时间 2021-01-20 04:07 已解决 2021-01-19 06:57 我用如下的程序 ...

  2. matlab输出c语言,MATLAB数据输入和输出 C语言转换

    数据输入和输出 一.概述 MATLAB可读和写的文件格式: 文件格式文件内容扩展名读.写文件的函数MATLAB 保存的MA TLAB工作区.mat load,save 文本Text 任意textsca ...

  3. matlab输出斜杠,MATLAB中的反斜杠运算符用于向量

    正如其他人所说,这个系统是不确定的(正如丹尼斯所说的那样).由于你有一些后续问题,让我进一步深入. 在A中有一行,你基本上有一个等式,有7个未知数.你基本上可以将任何6个未知数设置为零,然后求解为7. ...

  4. js页面初始化方法只调用一次_跟我学 “Linux” 小程序 Web 版开发(三):云开发相关数据调用

    介绍 在完成了界面的实现后,接下来可以开始进行和云开发相关的数据对接.完成数据对接后,应用基础就打好了,接下来的就是发布上线以及一些小的功能的加入. 配置 在进行相关的配置调用的时候,你需要先登录腾讯 ...

  5. matlab离散系统 响应,离散系统的频率响应和输出响应的matlab实现

    离散系统的频率响应和输出响应的matlab实现 上海电力学院 信号与系统实验报告 题目:离散系统的频率响应和输出响应 班级: 2011023 专业:电气工程及其自动化 学号:20111257 2013 ...

  6. 《数字图像处理与机器视觉——Visual C++与Matlab实现(第2版)》——1.2 数字图像处理与机器视觉...

    本节书摘来自异步社区出版社<Visual C++ 2012 开发权威指南>一书中的第1章,第1.2节,作者: 张铮 , 徐超 , 任淑霞 , 韩海玲,更多章节内容可以访问云栖社区" ...

  7. 基于matlab的卷积码实验报告,基于MATLAB的卷积码编译码设计仿真.doc

    摘要:在数字信号的传输过程中,会受到信道特性不理想和噪声的影响,通常采用差错控制编码来提高系统的可靠性.卷积码是P.Elias等人提出的,这一编码技术至今广泛使用.目前,卷积码已普遍在无线通信标准使用 ...

  8. matlab安装到U盘,matlab u盘便携移动版

    Matlab u盘便携移动版是一款功能强大的编程工具,能够帮助用户轻松进行各种数据的开发分析工作,提高编程效率,让工作更加轻松.软件为U盘便携版本,插入U盘即可直接使用,无需环境的组装,满足用户的各种 ...

  9. 牛顿法的matlab实现例题,【MATLAB|MATLAB牛顿插值法例题与程序Word版】

    『易坊知识库摘要_MATLAB|MATLAB牛顿插值法例题与程序Word版』x12345678y22.523.324.421.7025.228.524.825.4二.数学原理假设有n+1个不同的节点及 ...

最新文章

  1. 某大厂程序员抱怨:“大厂镀金”是鬼话!从大厂裸辞后,面阿里、字节全都挂掉,连货拉拉都不要自己!...
  2. Deep Web爬虫
  3. Linux对用户态的动态内存管理
  4. How your face shapes your economic chances
  5. android 截屏指定区域,Android截图 截取ContentView 截取指定的View并且保存
  6. Android 热修复之DexPatch 介绍
  7. python 图像无缝拼接,OpenCV Python 系列教程3 - Core 组件
  8. LeetCode 1031. 两个非重叠子数组的最大和(一次遍历,要复习)*
  9. 动态参数 maven_Spring Security 动态url权限控制(三)
  10. 江西计算机类单招学校有哪些专业,江西省2021年单招学校有哪些专业适合女生...
  11. html js 读取资源文件,使用HTML5和JQuery读取CSV(Text)文件的实例
  12. struts2和hibernate(2012/2/26)
  13. python客户端与服务器端通信_python客户端与服务器端的通信
  14. Python基础教程笔记——列表和元组
  15. python调用扬声器、摄像头
  16. 为了对电脑进行保护,已经阻止此应用。
  17. 如何和下属谈心(转)
  18. hive调优fetch模式抓取,join表测试空key自动转换random,mapreduce动态分区设置
  19. linux为什么要关闭防火墙,Linux怎么样关闭防火墙
  20. 扛住时间,不负自我,37岁自学计算机语言-Python的后果

热门文章

  1. 【Spring】Spring 依赖注入之手动注入
  2. 【多线程】LockSupport 使用 原理 源码 分析
  3. 【MySQL】小表驱动大表
  4. 【Docker】 Docker pull的时候指定仓库
  5. 【Hadoop】Bad connect ack with firstBadLink as ×.×.×.×:50010
  6. 【Siddhi】DefinitionNotExistException: Stream with stream ID xxx has not been defined
  7. Arrays工具类和二维数组
  8. docker环境搭建redis-cluster集群(多台机器)
  9. 剑指Offer30-包含min函数的栈(单调栈)
  10. Never Wait for Weights(带权并查集+路径压缩)