MATLAB使用单纯形法解决线性规划问题,函数形式调用,举例演示

2023-11-13

        线性规划隶属于范畴学,在现实的应用十分广泛。简单来说,就是自变量在线性约束的条件下,求线性函数的最小值或最大值。对于优化问题,其数学模型往往需要提取出关键的三要素,即:自变量相关的约束条件,自变量的取值范围,关于自变量的目标函数。对于线性规划问题也同样如此。

        我们知道,当线性规划的自变量个数只有两个时,可以通过画图的方式直观求解,但是对于一般的线性规划问题的,常用的是单纯形法。单纯形法的基本思路是,将可行域中某个基本可行解转换到一个新的可行解,同时使得目标函数的值有所改善。注意使用单纯形法求解线性规划问题时,需要把问题抽象出的数学模型的一般形式转换为标准形式,也就是通过引入人工变量,将不等式约束变为等式约束,例如:

需要引入三个人工变量将不等式约束变为等式约束:

 也就是说,使用单纯形法解决线性规划问题,其形式必须为:

​​​​​​​ 下面给出单纯形法的MATLAB代码:

function [x,minf] = SimpleMthd(A,c,b,baseVector)
%约束矩阵:A
%目标函数系数向量:c
%约束右端向量:b
%初始基向量:baseVector
%目标函数取最小值时的自变量值:x
%目标函数的最小值:minf

sz = size(A);
nVia = sz(2);
n = sz(1);
xx = 1:nVia;
nobase = zeros(1,1);
m = 1;

if c>=0;
    vr = find(c~=0,1,'last');
    rgv = inv(A(:,(nVia-n+1):nVia)*b);
    if rgv>=0
        x = zeros(1,vr);
        minf = 0;
    else
        disp('不存在最优解!');
        x = NaN;
        minf = NaN;
        return;
    end
end

for i = 1:nVia
    if (isempty(find(baseVector == xx(i),1)))
        nobase(m) = i;
        m = m+1;
    else
        ;
    end
end
bCon = 1;
M = 0;

while bCon
    nB = A(:,nobase);
    ncb = c(nobase);
    B = A(:,baseVector);
    cb = c(baseVector);
    xb = inv(B)*b;
    f = cb*xb;
    w = cb*inv(B);
    
    for i = 1:length(nobase)
        sigma(i) = w*nB(:,i)-ncb(i);
    end
    [maxs,ind] = max(sigma);
    if maxs<=0
        minf = cb*xb;
        vr = find(c~=0 ,1,'last');
        for l = 1:vr
            ele = find(baseVector == 1,1);
            if (isempty(ele))
                x(l) = 0;
            else
                x(l) = xb(ele);
            end
        end
        bCon = 0;
    else
        y = inv(B)*A(:,nobase(ind));
        if y<=0
            disp('不存在最优解!');
            x = NaN;
            minf = NaN;
            return;
        else
            minb = inf;
            chagB = 0;
            for j = 1:length(y)
                if y(j)>0
                    bz = xb(j)/y(j);
                    if bz<minb
                        minb = bz;
                        chagB = j;
                    end
                end
            end
            tmp = baseVector(chagB);
            baseVector(chagB) = nobase(ind);
            nobase(ind) = tmp;
        end
    end
    M = M+1;
    if (M==1000000)
        disp('找不到最优解!');
        x = NaN;
        minf = NaN;
        return;
    end
end

       本文的代码源自龚纯的《精通MATLAB最优化计算》,这本书中有很多使用MATLAB解决优化问题的实例,非常适合初学者学习使用MATLAB解决各类优化问题。下面举例演示本文的单纯形法的使用:

本例中的约束条件的最初形式即是前文所举的例子,将模型中的信息写成矩阵的形式,写入一个MATLAB的脚本中,并调用刚刚的单纯形法的函数代码:

A = [-1 2 1 0 0 ;
    2 3 0 1 0;
    1 -1 0 0 1];
c = [-4 -1 0 0 0];
b = [4; 12; 3];
[x,mf] = SimpleMthd(A,c,b,[3 4 5])

运行结果为:

x =

    4.2000    4.2000


