【运筹与优化】单纯形法解线性规划问题(matlab实现)

文章目录

  • 单纯形法步骤:
    • 1.将线性规划问题化为标准形式
    • 2.列出单纯形表
    • 3.进行最优性检验
    • 4.从一个基可行解转换到另一个目标值更大的基可行解,列出新的单纯形表
    • 5.重复3、4直到计算结束为止
  • 举例
  • 单纯形法matlab实现

单纯形法是一种解线性规划问题的算法,其求解过程是通过构造一个单纯形表实现的,具体步骤如下:

单纯形法步骤:

1.将线性规划问题化为标准形式

标准形式如下:
线性规划的标准形式
其特点是:
(1) 目标函数求最大值(有时求最小值)
(2) 约束条件都为等式方程,且右端常数项 bi 都大于或等
于零
(3) 决策变量 xj 为非负

为了方便使用单纯形法来求解线性规划问题,我们需要将现有问题化为标准形式,其方法如下:

(1) 目标函数的转换
目标函数的转换
(2) 无约束变量的转换
变量的转换
(3) 约束方程由不等式转为等式
约束方程由不等式转为等式
(4) 小于等于0的变量的转换
在这里插入图片描述

以下为一将问题转化为标准形式的例子:
在这里插入图片描述

2.列出单纯形表

对于已经化为标准型的线性规划问题
线性规划的标准形式
其对应的单纯形表如下:
在这里插入图片描述
其中:
在这里插入图片描述
例如以下已经化为标准型的线性规划问题:
在这里插入图片描述
其单纯形表如下:
在这里插入图片描述

3.进行最优性检验

如果表中所有的检验数都小于等于0,则表中的基可行解就是问题的最优解,计算停止,否则进行下一步。

4.从一个基可行解转换到另一个目标值更大的基可行解,列出新的单纯形表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.重复3、4直到计算结束为止

重复3、4步骤,直到表中所有的检验数都小于等于0,计算结束,表中的基可行解就是问题的最优解。

举例

在这里插入图片描述
将问题化为标准型,加入松弛变量x3,x4:
在这里插入图片描述
运用单纯形表求解:
在这里插入图片描述
注:本次求解进行了两次迭代,上图把初始单纯形表和两次迭代时的单纯性表从上到下拼接在了一起。

单纯形法matlab实现

Simplex_eye.m:

function [x_opt, fx_opt, iter, Table] = Simplex_eye(A,b,c)% A = [2 -3 2 1 0; 1/3 1 5 0 1];
% b = [12 20]';
% c = [1 2 1 0 0]'; %初始单纯型表
Table = zeros(size(A,1)+1, size(A,2)+1);
Table(1:size(A,1), 1:size(A,2)) = A;
Table(size(A,1)+1, 1:size(A,2)) = c';
Table(1:size(A,1), size(A,2)+1) = b;[m, n] = size(Table);  %m为行数,n为列数base = Find_indentity(A);     %调用函数,找单位矩阵的列下标iter = 0;  %迭代次数while sum(Table(size(Table,1), 1:size(Table,2))>0)
%循环条件:当存在大于零的检验数就继续循环iter = iter + 1;index_col = find(Table(m,:) == max(Table(m,:))); %找最大检验数所在列pos = find(Table(1:m-1, index_col) > 0);temp = zeros(1,size(pos,2));for i = 1:size(pos,1)temp(i) = Table(pos(i), n)/Table(pos(i), index_col);endindex_row = pos(temp == min(temp));          %找主元行%以下做初等行变换Table(index_row,:) = Table(index_row, :)./Table(index_row,index_col);for i = 1:index_row-1Table(i,:) = Table(i,:)-Table(i,index_col)*Table(index_row,:);endfor i = index_row+1 : mTable(i,:) = Table(i,:)-Table(i,index_col)*Table(index_row,:);endbase(index_row) = index_col;    %换基,把第index_row个基换成index_col
endx_opt = zeros(1,size(c,2));
for i = 1:size(base, 1)x_opt(1,base(i)) = Table(i,n);
endfx_opt = -1*Table(size(Table,1), size(Table,2));end

