单纯形表的matlab输出,自编MATLAB版单纯性算法 可以列出单纯形表以及其他相关数据...
自编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版单纯性算法 可以列出单纯形表以及其他相关数据...相关推荐
- matlab 输出矩阵 逗号,matlab 矩阵输出的数值之间同时需要字符串
matlab 矩阵输出的数值之间同时需要字符串 mip版 关注:235 答案:3 悬赏:30 解决时间 2021-01-20 04:07 已解决 2021-01-19 06:57 我用如下的程序 ...
- matlab输出c语言,MATLAB数据输入和输出 C语言转换
数据输入和输出 一.概述 MATLAB可读和写的文件格式: 文件格式文件内容扩展名读.写文件的函数MATLAB 保存的MA TLAB工作区.mat load,save 文本Text 任意textsca ...
- matlab输出斜杠,MATLAB中的反斜杠运算符用于向量
正如其他人所说,这个系统是不确定的(正如丹尼斯所说的那样).由于你有一些后续问题,让我进一步深入. 在A中有一行,你基本上有一个等式,有7个未知数.你基本上可以将任何6个未知数设置为零,然后求解为7. ...
- js页面初始化方法只调用一次_跟我学 “Linux” 小程序 Web 版开发(三):云开发相关数据调用
介绍 在完成了界面的实现后,接下来可以开始进行和云开发相关的数据对接.完成数据对接后,应用基础就打好了,接下来的就是发布上线以及一些小的功能的加入. 配置 在进行相关的配置调用的时候,你需要先登录腾讯 ...
- matlab离散系统 响应,离散系统的频率响应和输出响应的matlab实现
离散系统的频率响应和输出响应的matlab实现 上海电力学院 信号与系统实验报告 题目:离散系统的频率响应和输出响应 班级: 2011023 专业:电气工程及其自动化 学号:20111257 2013 ...
- 《数字图像处理与机器视觉——Visual C++与Matlab实现(第2版)》——1.2 数字图像处理与机器视觉...
本节书摘来自异步社区出版社<Visual C++ 2012 开发权威指南>一书中的第1章,第1.2节,作者: 张铮 , 徐超 , 任淑霞 , 韩海玲,更多章节内容可以访问云栖社区" ...
- 基于matlab的卷积码实验报告,基于MATLAB的卷积码编译码设计仿真.doc
摘要:在数字信号的传输过程中,会受到信道特性不理想和噪声的影响,通常采用差错控制编码来提高系统的可靠性.卷积码是P.Elias等人提出的,这一编码技术至今广泛使用.目前,卷积码已普遍在无线通信标准使用 ...
- matlab安装到U盘,matlab u盘便携移动版
Matlab u盘便携移动版是一款功能强大的编程工具,能够帮助用户轻松进行各种数据的开发分析工作,提高编程效率,让工作更加轻松.软件为U盘便携版本,插入U盘即可直接使用,无需环境的组装,满足用户的各种 ...
- 牛顿法的matlab实现例题,【MATLAB|MATLAB牛顿插值法例题与程序Word版】
『易坊知识库摘要_MATLAB|MATLAB牛顿插值法例题与程序Word版』x12345678y22.523.324.421.7025.228.524.825.4二.数学原理假设有n+1个不同的节点及 ...
最新文章
- 某大厂程序员抱怨:“大厂镀金”是鬼话!从大厂裸辞后,面阿里、字节全都挂掉,连货拉拉都不要自己!...
- Deep Web爬虫
- Linux对用户态的动态内存管理
- How your face shapes your economic chances
- android 截屏指定区域,Android截图 截取ContentView 截取指定的View并且保存
- Android 热修复之DexPatch 介绍
- python 图像无缝拼接,OpenCV Python 系列教程3 - Core 组件
- LeetCode 1031. 两个非重叠子数组的最大和(一次遍历,要复习)*
- 动态参数 maven_Spring Security 动态url权限控制(三)
- 江西计算机类单招学校有哪些专业,江西省2021年单招学校有哪些专业适合女生...
- html js 读取资源文件,使用HTML5和JQuery读取CSV(Text)文件的实例
- struts2和hibernate(2012/2/26)
- python客户端与服务器端通信_python客户端与服务器端的通信
- Python基础教程笔记——列表和元组
- python调用扬声器、摄像头
- 为了对电脑进行保护,已经阻止此应用。
- 如何和下属谈心(转)
- hive调优fetch模式抓取,join表测试空key自动转换random,mapreduce动态分区设置
- linux为什么要关闭防火墙,Linux怎么样关闭防火墙
- 扛住时间,不负自我,37岁自学计算机语言-Python的后果
热门文章
- 【Spring】Spring 依赖注入之手动注入
- 【多线程】LockSupport 使用 原理 源码 分析
- 【MySQL】小表驱动大表
- 【Docker】 Docker pull的时候指定仓库
- 【Hadoop】Bad connect ack with firstBadLink as ×.×.×.×:50010
- 【Siddhi】DefinitionNotExistException: Stream with stream ID xxx has not been defined
- Arrays工具类和二维数组
- docker环境搭建redis-cluster集群(多台机器)
- 剑指Offer30-包含min函数的栈(单调栈)
- Never Wait for Weights(带权并查集+路径压缩)