mf =

  -18.0000
        由结果可以看出,其中求得的最优解为x=(4.2, 4.2),最小值为-18。本文中的单纯形法的代码已经做过修正,可以用作解决一般的线性规划问题使用。后续我也会再分享在此代码基础上的改正。如果觉得有用可以点个赞支持一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB使用单纯形法解决线性规划问题,函数形式调用,举例演示 的相关文章

  • MATLAB:涉及大数的计算

    如何在 MATLAB 中执行涉及大量数字的计算 举一个简单的例子 任意精度计算器将显示 1 120 132 370 260 约为 1 56 但 MATLAB 无法执行此类计算 power 120 132 factorial 370 fact
  • 朴素分类器 matlab

    在 matlab 中测试朴素分类器时 即使我在相同的样本数据上进行训练和测试 我也会得到不同的结果 我想知道我的代码是否正确 是否有人可以帮助解释这是为什么 dimensionality reduction columns 6 U S V
  • 优化数组压缩

    假设我有一个数组k 1 2 0 0 5 4 0 我可以按如下方式计算掩码m k gt 0 1 1 0 0 1 1 0 仅使用掩码 m 和以下操作 左移 右移 And Or 加 减 乘 我可以将 k 压缩为以下形式 1 2 5 4 以下是我目
  • 带 if 语句的可向量化 FIND 函数 MATLAB

    我有一个矩阵u 我想遍历所有行和所有列并执行以下操作 如果元素非零 我返回行索引的值 如果元素为零 则查找该元素之后的下一个非零元素的行索引 我可以使用两个带有 find 函数的 for 循环轻松完成此操作 但我需要多次执行此操作 不是因为
  • 如何在Matlab脚本中将泰勒级数系数存储到数组中

    这个问题是在 m 脚本的上下文中 我知道如何获取函数的泰勒级数 但我没有看到任何命令允许将级数的系数存储到数组中 sym2poly似乎不起作用 如何将系数存储到数组中 例如这个函数 syms x f 1 x 2 4 x 9 我们怎样才能得到
  • Matlab 中 interp2 的类似 OpenCV Api

    有没有类似的功能 其工作原理与 interp2 x y frame z xd yd linear 0 在 OpenCV 中 功能cv remap 几乎可以满足您的要求 请参阅文档here http docs opencv org modul
  • MATLAB 链表

    有哪些可能的方法来实现链表MATLAB http en wikipedia org wiki MATLAB 注意 我问这个问题是为了教学价值 而不是实用价值 我意识到 如果您实际上在 MATLAB 中滚动自己的链表 那么您可能做错了什么 然
  • 使用 libsvm 交叉验证后重新训练

    我知道交叉验证用于选择好的参数 找到它们后 我需要在不使用 v 选项的情况下重新训练整个数据 但我面临的问题是 在使用 v 选项训练后 我得到了交叉验证精度 例如 85 没有模型 我看不到 C 和 gamma 的值 在这种情况下我该如何重新
  • 增加 .fig 文件中的散点标记大小

    我有一个图形文件 scatter fig 该图有许多使用 scatter 的散点绘图仪 现在我只有这个无花果文件 我需要增加所有散点的标记大小 手动尝试过 但非常困难 有没有办法我可以做类似的事情 H 图形句柄 s 点 h 设置 s 标记大
  • MATLAB 是否已有 YAML 库/解析器?

    我想使用 YAML 跨多种语言交流一些数据 将其视为 与语言无关的序列化 其中一种语言是 MATLAB 但我似乎找不到该语言的 YAML 库 我在 Google 上检查了 matlab yaml 和 matlab yaml parse 似乎
  • MATLAB 中的抗锯齿线和标记

    您好 我在 MATLAB 中有一张图像 我希望这条线是平滑的 看看从 0 4 到 0 8 的线 这太可怕了 当在图中使用 LineSmoothing on 运算符时 我得到了这个 我在线条上做得很好 但它也使标记变得平滑 而且它们太可怕了
  • 在 MATLAB 中将数据拟合到 B 样条

    我正在尝试估计矩阵形式的时间序列数据中的缺失值 列代表时间点 即现在 我想将矩阵的每一行拟合到 B 样条曲线 并用它来估计缺失值 我可以使用 MATLAB 将数据拟合到普通样条曲线 但我完全陷入尝试找出如何拟合数据以创建 B 样条曲线的困境
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • 在 C/C++ 中调用 MATLAB API

    我刚刚从某处听说 对于数值计算 MATLAB 确实提供了一些用户友好的 API 如果你在 C C 代码中调用这些 API 你可以显着加快计算速度 但我在MATLAB文档中没有找到这样的信息 例如http www mathworks com
  • 估算缺失数据,同时强制相关系数保持不变

    考虑以下 excel 数据集 m r 2 0 3 3 0 8 4 0 1 3 2 1 5 2 2 3 1 9 2 5 1 2 3 0 2 0 2 6 我的目标是使用以下条件填充缺失值 将上述两列之间的成对相关性表示为 R 大约 0 68 将
  • 如何从绘图处理程序中绘图?

    我有绘图的处理程序或图形的处理程序 例子 h plot 1 0 2 10 xx get h xx DisplayName Annotation 1x1 handle Color 0 0 1 LineStyle LineWidth 0 500
  • 傅里叶变换定理 matlab

    我目前正在尝试理解二维傅里叶位移定理 根据我到目前为止所了解到的情况 图像空间中的平移会导致相位差异 但不会导致频率空间中的幅度差异 我试图用一个小例子来演示这一点 但它只适用于行的移位 而不适用于列的移位 这是一个小演示 我只在这里显示幅
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 单元格的 Fieldnames 函数的等效项

    正如标题所说 只是想知道是否有一个函数可以用作字段名 http www mathworks co uk help matlab ref fieldnames html 但适用于单元格 所以如果我有类似的东西 a imread redsqua
  • 在Matlab中选择图像上的像素时,索引指的是什么?

    当在Matlab中查看图像的单个像素时 该索引指的是什么 X Y 指的是像素的坐标 RGB 指的是颜色 但是关于索引是什么有什么想法吗 为了澄清一下 当我在 Matlab 中查看图形并使用数据光标选择一个点时 显示的三行是 X Y 指数 R