找单位矩阵列下标 Find_indentity.m:

function [index] = Find_indentity(A)function [index] = Find_indentity(A)
[m,n] = size(A);
index = zeros(m,1);for i = 1:mtemp = find(A(i,:)==1);if size(temp,2) == 1index(i,1) = temp;elsefor t = 1:size(temp,2)flag = 0;for r = 1:i-1if A(r, temp(1, t)) ~= 0flag = 1;break;endendfor r = i+1:mif A(r, temp(1, t)) ~= 0flag = 1;break;endendif flag == 0index(i,1) = temp(1, t);break;endendend
endend

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux系统编程学习】 GCC编译器

此为牛客网Linux C课程1.2&1.3的课程笔记。 0. 简介 1. gcc和g的安装 sudo apt install gcc g2. gcc常用参数选项 3. gcc工作流程 首先是预处理器对源代码进行预处理(后缀名.i),主要做以下事情: 把头文件加入到源代码当中删…

Spring5底层原理之BeanFactory与ApplicationContext

目录 BeanFactory与ApplicationContext BeanFactory ApplicationContext 容器实现 BeanFactory实现 ApplicationContext实现 ClassPathXmlApplicationContext的实现 AnnotationConfigApplicationContext的实现 AnnotationConfigServletWebServerApplicationContext的实…

【Linux系统编程学习】 静态库的制作与使用

此为牛客网Linux C课程 1.4&1.5 的课程笔记。 0. 关于静态库与动态库 库就是封装好的、可服用的代码,而静态和动态是指链接。 这节课讲的是静态库,是指在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中&…

【Linux系统编程学习】 动态库的制作与使用

此为牛客网Linux C课程1.6&1.7 的课程笔记。 1. 动态库命名规则 2. 动态库的制作 第一步,用gcc编译生成.o目标文件,注意要用-fpic参数生成与位置无关的代码; 第二步,用gcc的-shared参数生成动态库。 涉及到的两个参数之前学过…

【Linux系统编程学习】 静态库与动态库的对比与总结

此为牛客网Linux C课程 1.9 的课程笔记。 1. 前几节课知识总结 程序编译成为可执行文件的过程: 静态库制作过程: 动态库制作过程: 2. 静态库的优缺点: 3. 动态库的优缺点: 更多可参考:吴秦&#xff1…

【Linux系统编程学习】 Makefile简单入门

此为牛客网Linux C课程1.10&1.11&1.12 的课程笔记。 0. Makefile介绍 1. Makefile文件命名与规则 示例: 使用vim编写如下名为Makefile的文件: app:sub.o add.o mult.o div.o main.ogcc sub.o add.o mult.o div.o main.o -o appsub.o:sub.cgcc …

【Linux系统编程学习】 GDB调试器的简单使用

此为牛客网Linux C课程 1.13&1.14&1.15&1.16 的课程笔记。 0. GDB简介 1. 准备工作 想要使用gdb调试,首先需要用gcc的-g参数生成可执行文件,这样才能在可执行文件中加入源代码信息以便调试,但是注意这并不是将源文件嵌入到可执行…

【Linux系统编程学习】C库IO函数与系统IO函数的关系

此为黑马Linux课程笔记。 1. C标准IO函数工作流程 如图,以C库函数的fopen为例,其返回类型是FILE类型的指针,FILE类型包含很多内容,主要包含三个内容:文件描述符、文件读写指针的位置和I/O缓冲区的地址。 文件描述符&…

【Linux系统编程学习】 文件描述符

此为牛客网Linux C课程1.19课程笔记。 1. 文件描述符表 如图,我们知道每个进程都有其虚拟地址空间(0~4G),其中3 ~ 4G部分为内核区。进程的进程控制块保存就在内核区,而PCB中维护一个打开文件描述符表,每个…

【Linux系统编程学习】Linux系统IO函数(open、read、write、lseek)

此为牛客网Linux C课程1.20课程笔记。 1.open函数 open函数有两种&#xff0c;分别是打开一个已经存在的文件和创建并打开一个不存在的文件。 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>// 打开一个已经存在的文件 int open(const…

