问答1 问答5 问答50 问答500 问答1000
网友互助专业问答平台

求matlab单纯型方法求解线性规划代码

提问网友 发布时间:2022-04-23 14:30
声明:本网页内容为用户发布,旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:1656858193@qq.com
1个回答
热心网友 回答时间:2023-10-18 13:20
下面是我多年前学习最优化课程时编写的单纯形法程序,100%原创。

单纯形算法的基本思想是,从多面体的某个顶点出发,移动到使得目标函数有所改进的相邻顶点;然后,从相邻顶点出发,移动到另一个更好的顶点,直至到达最优的顶点。从代数的观点看,也就是从一个基本可行解出发,求出使目标函数得到改进的相邻的基本可行解,循环往复,直至求得最优的基本可行解,或者判断最优解不可能存在。

从一个基本可行解得到另一个与之相邻的基本可行解的过程称为转轴过程(pivoting process,简称转轴),就是以某个非基变量代替另一个基变量。如何确定换入和换出变量(即所谓的转轴法则)是不同单纯形方法的主要差别。

我所编写程序的主要特色在于,不仅能够给出最优解,而且还能够给出迭代过程中各步的单纯形表(simplex tableau),这对于理解单纯形法的求解过程非常有帮助。

程序自带调用实例,使用了符号数学工具箱,所以显得有点繁琐,好好读一读对你会有帮助。

function [G, BasisSet] = simplex_table(A, b, c, idxB)

if ~nargin
A=[
3 3 1 0 0;
4 -4 0 1 0;
2 -1 0 0 1
];
b=[30 16 12]';
c=[-3 -1 0 0 0];
idxB = 3 : 5;
simplex_table(A, b, c, idxB)
return
end

if nargin == 2
G = A;
BasisSet = b;
m = size(G, 1) - 1;
n = size(G, 2) - 1;
else
m = size(A,1);
n = size(A,2);
BasisSet = idxB;
idxN = true(1, n);
idxN(idxB) = ~idxN(idxB);
idxB = ~idxN;
B = sym( A(:, BasisSet) );
cB = c(BasisSet);
w = cB * B^-1;
G = sym( zeros( size(A)+1 ) );
G(1:end-1, 1:end-1) = B^-1 * A;
G(1:end-1, end) = B^-1 * b;
G(end, 1:end-1) = w * A -c;
G(end, end) = w * b;
end
output_stars(n*16);
count = 0;
fprintf('\n initial table:\n');
output_table(G, BasisSet);

while count <= 100,
last_row = G(end, 1:end-1);
try
[d, in] = max( double( last_row ) );
catch
syms M
lim = limit(last_row, M, inf);
[d, in] = max( double(lim) );
if d ==inf
lim = limit(last_row / M, M, inf);
[d, in] = max( double(lim) );
end
end
if d <= 0,
disp(' ***** success');
x = sym(zeros(1, n));
x(BasisSet) = G(1:end-1, end)';
fprintf(' Optimal solution is: x = %s, ', symvec2str(x));
fprintf(' fmin = %s', char( G(end,end) ) );
break,
end

b_ = G(1:end-1, end);
yi = G(1:end-1, in);
if max( double(yi) ) <= 0, disp(' ***** No solution'); break, end
r = double(b_ ./ yi);
r( double(yi) <= 0 ) = NaN;
if 1
[yir, out] = min( r );
else
[yir, out] = min( r(end:-1:1) );
out = length(r) + 1 - out;
end

yir = yi(out);
count = count + 1;
fprintf(' The #%i iteration:\n', count);
fprintf(' Pivoting: x%i out, x%i in\n', BasisSet(out), in);
BasisSet(out) = in;

G(out, :) = G(out, :) / yir;
for i = 1 : m + 1
if i ~= out
G(i, :) = G(i, :) - G(out, :) * G(i, in);
end
end
G = simple(G);
output_table(G, BasisSet);
end
output_stars(n*16);

function output_table(G, BasisSet)
n = size(G, 2);
m = size(G, 1);
fprintf('\n ');
for j = 1 : n - 1
fprintf('\t%9s%i', 'x', j );
end
fprintf('\n');
for i = 1 : m
if i < m,
fprintf(' x%i', BasisSet(i));
else
fprintf(' ');
end
for j = 1 : n
fprintf('\t%10s', char( G(i,j) ) );
end
fprintf('\n');
end
fprintf('\n');

function output_stars(n)
fprintf('\n');
for i=1:n, fprintf('-'); end
fprintf('\n');

function s = symvec2str(x)
n=length(x);
s = '[ ';
for i=1:n-1
s = [s char(x(i)) ', ' ];
end
s = [s char(x(n)) ' ]'];追问可不可以在详细一点吗?这样交上去不行啊。您能帮忙在加一些注释什么的吗?弄的详细一点

热心网友 回答时间:2023-10-18 13:20
下面是我多年前学习最优化课程时编写的单纯形法程序,100%原创。

单纯形算法的基本思想是,从多面体的某个顶点出发,移动到使得目标函数有所改进的相邻顶点;然后,从相邻顶点出发,移动到另一个更好的顶点,直至到达最优的顶点。从代数的观点看,也就是从一个基本可行解出发,求出使目标函数得到改进的相邻的基本可行解,循环往复,直至求得最优的基本可行解,或者判断最优解不可能存在。

从一个基本可行解得到另一个与之相邻的基本可行解的过程称为转轴过程(pivoting process,简称转轴),就是以某个非基变量代替另一个基变量。如何确定换入和换出变量(即所谓的转轴法则)是不同单纯形方法的主要差别。

我所编写程序的主要特色在于,不仅能够给出最优解,而且还能够给出迭代过程中各步的单纯形表(simplex tableau),这对于理解单纯形法的求解过程非常有帮助。