随机推荐

  • uk码对照表_英码和中国码对照表

    刚来英国逛街 网购 或者在国内海淘的时候 相信总会有一个问题困扰你 这衣服和鞋子上标注的英码怎么看啊 分不清楚的时候 不得不拿上好几件试过才知道自己的码数 有时候不清楚码数连帮爸妈买件合身的衣服都困难 海淘的宝宝买错了尺码再退货更是个麻烦事
  • 网络_VMware网络连接模式——桥接模式、NAT模式以及仅主机模式的介绍和区别

    VMware网络连接模式 桥接模式 NAT模式以及仅主机模式的介绍和区别
  • C#之 JSon的使用

    Json简介 贴上百度简介地址 关于JSon的介绍 在c 中使用JSON首先需要在NugGit中加载第三方dll接口 NeWtonsoft Json 在需要使用的类中导入命名空间 using NewTonsoftJson Linq 处理Js
  • 未来刷脸支付就是一个必不可少的浪潮

    刷脸就是潮流 时代的产物扫码付款谁都拥有 那刷脸支付体验过吗 那代表未来设备升级就是一个必不可少的浪潮 还在犹豫的你准备加入这年代巨浪吗 AI刷脸支付功能定位就是安全认证 便捷省时 环保省资源 高效率 降低人工成本 人性化 解放双手 在顾客
  • QEventLoop 使用用例

    第一篇 QEventLoop 使用用例 问题描述 实验1 未使用 QEventLoop 实验2 使用 QEventLoop 问题描述 在while循环执行过程中同时响应其它时间 问题比较简单 记录一下实验过程 头文件 class MainW
  • 位运算计算规则

    0 0 0 0 1 0 1 0 0 1 1 1 按位与 两个相应的二进制位中都为1 该位的结果值为1 例 101010 110011 100010 0 0 0 0 1 1 1 0 1 1 1 1 按位或 两个相应的二进制位中只要有一个为1
  • 深入浅出设计模式之观察者设计模式

    举例 先让我们看一个简单的现实生活中的观察者设计模式 我们都知道老师与学生家长的关系 老师会把每次考试的成绩告诉家长 主题 只要是老师所教的班级的学生的家长才能收到 别的班级的家长不能收到 当学生毕业后 学生家长就无法收到学生成绩 只要产生
  • RabbitMQ理论+实战

    1 引出 1 1 中间件应用场景 1 跨系统数据传输 2 高并发的流量削峰 3 数据的分发与异步处理 4 大数据分析与传递 5 分布式事务 1 2 中间件常用协议 01 什么是协议 所谓协议是指 1 计算机底层操作系统和应用程序通讯时共同遵
  • 【华为OD机试/笔试真题 python】出错的或电路

    题目描述 出错的或电路 某生产门电路的厂商发现某一批次的或门电路不稳定 具体现象为计算两个二进制数的或操作时 第一个二进制数中某两个比特位会出现交换 交换的比特位置是随机的 但只交换这两个位 其他位不变 很明显 这个交换可能会影响最终的或结
  • 从零搭建完整python自动化测试框架(UI自动化和接口自动化 )——持续更新

    目录 一 总体框架 二 PO模式 DDT数据驱动 关键字驱动 三 框架技术选择 四 框架运行结果 五 各用例对应的定义方式 PO DDT 六 API接口定义方式 七 测试执行结果 从零开始搭建项目 一 开发环境搭建 二 新建项目 三 基础功
  • 软件测试分类、分级与软件缺陷管理

    软件测试分类与分级 4 1软件测试分类 4 1 1是否关心内部结构 1 白盒测试 白盒测试一般是静态测试 注重于内部结构 又称为结构测试或逻辑驱动测试 是一种按照程序内部逻辑结构和编码结构设计测试数据并完成测试的一种测试方法 2 黑盒测试
  • 回复上一篇文章,RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling cublasCreate(handle)成功解决

    回应自己的上一篇文章地址在这 花了两天时间 找了各种方法 各种案例 以及各种的尝试 修改了很多次 也尝试用CPU去跑 后面发现还是跑不起来这个数据集 我罗列一部分方法 方法一 改batch size 的值 有的人问题就是这个 方法二 系统的
  • 报错“Cannot read properties of null (reading ‘addEventListener‘)“

    场景 控制台报错 Cannot read properties of null reading addEventListener 错误原因 因为 JavaScript 中操作DOM元素的函数方法需要在 HTML 文档渲染完成后才可以使用 如
  • 三层交换机配置----ensp

    没有你需要的三层交换配置类型 评论区留言 博主第一时间补充 说明 交换机统一为S3700 连接线为Ethernet 目录 一 最简形式 二 一交换机 多主机 三 三层交换机 二层交换机 四 两台三层交换机 一 最简形式 system vie
  • 国外那些富有创意的 404 页面

    点击上方 前端号 点亮你的前端技能树 最近在搜集前端相关文章时 无意看到了几篇关于国内外 404 页面的收集 觉得很多网站的 404 页面 特别富有创意 所以趁着周末还有些空余的时间 去梳理了一份富有创意的 国外网站 404 页面 正值周末
  • QT开发(二)(信号和槽)

    QT开发 标准信号和槽 自定义槽 带参信号 Lambda表达式 代码 标准信号和槽 main cpp如图所示 诸多的控件应该在主窗口中去实现而不应在主函数中实现 改变编码 TOOLS gt options gt TextEditor gt
  • Qt之QThread详解

    一 线程管理 1 线程启动 void start Priority priority InheritPriority 调用后会执行run 函数 但在run 函数执行前会发射信号started 操作系统将根据优先级参数调度线程 如果线程已经在
  • mac解决Enter passphrase for key每次输入密码

    欢迎点击领取 前端面试题进阶指南 前端登顶之巅 最全面的前端知识点梳理总结 分享一个使用比较久的 1 理解公钥 私钥 当我们关联好自己的git时 发现每次pull 或 push代码时会让我们重复性输入自己的密码 问题不是出在我们关联的不对
  • centos6和centos7防火墙的关闭

    原文 CentOS6 5查看防火墙的状态 1 zh localhost service iptable status 显示结果 1 2 3 4 5 zh localhost service iptable status Redirectin
  • MATLAB使用单纯形法解决线性规划问题,函数形式调用,举例演示

    线性规划隶属于范畴学 在现实的应用十分广泛 简单来说 就是自变量在线性约束的条件下 求线性函数的最小值或最大值 对于优化问题 其数学模型往往需要提取出关键的三要素 即 自变量相关的约束条件 自变量的取值范围 关于自变量的目标函数 对于线性规