zoukankan      html  css  js  c++  java
  • 四种规划-数学建模

    1.线性规划  -->Liner Programming(LP)

      1)目标函数+约束条件(均为线性函数)

        a.目标函数

        b.约束条件:等式约束和不等式约束

      2)化为标准Matlab形式(min,<=)

        [x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,X0,OPTIONS)

    clear all;
    c=[2;3;-5];
    A=[-2,5,-1;1,3,1];
    b=[-10;12];
    Aeq=[1,1,1];
    beq=7;
    x=linprog(-c,A,b,Aeq,beq,zeros(1,3));
    value=c'*x;

      3)可以转化为线性规划的问题

        a.  min |x1|+|x2|+...+|xn|  s.t.  Ax<=b  目标函数不是线性函数,但可以通过u,v转换化为线性规划问题

        b.运输问题(产销平衡)

        c.指派问题(指派n个人做n项工作)  -->若第i个人去做第j件工作,xij=1,否则xij=0;(0-1规划问题)

           匈牙利算法:将系数矩阵进行变换

      4)对偶理论

        a.将等式约束转化为不等式约束

        b.根据对偶理论已知对偶问题的最优解来求解原问题的最优解

      5)灵敏度分析和参数线性规划

      6)投资的收益和风险问题

        a.模型假设:总体风险用投资项目中风险最大的一个来度量;n中资产投资项目相互独立

        b.模型建立:建立风险目标函数和收益目标函数,收益目标函数中忽略交易定额的影响

        c.将多目标规划模型转化为单目标规划模型(1.将其中一个目标函数界定为约束条件;2.通过权重将多目标函数化为单目标函数)

        d.Matlab编程进行模型求解

        e.以界定最大风险值为a将风险目标函数化为约束条件为例:从a=0开始,以步长为0.001进行循环搜索最佳风险度

    clc,clear
    a=0;
    hold on
    while a<0.05  %界定最大风险度为0.05
        c=[-0.05,-0.27,-0.19,-0.185,-0.185];  %收益目标函数系数矩阵
        A=[zeros(4,1),diag([0.025,0.015,0.055,0.026])];  %风险系数矩阵,zeros(4,1)为银行存款无风险,diag将向量转化为对角矩阵
        b=a*ones(4,1);
        Aeq=[1,1.01,1.02,1.045,1.065];
        beq=1;
        LB=zeros(5,1);
        [x,Q]=linprog(c,A,b,Aeq,beq,LB);
        Q=-Q;
        plot(a,Q,'*r');
        a=a+0.001;
    end
    xlabel('a'),ylabel('Q')

        f.结果分析

    2.整数规划

      1)分支定界法  -->先求解线性规划问题得到最优解,分支,定界,剪枝

      2)割平面法

      3)隐枚举法  -->试探出一个可行解,增加一个新的约束条件,穷举法求解(不满足新建约束的无需计算)

      4)匈牙利法  -->对系数矩阵进行变换得到一个每行每列都含0元素的矩阵

      5)蒙特卡洛法  -->随机取样

      6)0-1变量问题

        a.相互排斥的计划(投资场所的选定)

        b.相互排斥的约束

    3.非线性规划

      1)x=fmincon(fun,x0,A,b,Aeq,beq,LB,UB,NONLCON,options)

    clc,clear
    options=optimset('largescale','off');
    [x,y]=fmincon('ques02_fun1',rand(3,1),[],[],[],[],zeros(3,1),[],'ques02_fun2',options);
    function f=ques02_fun1(x);
    f=sum(x.^2)+8;
    function [g,h]=ques02_fun2(x);
    g=[-x(1)^2+x(2)-x(3)^2
        x(1)+x(2)^2+x(3)^3-20];
    h=[-x(1)-x(2)^2+2
        x(2)+2*x(3)^2-3];

      2)迭代求解非线性规划  -->步长t和方向p

      3)凸规划  -->目标函数与约束条件为凸函数,则其可行域为凸集,且局部最优解即为全剧最优解

      4)无约束问题

        a.一维搜索法  -->沿着某一已知方向求目标函数的极小点

        b.斐波那契法  -->根据斐波那契数列确定探索点(对称)

        c.0.618法  -->探索点区间缩短率固定为0.618

        d.二次插值法  -->区间连续时,考虑用多项式插值进行一维搜索,不断用低次多项式来近似目标函数

        e.梯度法    -->下降的方向沿负梯度方向(下降速度最快),终止条件为梯度为0或小于某一阈值

          minf(x)=x1^2+25*x2^2

    clc,clear
    x=[2;2];          %初始值
    [f0,g]=ques04_fun(x);
    while norm(g)>0.000001  %norm求向量g的2范数  
        p=-g/norm(g);    %p为下降的方向
        t=1.0;    %初始t为1
        f=ques04_fun(x+t*p);   %找到是目标函数最小的t 
        while f>f0
            t=t/2;
            f=ques04_fun(x+t*p);
        end
        x=x+t*p;
        [f0,g]=ques04_fun(x);
    end
    x,f0
    function [f,df]=ques04_fun(x);
    f=x(1)^2+25*x(2)^2;     %目标函数
    df=[2*x(1)       %梯度函数     
        50*x(2)];     

        f.牛顿法  -->下降的方向为p^k=-[▽^2f(x^k)]^(-1)▽f(x^k),收敛速度快,但维数较高时计算量大(需要求解二阶导数矩阵及其逆)

    clc,clear
    x=[2;2];
    [f0,g1,g2]=ques05_fun(x);
    while norm(g1)>0.00001
        p=-inv(g2)*g1;
        p=p/norm(p);
        t=1.0;
        f=ques05_fun(x+p*t);
        while f>f0
            t=t/2;
            f=ques05_fun(x+p*t);
        end
        x=x+t*p;
        [f0,g1,g2]=ques05_fun(x);
    end
    x,f0
    function [f,df,d2f]=ques05_fun(x);
    f=x(1)^4+25*x(2)^4+x(1)^2*x(2)^2;
    df=[4*x(1)^3+2*x(1)*x(2)^2
        100*x(2)^3+x(1)^2*2*x(2)];
    d2f=[12*x(1)^2+2*x(2)^2,4*x(1)*x(2)
        4*x(1)*x(2),300*x(2)^2+2*x(1)^2];

        g.变尺度法    -->构造一个矩阵H来逼近二阶导矩阵的逆矩阵,H0为单位矩阵,之后按式18得到

        h.直接法    -->目标函数不可导或难以解析

        i.Matlab解无约束极值问题  -->fminunc  fminsearch

          [x,fval]=fminunc(fun,x0,options,p1,p2,...)  ->fun为一个m文件,返回值为(目标函数,一阶导数阵,二阶导数阵),p1,p2为传递给fun的参数

    clc,clear
    options=optimset('GradObj','on');
    [x,fvl]=fminunc('ques06_fun',rand(1,2),options)
    function [f,g]=ques06_fun(x);
    f=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
    g=[-200*(x(2)-x(1)^2)*2*x(1)-2*(1-x(1))
        200*(x(2)-x(1)^2)];

      5)约束极值问题

        a.二次规划  -->目标函数为二次函数,约束条件线性

          Matlab解法:[x,fval]=quadprog(h,f,A,b,Aeq,beq,LB,UB,x0,options)  -->min1/2x'Hx+f'x  ,H为二次项系数矩阵,f为一次项系数

    clc,clear
    H=[4,-4;-4,8];
    f=[-6;-3];
    A=[1,1;4,1];
    b=[3,9];
    [x,value]=quadprog(H,f,A,b,[],[],zeros(2,1))

        b.罚函数法  -->将约束条件转化为适当的罚函数构造增广目标函数,转化为无约束非线性规划问题  SUMT

      6)Matlab优化工具箱:  fminbnd(单变量非线性函数在区间上)  fseminf(半无穷约束)  fminimax(目标函数为最大最小值型)  fmincon-->可以使用梯度下降法,见例13

    4.动态规划    -->求解以时间划分阶段的动态过程的优化问题

      1)基本概念:阶段、状态X、决策U、策略P(决策集合)、状态转移方程T、指标函数V(衡量过程优劣的数量指标,和、积、最大、最小)、最优策略(使指标函数达到最优值的策略)、最优轨线

  • 相关阅读:
    IMX6ULL开发板Ubuntu文件系统Ubuntu-base构建
    迅为3399开发板新增目标检测技术-RKSSD-编译程序
    国际化支持、activity生命周期、屏幕翻转的ui适配
    java调用第三方接口(转载)
    android基础控件的使用
    java并发框架--Fork-Join
    java并发框架--Executor
    多线程管理
    死锁问题
    java多线程信息共享
  • 原文地址:https://www.cnblogs.com/bigger-class/p/6863620.html
Copyright © 2011-2022 走看看