程序自带调用实例,使用了符号数学工具箱,所以显得有点繁琐,好好读一读对你会有帮助。

function [G, BasisSet] = simplex_table(A, b, c, idxB)

if ~nargin
A=[
3 3 1 0 0;
4 -4 0 1 0;
2 -1 0 0 1
];
b=[30 16 12]';
c=[-3 -1 0 0 0];
idxB = 3 : 5;
simplex_table(A, b, c, idxB)
return
end

if nargin == 2
G = A;
BasisSet = b;
m = size(G, 1) - 1;
n = size(G, 2) - 1;
else
m = size(A,1);
n = size(A,2);
BasisSet = idxB;
idxN = true(1, n);
idxN(idxB) = ~idxN(idxB);
idxB = ~idxN;
B = sym( A(:, BasisSet) );
cB = c(BasisSet);
w = cB * B^-1;
G = sym( zeros( size(A)+1 ) );
G(1:end-1, 1:end-1) = B^-1 * A;
G(1:end-1, end) = B^-1 * b;
G(end, 1:end-1) = w * A -c;
G(end, end) = w * b;
end
output_stars(n*16);
count = 0;
fprintf('\n initial table:\n');
output_table(G, BasisSet);

while count <= 100,
last_row = G(end, 1:end-1);
try
[d, in] = max( double( last_row ) );
catch
syms M
lim = limit(last_row, M, inf);
[d, in] = max( double(lim) );
if d ==inf
lim = limit(last_row / M, M, inf);
[d, in] = max( double(lim) );
end
end
if d <= 0,
disp(' ***** success');
x = sym(zeros(1, n));
x(BasisSet) = G(1:end-1, end)';
fprintf(' Optimal solution is: x = %s, ', symvec2str(x));
fprintf(' fmin = %s', char( G(end,end) ) );
break,
end

b_ = G(1:end-1, end);
yi = G(1:end-1, in);
if max( double(yi) ) <= 0, disp(' ***** No solution'); break, end
r = double(b_ ./ yi);
r( double(yi) <= 0 ) = NaN;
if 1
[yir, out] = min( r );
else
[yir, out] = min( r(end:-1:1) );
out = length(r) + 1 - out;
end

yir = yi(out);
count = count + 1;
fprintf(' The #%i iteration:\n', count);
fprintf(' Pivoting: x%i out, x%i in\n', BasisSet(out), in);
BasisSet(out) = in;

G(out, :) = G(out, :) / yir;
for i = 1 : m + 1
if i ~= out
G(i, :) = G(i, :) - G(out, :) * G(i, in);
end
end
G = simple(G);
output_table(G, BasisSet);
end
output_stars(n*16);

function output_table(G, BasisSet)
n = size(G, 2);
m = size(G, 1);
fprintf('\n ');
for j = 1 : n - 1
fprintf('\t%9s%i', 'x', j );
end
fprintf('\n');
for i = 1 : m
if i < m,
fprintf(' x%i', BasisSet(i));
else
fprintf(' ');
end
for j = 1 : n
fprintf('\t%10s', char( G(i,j) ) );
end
fprintf('\n');
end
fprintf('\n');

function output_stars(n)
fprintf('\n');
for i=1:n, fprintf('-'); end
fprintf('\n');

function s = symvec2str(x)
n=length(x);
s = '[ ';
for i=1:n-1
s = [s char(x(i)) ', ' ];
end
s = [s char(x(n)) ' ]'];追问可不可以在详细一点吗?这样交上去不行啊。您能帮忙在加一些注释什么的吗?弄的详细一点

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

急求运筹学单纯型法的matlab程序代码!! 土豆粉怎么泡有柔劲好吃 单纯形法程序用法 泡粉丝用热水还是冷水 单纯形法的C++程序详解过程 土豆粉条吃之前泡不泡 lingo编写单纯形法的程序怎么写? 土豆粉和成面是用冷水还是热水 C语言编单纯形法程序怎么写 土豆粉丝怎么煮,买回来的土豆粉丝?要浸泡下在煮还是用开水煮烫下在放入冷水中在煮?还是直接汤烧好放入 粉丝要泡多久? 东北土豆粉做菜前用冷水泡还是热水泡啊,泡多久啊? 干土豆粉, 用冷水泡多长时间才能泡开? 土豆炖粉条粉条用热水还是凉水 三星s9来短信的时候怎么调边上的灯 乾隆通宝到底值不值钱,乾隆通宝价格表大全 乾隆通宝现在市场价格多少? (乾隆通宝)价格多少? 手指上长疣怎么去除? 我的手指上 长了个 猴子 请问怎么才能 弄掉? 土豆拌粉丝凉菜的做法 急急急!!高分!!编写程序实现利用单纯形法求解线性规划问题 单纯形法的C程序 再吃粉丝前,粉丝需要泡成哪种程度? 土豆粉需要煮多久熟? 在约束最优化中,用单纯形法解线性规划的matlab程序 土豆淀粉是怎么调的,是用开水,还是冷水 实验二:MATLAB编程单纯形法求解 目标规划单纯形法的C++编程 用单纯形法求解线性规划问题 请问各位朋友:谁有两阶段单纯形法的matlab程序,先谢谢了! matlab单纯形法求解线性规划 用MATLAB 编个程序 无约束单纯形法 matlab程序 单纯形法标准软件有哪些 高分求 matlab 对偶单纯形法 程序 , 求用matlab 软件 编写~目标函数的单纯形法 给一对龙凤胎起名字。谢啦! 龙凤胎用成语起名字好吗?有哪些成语适合用来给龙凤胎取名呀 刘姓龙凤胎取什么名字好? 黑色衣服沾了漂白水为什么会变红?
Top