【運籌與優化】單純形法解線性規劃問題(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.pswp.cn/news/384574.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384574.shtml
英文地址,請注明出處:http://en.pswp.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多路復用——epoll

此為牛客Linux C課程和黑馬Linux系統編程筆記。 1. 關于epoll epoll是Linux下多路復用IO接口select/poll的增強版本&#xff0c;它能顯著提高程序在大量并發連接中只有少量活躍的情況下的系統CPU利用率&#xff0c;因為它會復用文件描述符集合來傳遞結果而不用迫使開發者每次…