一般凸二次规划的有效集算法 Matlab程序

这是09年5月份很用心写的一个 运筹学中的一个程序,使得我对Matlab脚本语言有了一个深入的了解!

但这篇很早已经在百度空间中发表,所以这次呢 作为在CSDN的第一篇博文,我选择它是有其实意义的,那就是要在 Linux 和 Socket 方面的研究将坚持同样的心态。

运筹学是大家所熟悉的,其实也就是问题的最优化求解,然而如何从程序角度去诠释复杂的算法,是一件非常有意思的事情。

由于程序中有大量的注释,所以这里就不再敖述,有问题可以留下评论 我们接着讨论。


注: 除了算法实现,本篇博文还介绍了几个内置函数的使用,因为最近突然想写个建模类似的程序,便首先想到了这个程序,翻出来一看帮助不小~


clear all
clc
%一般凸二次规划有效集算法
% find 函数——集合中找到符合要求的数值位置
% intersect函数——求两个集合的交集
% setdiff函数——求两集合的差
% union函数——求两集合的并集
% 以下面的例题为例
% min x1^2+x2^2-2*x1-4*x2
% s.t. x1      >=0
%           x2 >=0
%       -x1-x2+1>=0

syms x1 x2
%=============求解任意函数时需要改变的参数=============
f=x1^2+x2^2-2*x1-4*x2;      % CHANGE 1
g=jacobian(f,[x1;x2]);
G=jacobian([g(1);g(2)],[x1,x2]);
%Initial Value x_1 初始值
x_1=[0;0];                  % CHANGE 2—x_1=[1;0] x_1=[0.5;0.5]
%Coefficient Matrix Named A 约束系数矩阵
AM=[1,0,-1;0,1,-1]          % CHANGE 3
%约束条件个数
an=size(AM,2);
%Constant 约束中的常系数
b=[0 0 -1];                 % CHANGE 4
%Initial Available Aggregate 初始有效集
%定义有效集为大于零的数
I=[1 2 0];                  % CHANGE 5—I=[0 2 3] I=[0 0 3]
%======================================================

%用 find 函数找到I中的有效集
I1=find(I);
%Define Matrix A & O 定义A O矩阵
%The Number Of Available Aggregate 有效集个数
n=size(I1,2);
% 其中I1(i)为有效集值
% AM(:,I1(i))为有效集对应的约束矩阵A的分量
A=[];
for i=1:n
    A=[A AM(:,I1(i))];
end
A
%=========================================
%Circulating Body 循环体
k=0;
N=10;
while k=0
        xbest=x_1;
        break;
    else
        %===确定s,并将I(s)=0,即有效集合中排除s===
        for i=1:n
            if lemta(i)==minlemta
               s=i;
               break;
            end
        end
        I(s)=0; 
        %=======================================
        %===重新赋值===
        x_2=x_1;
        %I1=setdiff(I1,s);
        I1=find(I);
        n=size(I1,2);
        A=[];
        for i=1:n
            A=[A AM(:,I1(i))];
        end
        A
        %=============
    end
end
%===End of step3
% ======Step 4======
if d(1)~=dflag(1)|d(2)~dflag(2)
    alf=ones(1,an);
    for i=1:an
        a=AM(:,i);
        if a'*d<0
            alf(i)=(b(i)-a'*x_1)/(a'*d);
        end
    end
    alf
    alfk=min(alf);
    x_2=x_1+alfk*d;
    % ===Step 5===
    if alfk<1
        for i=1:an
            if alf(i)==alfk
                t=i;
                break;
            end
        end
        %确定要并入有效集的值 t
        I(t)=t;
        %==重新赋值==
        %I1=union(I1,t);
        I1=find(I);
        n=size(I1,2);
        A=[];
        for i=1:n
            A=[A AM(:,I1(i))];
        end
        A
        %============
    end
    %=== End of step5

end
% ===end of step 4

x_1=x_2;
k=k+1;
end %End of while

% The Result
disp 'The Best Result:'
xbest
disp 'Correlative Assistant Parameter: '
lemta=lemta'



你可能感兴趣的:(建模与优化)