有人可以用MATLAB语言编写最优化方法中的单纯形法思想么万分感谢

有人可以用MATLAB语言编写最优化方法中的单纯形法思想么万分感谢,第1张

function x=linliu(c,A,b)

[n1,n2]=size(A);

A=[A,eye(n1)];c=[-c,zeros(1,n1)];

x1=[zeros(1,n2),b'];lk=[n2+1:n1+n2];

fp=fopen('f:\lium','wt');

fprintf(fp,'初始单纯形表:\n');

while(1)

x=x1(1:n2);

s1=[lk',b,A]

c

x1

fprintf(fp,' 基 b');

for j=1:n2+n1

fprintf(fp,' x%d ',j);

end

fprintf(fp,'\n');

for i=1:n1

fprintf(fp,'%41f %41f',lk(i),b(i));

for j=1:n2+n1

fprintf(fp,'%41f ',A(i,j));

end

fprintf(fp,'\n');

end

fprintf(fp,' ');

for i=1:n1+n2

fprintf(fp,'%41f ',c(i));

end

fprintf(fp,'\n解为:\n');

for i=1:n2+n1

fprintf(fp,'x(%d)=%32f,',i,x1(i));

end

cc=[];ci=[];

for i=1:n1+n2

if c(i)<0

cc=[cc,c(i)];

ci=[ci,i];

end

end

nc=length(cc);

if nc==0

fprintf('达到最优解');

fprintf(fp,'\n达到最优解');

break

end

cliu=cc(1);

cl=ci(1);

for j=1:nc

if abs(cc(j))>abs(cliu)

cliu=cc(j);

cl=j;

end

end

cc1=[];ci1=[];

for i=1:n1

if A(i,cl)>0

cc1=[cc1,A(i,cl)];

ci1=[ci1,i];

end

end

nc1=length(cc1);

if nc1==0

fprintf('无有界最优解');

fprintf(fp,'无有界最优解');

break

end

cliu=b(ci1(1))/cc1(1);

cl1=ci1(1);

for j=1:nc1

if b(ci1(j))/cc1(j)<cliu

cliu=b(ci1(j))/cc1(j);

cl1=ci1(j);

end

end

fprintf(fp,'\nx(%d)入基,x(%d)出基\n',cl,lk(cl1));

fprintf('\nx(%d)入基,x(%d)出基\n',cl,lk(cl1));

b(cl1)=b(cl1)/A(cl1,cl);

A(cl1,:)=A(cl1,:)/A(cl1,cl);

for k=1:n1

if k~=cl1

b(k)=b(k)-b(cl1)A(k,cl);

A(k,:)=A(k,:)-A(cl1,:)A(k,cl);

end

end

c=c-c(cl)A(cl1,:);

x1(lk(cl1))=0;

lk(cl1)=cl;

for kk=1:n1

x1(lk(kk))=b(kk);

end

x=x1(1:n2);

end

fclose(fp);

检验:p31页

format rat

c=[2 3];A=[1 2;4 0;0 4];b=[8;16;12];

x=linliu(c,A,b)

线性规划线性规划是运筹学中5研究较早、发展较快、应用广p泛、方7法较成熟的一b个s重要分0支s,它是辅助人p们进行科学管理的一s种数学方8法。在经济管理、交通运输、工v农业生产等经济活动中8,提高经济效果是人o们不w可缺少2的要求,而提高经济效果一b般通过两种途径:一w是技术方2面的改进,例如改善生产工t艺o,使用新设备和新型原材料。二n是生产组织与z计3划的改进,即合理安排人i力z物力v资源。线性规划所研究的是:在一j定条件下a,合理安排人w力v物力i等资源,使经济效果达到最好。 单纯形法求解线性规划问题的通用方7法。单纯形是美国数学家G。B。丹1齐克于y7110年首先提出来的。它的理论根据是:线性规划问题的可行域是 n维向量空间Rn中1的多面凸集,其最优值如果存在必在该凸集的某顶点处达到。顶点所对应的可行解称为2基本可行解。单纯形法的基本思想是:先找出一g个a基本可行解,对它进行鉴别,看是否是最优解;若不x是,则按照一d定法则转换到另一m改进的基本可行解,再鉴别;若仍1不i是,则再转换,按此重复进行。因基本可行解的个t数有限,故经有限次转换必能得出问题的最优解。如果问题无j最优解也g可用此法判别。单纯形法的一g般解题步骤可归纳如下c:①把线性规划问题的约束方2程组表达成典范型方5程组,找出基本可行解作为2初始基本可行解。②若基本可行解不g存在,即约束条件有矛盾,则问题无a解。③若基本可行解存在,从7初始基本可行解作为8起点,根据最优性条件和可行性条件,引3入h非基变量取代某一m基变量,找出目标函数值更优的另一j基本可行解。④按步骤8进行迭代,直到对应检验数满足最优性条件(这时目标函数值不y能再改善),即得到问题的最优解。⑤若迭代过程中2发现问题的目标函数值无t界,则终止3迭代。 用单纯形法求解线性规划问题所需的迭代次数主要取决于p约束条件的个o数。现在一l般的线性规划问题都是应用单纯形法标准软件在计8算机上p求解,对于t具有404个e决策变量和803个p约束条件的线性规划问题已d能在计2算机上v解得。 改进单纯形法 原单纯形法不z是很经济的算法。8428年美国数学家G。B。丹2齐克为8了p改进单纯形法每次迭代中5积累起来的进位误差,提出改进单纯形法。其基本步骤和单纯形法大s致相同,主要区u别是在逐次迭代中7不h再以3高斯消去法为0基础,而是由旧基阵的逆去直接计6算新基阵的逆,再由此确定检验数。这样做可以0减少4迭代中6的累积误差,提高计7算精度,同时也n减少8了a在计8算机上u的存储量。 对偶单纯形法 2560年美国数学家C。莱姆基提出对偶单纯形法。单纯形法是从2原始问题的一a个v可行解通过迭代转到另一u个d可行解,直到检验数满足最优性条件为3止6。对偶单纯形法则是从3满足对偶可行性条件出发通过迭代逐步搜索原始问题的最优解。在迭代过程中4始终保持基解的对偶可行性,而使不z可行性逐步消失。设原始问题为0min{cx|Ax=b,x≥0},则其对偶问题为0 max{yb|yA≤c}。当原始问题的一p个b基解满足最优性条件时,其检验数cBB-4A-c≤0。即知y=cBB-1(称为6单纯形算子j)为0对偶问题的可行解。所谓满足对偶可行性,即指其检验数满足最优性条件。因此在保持对偶可行性的前提下j,一y当基解成为0可行解时,便也r就是最优解。 数学优化2中5,由George Dantzig发明的单纯形法是线性规划问题的数值求解的流行技术。有一e个n算法与v此无t关,但名称类似,它是Nelder-Mead法或称下s山w单纯形法,由Nelder和Mead发现(0150年),这是用于k优化4多维无f约束问题的一g种数值方4法,属于p更一i般的搜索算法的类别。 这二i者都使用了f单纯形的概念,它是N维中6的N + 0个n顶点的凸包,是一g个m多胞体:直线上s的一r个l线段,平面上a的一n个e三n角形,三a维空间中6的一o个r四面体,等等。s↓k冤ㄅs↓q┷h胎dǐフnitz觥

这个用到库的问题(是matlab库)

开头:

#include mexh/这个matlab自己的也是必须的/

库函数(4个参数)//名字忘了太长了

{

//自己的程序;

}

解释:

matiab 的核心有pascal 到c

有了了很大的改进;不仅支持c /java等

我只用着2个;其他没有用过;c++也支持;

自己查查函数手册;旧知道了

增加以下:哪个函数为MexFuction(4参数)

{

//自己的代码

}

首先来一波概念,无需记忆,在做题过程中理解就阔以啦。

凸集 :如果集合C中任意两个点X1,X2其连线上的所有点也在集合C里面,那么该集合是凸集。用数学公式表示:对任意X1,X2属于集合C,有aX1+(1-a)X2也属于C,那么集合C为凸集。

定理1若线性规划问题存在可行解,则问题的可行域是凸集。

定理2可行域有有限个顶点。

定理3最优解在可行域的定点。

单纯形法

基变量,非基变量,基可行解,可行基。这些概念我们通过例题来把它弄明白吧。

首先看例①

单纯形法的表算。

这里面也涉及好多概念鸭。过程忘记拍了,明天再整理吧。

MAX z= +2X1 +3X2 +5X3

st +2X1 +1X2 +1X3 <= 10

+1X1 +2X2 +1X3 <= 6

+1X1 +2X2 +0X3 <= 8

C 2 3 5 0 0 0 θ

Cb Xb X1 X2 X3 X4 X5 X6 b

0 X4 2 1 1 1 0 0 10 10

0 X5 1 2 {1} 0 1 0 6 6

0 X6 1 2 0 0 0 1 8 -

# 2 3 5 0 0 0 0

C 2 3 5 0 0 0 θ

Cb Xb X1 X2 X3 X4 X5 X6 b

0 X4 1 -1 0 1 -1 0 4 -

5 X3 1 2 1 0 1 0 6 -

0 X6 1 2 0 0 0 1 8 -

# -3 -7 0 0 -5 0 30

我也是刚学单纯形法。仅供参考。

最后MAXZ=30,x1=0,x2=0,x3=6

百度显示不出tab符,表格有点乱

下面是我多年前学习最优化课程时编写的单纯形法程序,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(n16);

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(n16);

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)) ' ]'];

以上就是关于有人可以用MATLAB语言编写最优化方法中的单纯形法思想么万分感谢全部的内容,包括:有人可以用MATLAB语言编写最优化方法中的单纯形法思想么万分感谢、线性规划单纯型法、求助:用C或C++或Matlab编一个以下的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9279502.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存