【Linux系统编程学习】Linux进程控制原语(fork、exec函数族、wait)

此为牛客Linux C和黑马Linux系统编程课程笔记。 1. fork函数 1.1 fork创建单个子进程 #include<unistd.h> pid_t fork(void);作用&#xff1a;创建一个子进程。 pid_t类型表示进程ID&#xff0c;但为了表示-1&#xff0c;它是有符号整型。(0不是有效进程ID&#xff0…

【Linux系统编程学习】匿名管道pipe与有名管道fifo

此为牛客Linux C和黑马Linux系统编程课程笔记。 0. 关于进程通信 Linux环境下&#xff0c;进程地址空间相互独立&#xff0c;每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到&#xff0c;所以进程和进程之间不能相互访问&#xff0c;要交换…

【Linux系统编程学习】信号、信号集以其相关函数

此为牛客Linux C和黑马Linux系统编程课程笔记。 文章目录0. 信号的概念1. Linux信号一览表2. 信号相关函数3. kill函数4. raise函数5. abort函数6. alarm函数7. setitimer函数8. signal函数9. 信号集10. 自定义信号集相关函数11. sigprocmask函数12. sigpending函数13. sigacti…

【Linux系统编程学习】父进程捕获SIGCHLD信号以处理僵尸进程

配合之前说过的sigaction函数和waitpid函数&#xff0c;我们可以解决子进程变成僵尸进程的问题。 先看如下示例程序&#xff1a; #include <sys/time.h> #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <signal.h> …

【Linux系统编程学习】Linux线程控制原语

此为牛客Linux C课程笔记。 0. 关于线程 注意&#xff1a;LWP号和线程id不同&#xff0c; LWP号是CPU分配时间片的依据&#xff0c;线程id是用于在进程内部区分线程的。 1. 线程与进程的区别 对于进程来说&#xff0c;相同的地址(同一个虚拟地址)在不同的进程中&#xff0c;反…

【Linux网络编程学习】预备知识(网络字节序、IP地址转换函数、sockaddr数据结构)

此为牛客Linux C课程和黑马Linux系统编程笔记。 1. 网络字节序 我们已经知道&#xff0c;内存中的多字节数据相对于内存地址有大端和小端之分。 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分。网络数据流同样有大端小端之分&#xff0c;那么如何定义网络数…

【Linux网络编程学习】socket API(socket、bind、listen、accept、connect)及简单应用

此为牛客Linux C课程和黑马Linux系统编程笔记。 1. 什么是socket 所谓 socket&#xff08;套接字&#xff09;&#xff0c;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。 一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用网络协议交换…

【Linux网络编程学习】使用socket实现简单服务器——多进程多线程版本

此为牛客Linux C课程和黑马Linux系统编程笔记。 1. 多进程版 1.1 思路 大体思路与上一篇的单进程版服务器–客户端类似&#xff0c;都是遵循下图&#xff1a; 多进程版本有以下几点需要注意&#xff1a; 由于TCP是点对点连接&#xff0c;服务器主进程连接了一个客户端以后…

【Linux网络编程学习】I/O多路复用——select和poll

此为牛客Linux C课程和黑马Linux系统编程笔记。 0. I/O多路复用 所谓I/O就是对socket提供的内存缓冲区的写入和读出。 多路复用就是指程序能同时监听多个文件描述符。 之前的学习中写了多进程和多线程版的简单服务器模型&#xff0c;但是有个问题&#xff1a;每次新来一个客…

【Linux网络编程学习】阻塞、非阻塞、同步、异步以及五种I/O模型

文章目录1. 基本概念1.1 阻塞与非阻塞1.2 同步与异步1.3 为什么没有“异步阻塞”2. 五种IO模型2.1 阻塞 blocking2.2 非阻塞 non-blocking2.3. IO复用&#xff08;IO multiplexing&#xff09;2.4 信号驱动&#xff08;signal-driven&#xff09;2.5 异步&#xff08;asynchron…