精华内容
下载资源
问答
  • 模糊线性加权法求解电力系统经济调度问题.pdf
  • 简单线性加权法在择业中应用,大学论文,简单线性加权法在择业中应用
  • 多目标决策问题主要有主要目标法、线性加权法、分层序列法、步骤法(Stem法), 本篇主要着重讲线性加权法线性加权法的特点主要是实现了将多个目标函数通过线性加权的方式集成到了单个目标函数, 那么问题就转化...
    多目标决策问题是目前数学建模中比较普遍的一类问题,
    此类问题要求我们满足多个目标函数最优与决策变量的线性约束条件或非线性约束条件下进行求解,
    多目标决策问题主要有主要目标法、线性加权法、分层序列法、步骤法(Stem法),
    本篇主要着重讲线性加权法。
    线性加权法的特点主要是实现了将多个目标函数通过线性加权的方式集成到了单个目标函数,
    那么问题就转化为了一般性的线性规划类问题。线性加权法中也可以将指标定性与定量结合,
    一定程度上增加了主观性因素。
    但笔者认为最关键的还是确定各个指标的权重,
    而熵权法与基于三角模糊数的层次分析法,模糊层次分析法FAHP,主成分分析法(PVC),
    主观赋权法(不提倡)是笔者看来比较好的确定权重的方法。
    此处先讲熵权法来确定权重,熵权法可用于任何评价类问题的指标权重确定,
    可以剔除贡献率较低的指标,可以说有且仅有此优点。
    (1)通过max-min极差标准化,z-score零均方差标准化处理将多个指标实现归一化处理
    (2)求解信息熵值
    (3)根据信息熵求解各个指标对应权重
    
    笔者写了一个比较通用的代码
    clc;clear;
        load data
        %或者使用data=xlsread('.xls'),使用txt文件导入也是可以的
        x=[];%此处可以将data处的数据进行导入
        lamda=[1,1,1,1,1,1];%---人为修权,1代表不修改计算后的指标权重
        [m,n]=size(x);
        for i=1:n
                x(:,i)=(x(:,i)-min(x(:,i)))/(max(x(:,i))-min(x(:,i)))+1;
                %对原始数据进行非负数化、归一化处理,值介于1-2之间
        end
        for i=1:m
            for j=1:n
                p(i,j)=x(i,j)/sum(x(:,j));
            end 
        end
        k=1/log(m);
        for i=1:m
        for j=1:n
            if p(i,j)~=0
                e(i,j)=p(i,j)*log(p(i,j));
            else
                e(i,j)=0;
            end
        end 
        end
        for j=1:n
            E(j)=-k*sum(e(:,j));
        end
        d=1-E;
        for j=1:n
        w(j)=d(j)/sum(d);%指标权重计算
        end
        for j=1:n
            w(j)=w(j)*lamda(j)/sum(w.*lamda);% 修改指标权重
        end
        for i=1:m
            score(i,1)=sum(x(i,:).*w);%计算综合分数
        end
        disp('各指标权重为:')
        disp(w)
        disp('各品牌综合分数为:')
        disp(score)
                </div>
                <link href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/markdown_views-d7a94ec6ab.css" rel="stylesheet">
                <link href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/style-ba784fbaf8.css" rel="stylesheet">
    
    展开全文
  • 1.线性加权法 线性加权法的适用条件是各评价指标之间相互独立, 这样就可以利用多元线性回归方法来得到各指标对应的系数。 举个例子:所评价的对象是股票, 已知一些股票的各个指标以及这些股票的历史表现,其中...

    (通过MATLAB实现)

    1.线性加权法

            线性加权法的适用条件是各评价指标之间相互独立, 这样就可以利用多元线性回归方法来得到各指标对应的系数。

            举个例子:所评价的对象是股票, 已知一些股票的各个指标以及这些股票的历史表现,其中最后一列标记为 1 的表示为上涨股票,标为 0 的表现为一般的股票,-1 的则为下跌的股票。希望根据这些已知的数据, 建立股票的评价模型,这样就可以利用模型评价新的股票。

    1.导入数据

    clear all, close all
    
    s = dataset('xlsfile', 'SampleA1.xlsx');

    2.多元线性回归

            当导入数据后,就可以先建立一个多元线性回归模型,具体实现过程和结果如下:

    myFit = LinearModel.fit(s);
    
    disp(myFit)
    sx=s(:,1:10);
    sy=s(:,11);
    n=1:size(s,1);
    sy1= predict(myFit,sx);
    figure
    plot(n,sy, 'ob', n, sy1,'*r')
    xlabel('样本编号', 'fontsize',12)
    ylabel('综合得分', 'fontsize',12)
    title('多元线性回归模型', 'fontsize',12)
    set(gca, 'linewidth',2)

            该段程序执行后,得到的模型及模型中的参数如下。

            利用该模型对原始数据进行预测,得到的股票综合得分如图1所示。从图中可以看出,尽管这些数据存在一定的偏差,但三个簇的分层非常明显,说明模型在刻画历史数据方面具有较高的准确度。

                     图1  多元线性回归模型得到的综合得分与原始得分的比较图

    3.逐步回归

            上述是对所有变量进行回归,也可以使用逐步回归进行因子筛选,并可以得到优选因子后的模型,具体实现过程如下:

    myFit2 = LinearModel.stepwise(s);
    
    disp(myFit2)
    sy2= predict(myFit2,sx);
    figure
    plot(n,sy, 'ob', n, sy2,'*r')
    xlabel('样本编号', 'fontsize',12)
    ylabel('综合得分', 'fontsize',12)
    title('逐步回归模型', 'fontsize',12)
    set(gca, 'linewidth',2)

            该段程序执行后,得到的模型及模型中的参数如下。

            从该模型中可以看出,逐步回归模型得到的模型少了 5 个单一因子,多了 5 个组合因子,模型的决定系数反而提高了一些,这说明逐步回归得到的模型精度更高些,影响因子更少些,这对于分析模型本身是非常有帮助的,尤其是在剔除因子方面。

            利用该模型对原始数据进行预测,得到的股票综合得分如图 2 所示,总体趋势和图 1 相似。

                     图2  逐步回归模型得到的综合得分与原始得分的比较图

            以上是线性加权法构建评价型模型的方法, 所用的程序框架对绝大多数的这类问题都可以直接应用,核心是要构建评价的指标体系, 这是建模的基本功。总的来说,线性加权法的特点是:

    (1)该方法能使得各评价指标间作用得到线性补偿,保证综合评价指标的公平性;

    (2)该方法中权重系数的对评价结果的影响明显,即权重较大指标值对综合指标作用较大;

    (3)该方法计算简便,可操作性强,便于推广使用。

    2.层次分析法

            层次分析法 (Analytic Hierarchy Process, AHP) 是美国运筹学家萨蒂(T. L. Saaty)等人 20 世纪 70 年代初提出的一种决策方法,它是将半定性、半定量问题转化为定量问题的有效途径,它将各种因素层次化,并逐层比较多种关联因素,为分析和预测事物的发展提供可比较的定量依据,它特别适用于那些难于完全用定量进行分析的复杂问题。因此在资源分配、选优排序、政策分析、冲突求解以及决策预报等领域得到广泛的应用。

            AHP 的本质是根据人们对事物的认知特征,将感性认识进行定量化的过程。人们在分析多个因素时,大脑很难同时梳理那么多的信息,而层次分析法的优势就是通过对因素归纳、分层,并逐层分析和量化事物,以达到对复杂事物的更准确认识,从而帮助决策。

            在数学建模中,层次分析法的应用场景比较多,归纳起来,主要有以下几个场景:

    (1) 评价、评判类的题目。这类题目都可以直接用层次分析法来评价,例如奥运会的评价、彩票方案的评价、导师和学生的相互选择、建模论文的评价、城市空气质量分析等。

    (2) 资源分配和决策类的题目。这类题目可以转化为评价类的题目,然后按照 AHP 进行求解,例如将一笔资金进行投资,有几个备选项目,那么如何进行投资分配最合理呢?这类题目中还有一个典型的应用,就是方案的选择问题,比如旅游景点的选择、电脑的挑选、学校的选择、专业的选择等等,这类应用可以说是 AHP 法最经典的应用场景了。

    (3) 一些优化问题,尤其是多目标优化问题。对于通常的优化问题,目前已有成熟的方法求解。然而,这些优化问题一旦具有如下特性之一,如:

    ①问题中存在一些难以度量的因素;

    ②问题的结构在很大程度上依赖于决策者的经验;

    ③问题的某些变量之间存在相关性;

    ④需要加入决策者的经验、偏好等因素,

    这时就很难单纯依靠一个优化的数学模型来求解。这类问题,通常的做法是借助 AHP 法将复杂的问题转化为典型的、便于求解的优化问题,比如多目标规划,借助层次分析法,确定各个目标的权重,从而将多目标规划问题转化为可以求解的单目标规划问题。

            如何用 MATLAB 来实现层次分析法的过程,层次分析法中,需要 MATLAB 的地方主要就是将评判矩阵,转化为因素的权重矩阵。为此,这里只介绍如何用 MATLAB 来实现这一转化。

    将评判矩阵转化为权重矩阵,通常的做法就是求解矩阵最大特征根和对应阵向量。

    需要注意的是,在将评判矩阵转化为权重向量的过程中,一般需要先判断评判矩阵的一致性,因为通过一致性检验的矩阵,得到的权重才更可靠。

            下面就以一个实例来说明如何应用 MATLAB 来求解权重矩阵,具体程序如下:

    %% AHP法权重计算MATLAB程序
    
    %% 数据读入
    
    clc
    
    clear all
    
    A=[1 2 6; 1/2 1 4; 1/6 1/4 1];% 评判矩阵
    
    %% 一致性检验和权向量计算
    
    [n,n]=size(A);
    
    [v,d]=eig(A);
    
    r=d(1,1);
    
    CI=(r-n)/(n-1);
    
    RI=[0 0 0.58 0.90 1.12 1.24 1.32 1.41 1.45 1.49 1.52 1.54 1.56 1.58 1.59];
    
    CR=CI/RI(n);
    
    if  CR<0.10
    
        CR_Result='通过';
    
       else
    
        CR_Result='不通过';  
    
    end
    
     
    
    %% 权向量计算
    
    w=v(:,1)/sum(v(:,1));
    
    w=w';
    
     
    
    %% 结果输出
    
    disp('该判断矩阵权向量计算报告:');
    
    disp(['一致性指标:' num2str(CI)]);
    
    disp(['一致性比例:' num2str(CR)]);
    
    disp(['一致性检验结果:' CR_Result]);
    
    disp(['特征值:' num2str(r)]);
    
    disp(['权向量:' num2str(w)]);

            运行该程序,可得到以下结果:

    该判断矩阵权向量计算报告:
    
    一致性指标:0.0046014
    
    一致性比例:0.0079334
    
    一致性检验结果:通过
    
    特征值:3.0092
    
    权向量:0.58763     0.32339    0.088983

            应用这段程序时,只要将评判矩阵输入到程序中,其它地方都不需要修改,然后就可以直接、准确地计算出对应的结果,所以这段程序在实际使用中非常灵活。

    展开全文
  • 优化设计——多目标函数优化(降维/主目标法、线性加权法、理想点法)——MATLAB编程建议与本人前几篇博文程序互相参照,系列程序有继承性,一些程序段功能实现代码与原理在前几篇博文中都有提到!优化原理降维/主...

    2020.06.07修改(F2(x)函数输入输错了,只是结果偏差,程序逻辑没问题,已修正)

    建议与本人前几篇博文程序互相参照,系列程序有继承性,一些程序段功能实现代码与原理在前几篇博文中都有提到!

    案例如下:
    在这里插入图片描述

    优化原理

    降维/主目标法

    主目标法就是从多目标中依据重要程度选择一个目标作为主目标,而将其它目标转化为约束,即将多目标优化问题转化为单目标问题。

    线性加权法

    在具有多个指标的优化问题中,可以给予那些相对重要的指标较大的权系数,于是可将多目标优化问题转化为所有目标加权求和的单目标优化问题。

    理想点法

    即先求解每个单目标问题的最优解,将所有单目标问题最优解作为期望值,寻求可行域内距离期望解最近的点作为多目标优化问题的最优解。

    具体原理不在这里过多赘述,不少优化设计有关资料都有关于此三种方法的详细介绍

    MATLAB程序

    三种方法的计算全部在同一主程序main内,附有四个子程序(复合型法优化程序minfun、minfun2与可行域判断程序judge、judge2
    其中,minfun2judge2子程序为降维/主目标法服务,minfunjudge子程序为线性加权法与理想点法服务:

    主程序main:

    %% 初始参数设定,求f最小值
    syms x1 x2 x
    D1=100;D2=80;L=1000;E=2.06e11;%单位为mm
    f1=pi/4*(x1*(D2^2-x2^2)+(L-x1)*(D1^2-x2^2));%目标函数输入
    f2=64/(3*pi*E)*(x1^3*(1/(D2^4-x2^4)-1/(D1^4-x2^4))+L^3/(D1^4-x2^4));%目标函数输入
    e2=1e-3;%复合型法收敛e2
    xa=0.5;xb=40;%可行域内初始点,可通过judge函数选取
    %约束条件(在 judge函数)
    
    %% a.降维法、主目标法
    % f1为主目标函数,f2转化为约束条件
    % 先用复合型法求取f2的有约束最优解x20,得到ffx20
    minx20=minfun(f2,xa,xb,e2);
    ffx20=double(subs(f2,symvar(f2),minx20'));
    %f2转化的约束条件为f2<=ff20+abs(e1*ffx20),g5=f2-ffx20-abs(e1*ffx20);
    e1=0.02;
    e3=ffx20+abs(e1*ffx20);
    %再用复合型法直接求含g5约束条件的f1的解
    minxa=minfun2(f1,xa,xb,e2,e3);
    ffxa1=double(subs(f1,symvar(f1),minxa'));
    ffxa2=double(subs(f2,symvar(f2),minxa'));
    minxa
    ffxa1
    ffxa2
    %% a END %%
    
    
    %% b.线性加权法
    fb=0.6*f1+0.4*f2;%构造新目标函数fb
    %复合型法求解fb
    minxb=minfun(fb,xa,xb,e2);
    ffxb1=double(subs(f1,symvar(f1),minxb'));
    ffxb2=double(subs(f2,symvar(f2),minxb'));
    minxb
    ffxb1
    ffxb2
    %% b END %%
    
    
    %% c.理想点法求解
    % 先对f1复合型法求解最优解xc1
    xc1=minfun(f1,xa,xb,e2);
    ffc1=double(subs(f1,symvar(f1),xc1'));
    % 再对f2复合型法求解最优解xc2
    xc2=minfun(f2,xa,xb,e2);
    ffc2=double(subs(f2,symvar(f2),xc2'));
    fc=sqrt((f1-ffc1)^2+(f2-ffc2)^2);
    % 复合型法求解fc
    minxc=minfun(fc,xa,xb,e2);
    ffxc1=double(subs(f1,symvar(f1),minxc'));
    ffxc2=double(subs(f2,symvar(f2),minxc'));
    minxc
    ffxc1
    ffxc2
    %% c END %%
    

    复合型法minfun2:

    function minx=minfun2(f,xa,xb,e2,e3)       
    
    %% 初始参数设定,求f最小值
    syms x1 x2 x
    % 可行域条件在judge2子函数中.m文件中
    h=2;     % 初始单纯形构造因子
    hi=1;    % 初始单纯型构造因子系数
    alpha=1; %  alpha  反射因子
    ai=0;    %  反射因子系数
    gama=2;  %  gama   扩张因子
    beta=0.5;%  beta   收缩因子
    eps=e2;%  eps    精度值
    n = 0;  %迭代循环次数
    m = 1000;  %精度差值
    k = 0;  %数据记录
    g = 0;  %操作记录
    %% 构造初始单纯形
    x0=[xa xb];% 给定在可行域内初始点
    x0=x0';
    X(:,1)=x0;
    Num_var_f=length(symvar(f));%二维函数
    for i = 1:Num_var_f %二维函数,需要三个顶点坐标
        x = zeros(Num_var_f,1);%预分配内存
        x=x0;
        x(i) = x0(i) + h/hi;
        X(:,i+1)=x;% 将单纯形按列从左往右存储
    end
    for i = 1:Num_var_f+1
            F_val(i)=double(subs(f,symvar(f),X(:,i)'));
    end
    [F_sort,F_index]=sort(F_val);%从小到大排列函数
        % 最好点
        f_best_0=F_sort(1);
        X_best_0=X(:,F_index(1));
        % 最差点
        f_bad_n=F_sort(end);
        X_bad_n=X(:,F_index(end));
        % 次差点
        f_nextbad_1n=F_sort(end-1);
        X_nextbad_1n=X(:,F_index(end-1));
        % 计算形心
        Xc_n1=1/Num_var_f*sum(X(:,F_index(1:end-1)),2);
        f_Xc_n1=double(subs(f,symvar(f),Xc_n1'));
        
     %% 判断顶点不在可行域内以及型心在不在可行域内
    while judge2(X(1,1),X(2,1),e3)<1&&judge2(X(1,2),X(2,2),e3)<1&&judge2(X(1,3),X(2,3),e3)<1&&judge2(Xc_n1(1,1),Xc_n1(2,1),e3)<1
        
        hi=2*hi;
      for i = 1:Num_var_f %二维函数,需要三个顶点坐标
        x = zeros(Num_var_f,1);%预分配内存
        x=x0;
        x(i) = x0(i) + h/hi;
        X(:,i+1)=x;% 将单纯形存储
      end
        %计算函数值
        for i = 1:Num_var_f+1
            F_val(i)=double(subs(f,symvar(f),X(:,i)'));
        end
        [F_sort,F_index]=sort(F_val);%从小到大排列函数
        % 最好点
        f_best_0=F_sort(1);
        X_best_0=X(:,F_index(1));
        % 最差点
        f_bad_n=F_sort(end);
        X_bad_n=X(:,F_index(end));
        % 次差点
        f_nextbad_1n=F_sort(end-1);
        X_nextbad_1n=X(:,F_index(end-1));
        % 计算形心
        Xc_n1=1/Num_var_f*sum(X(:,F_index(1:end-1)),2);
        f_Xc_n1=double(subs(f,symvar(f),Xc_n1'));
    end
    
        %% 循环迭代语句
     while m > eps
       
        %% 反射
        flag = 0;
        X_reflect_n2=Xc_n1+alpha*(Xc_n1-X_bad_n);
        f_reflect_n2=double(subs(f,symvar(f),X_reflect_n2'));
        ai=0;
    while judge2(X_reflect_n2(1,1),X_reflect_n2(2,1),e3)<1%判断反射点在不在可行域内
       ai=ai+1;%太慢 
        if ai>10  %% 系数缩小是否过多
             flag = 0;
        X_reflect_n2=Xc_n1+alpha*(1/2^(ai-10))*(Xc_n1-X_nextbad_1n);
         f_reflect_n2=double(subs(f,symvar(f),X_nextbad_1n'));%% (方向不对,利用次差点重新找方向)
           if ai>20
            error=1;
           disp('无法收敛,请重新构造初始单纯型');
             break
           end
        else
         flag = 0;
        X_reflect_n2=Xc_n1+alpha*(1/2^ai)*(Xc_n1-X_bad_n);
         f_reflect_n2=double(subs(f,symvar(f),X_reflect_n2'));
        end
    end
        %% 反射成功 
        if  f_reflect_n2<f_best_0  % 反射点R<最好点
            %% 进行扩张
             X_reflect_expand_n3=Xc_n1+gama*(Xc_n1-X_bad_n);%扩张
             f_reflect_expand_n3=double(subs(f,symvar(f),X_reflect_expand_n3'));
             if f_reflect_expand_n3 < f_best_0 &&judge2( X_reflect_expand_n3(1,1),X_reflect_expand_n3(2,1),e3)>=1%判断扩张点是否在可行域内%扩张点继续缩小
                 X(:,F_index(end)) = X_reflect_expand_n3; %将其作为单纯型的新顶点
                 g=1;%扩张点
             else 
                 X(:,F_index(end)) = X_reflect_n2; %采用扩张前的点作为单纯形的新顶点
                 g=0;%反射点
             end
             flag = 1; %反射成功标志位
        end
        %% 反射失败
        if flag == 0  %说明没有反射成功
            if f_reflect_n2 < f_nextbad_1n  %反射点<次差点
                X(:,F_index(end)) = X_reflect_n2;%采用该反射点作为新的顶点
                g=0;%反射点
            %% 进行收缩
            else   % f_reflect >= f_nextbad
                X_reflect_shrink_n4=Xc_n1+beta*(X_reflect_n2-Xc_n1);% 收缩点
                f_reflect_shrink_n4=double(subs(f,symvar(f),X_reflect_shrink_n4'));
                X(:,F_index(end)) = X_reflect_shrink_n4;
                g=2;%收缩点
            end
        end
         %% 计算迭代完后函数序列,并计算精度
        for i = 1:Num_var_f+1
            F_val(i)=double(subs(f,symvar(f),X(:,i)'));
        end
        [F_sort,F_index]=sort(F_val);%从小到大排列函数
        % 最好点
        f_best_0=F_sort(1);
        X_best_0=X(:,F_index(1));
        % 最差点
        f_bad_n=F_sort(end);
        X_bad_n=X(:,F_index(end));
        % 次差点
        f_nextbad_1n=F_sort(end-1);
        X_nextbad_1n=X(:,F_index(end-1));
        % 计算形心
        Xc_n1=1/Num_var_f*sum(X(:,F_index(1:end-1)),2);
        f_Xc_n1=double(subs(f,symvar(f),Xc_n1'));
        % 计算精度与迭代次数
        m=abs(double(subs(f,symvar(f),X(:,F_index(end))'))-f_Xc_n1);
        n=n+1;
        % 运算数据记录
    
    end  
    %% 结果输出
    minx=X_best_0;
    
    

    复合型法minfun:

    function minx=minfun(f,xa,xb,e2)       
    
    %% 初始参数设定,求f最小值
    syms x1 x2 x
    % 可行域条件在judge子函数中.m文件中
    h=2;     % 初始单纯形构造因子
    hi=1;    % 初始单纯型构造因子系数
    alpha=1; %  alpha  反射因子
    ai=0;    %  反射因子系数
    gama=2;  %  gama   扩张因子
    beta=0.5;%  beta   收缩因子
    eps=e2;%  eps    精度值
    n = 0;  %迭代循环次数
    m = 1000;  %精度差值
    k = 0;  %数据记录
    g = 0;  %操作记录
    %% 构造初始单纯形
    x0=[xa xb];% 给定在可行域内初始点
    x0=x0';
    X(:,1)=x0;
    Num_var_f=length(symvar(f));%二维函数
    for i = 1:Num_var_f %二维函数,需要三个顶点坐标
        x = zeros(Num_var_f,1);%预分配内存
        x=x0;
        x(i) = x0(i) + h/hi;
        X(:,i+1)=x;% 将单纯形按列从左往右存储
    end
    for i = 1:Num_var_f+1
            F_val(i)=double(subs(f,symvar(f),X(:,i)'));
    end
    [F_sort,F_index]=sort(F_val);%从小到大排列函数
        % 最好点
        f_best_0=F_sort(1);
        X_best_0=X(:,F_index(1));
        % 最差点
        f_bad_n=F_sort(end);
        X_bad_n=X(:,F_index(end));
        % 次差点
        f_nextbad_1n=F_sort(end-1);
        X_nextbad_1n=X(:,F_index(end-1));
        % 计算形心
        Xc_n1=1/Num_var_f*sum(X(:,F_index(1:end-1)),2);
        f_Xc_n1=double(subs(f,symvar(f),Xc_n1'));
        
     %% 判断顶点不在可行域内以及型心在不在可行域内
    while judge(X(1,1),X(2,1))<1&&judge(X(1,2),X(2,2))<1&&judge(X(1,3),X(2,3))<1&&judge(Xc_n1(1,1),Xc_n1(2,1))<1
        
        hi=2*hi;
      for i = 1:Num_var_f %二维函数,需要三个顶点坐标
        x = zeros(Num_var_f,1);%预分配内存
        x=x0;
        x(i) = x0(i) + h/hi;
        X(:,i+1)=x;% 将单纯形存储
      end
        %计算函数值
        for i = 1:Num_var_f+1
            F_val(i)=double(subs(f,symvar(f),X(:,i)'));
        end
        [F_sort,F_index]=sort(F_val);%从小到大排列函数
        % 最好点
        f_best_0=F_sort(1);
        X_best_0=X(:,F_index(1));
        % 最差点
        f_bad_n=F_sort(end);
        X_bad_n=X(:,F_index(end));
        % 次差点
        f_nextbad_1n=F_sort(end-1);
        X_nextbad_1n=X(:,F_index(end-1));
        % 计算形心
        Xc_n1=1/Num_var_f*sum(X(:,F_index(1:end-1)),2);
        f_Xc_n1=double(subs(f,symvar(f),Xc_n1'));
    end
    
        %% 循环迭代语句
     while m > eps
       
        %% 反射
        flag = 0;
        X_reflect_n2=Xc_n1+alpha*(Xc_n1-X_bad_n);
        f_reflect_n2=double(subs(f,symvar(f),X_reflect_n2'));
        ai=0;
    while judge(X_reflect_n2(1,1),X_reflect_n2(2,1))<1%判断反射点在不在可行域内
       ai=ai+1;%太慢 
        if ai>10  %% 系数缩小是否过多
             flag = 0;
        X_reflect_n2=Xc_n1+alpha*(1/2^(ai-10))*(Xc_n1-X_nextbad_1n);
         f_reflect_n2=double(subs(f,symvar(f),X_nextbad_1n'));;%% (方向不对,利用次差点重新找方向)
           if ai>20
            error=1;
            disp('无法收敛,请重新构造初始单纯型');
             break
           end
        else
         flag = 0;
        X_reflect_n2=Xc_n1+alpha*(1/2^ai)*(Xc_n1-X_bad_n);
         f_reflect_n2=double(subs(f,symvar(f),X_reflect_n2'));
        end
    end
        %% 反射成功 
        if  f_reflect_n2<f_best_0  % 反射点R<最好点
            %% 进行扩张
             X_reflect_expand_n3=Xc_n1+gama*(Xc_n1-X_bad_n);%扩张
             f_reflect_expand_n3=double(subs(f,symvar(f),X_reflect_expand_n3'));
             if f_reflect_expand_n3 < f_best_0 &&judge( X_reflect_expand_n3(1,1),X_reflect_expand_n3(2,1))>=1%判断扩张点是否在可行域内%扩张点继续缩小
                 X(:,F_index(end)) = X_reflect_expand_n3; %将其作为单纯型的新顶点
                 g=1;%扩张点
             else 
                 X(:,F_index(end)) = X_reflect_n2; %采用扩张前的点作为单纯形的新顶点
                 g=0;%反射点
             end
             flag = 1; %反射成功标志位
        end
        %% 反射失败
        if flag == 0  %说明没有反射成功
            if f_reflect_n2 < f_nextbad_1n  %反射点<次差点
                X(:,F_index(end)) = X_reflect_n2;%采用该反射点作为新的顶点
                g=0;%反射点
            %% 进行收缩
            else   % f_reflect >= f_nextbad
                X_reflect_shrink_n4=Xc_n1+beta*(X_reflect_n2-Xc_n1);% 收缩点
                f_reflect_shrink_n4=double(subs(f,symvar(f),X_reflect_shrink_n4'));
                X(:,F_index(end)) = X_reflect_shrink_n4;
                g=2;%收缩点
            end
        end
         %% 计算迭代完后函数序列,并计算精度
        for i = 1:Num_var_f+1
            F_val(i)=double(subs(f,symvar(f),X(:,i)'));
        end
        [F_sort,F_index]=sort(F_val);%从小到大排列函数
        % 最好点
        f_best_0=F_sort(1);
        X_best_0=X(:,F_index(1));
        % 最差点
        f_bad_n=F_sort(end);
        X_bad_n=X(:,F_index(end));
        % 次差点
        f_nextbad_1n=F_sort(end-1);
        X_nextbad_1n=X(:,F_index(end-1));
        % 计算形心
        Xc_n1=1/Num_var_f*sum(X(:,F_index(1:end-1)),2);
        f_Xc_n1=double(subs(f,symvar(f),Xc_n1'));
        % 计算精度与迭代次数
        m=abs(double(subs(f,symvar(f),X(:,F_index(end))'))-f_Xc_n1);
        n=n+1;
        % 运算数据记录
    
    end  
    %% 结果输出
    minx=X_best_0;
    

    可行域判断judge2:

    function [J]=judge2(x1,x2,e3)
    %% 约束条件
    D1=100;D2=80;L=1000;E=2.06e11;%单位为mm
    g1=(9.78e6)*x1/(4.096e7-x2^4)-180;
    g2=x2-80;
    g3=40-x2;
    g4=-x1;
    g5=(64/3*pi*E)*(x1^3*(1/(D2^4-x2^4)-1/(D1^4-x2^4))+L^3/(D1^4-x2^4))-e3;
    % 可行域条件
    if g1<=0&&g2<=0&&g3<=0&&g4<=0&&g5<=0
        J=1;
    else
        J=0;
    end
    
    

    可行域判断judge:

    function [J]=judge(x1,x2)
    %% 约束条件
    g1=(9.78e6)*x1/(4.096e7-x2^4)-180;
    g2=x2-80;
    g3=40-x2;
    g4=-x1;
    
    % 可行域条件
    if g1<=0&&g2<=0&&g3<=0&&g4<=0
        J=1;
    else
        J=0;
    end
    
    

    程序运行结果

    降维/主目标法运行结果:
    minxa=(17.8871,17.8949);
    ffxa1= 7.548e+06;

    线性加权法运行结果:
    minxb=(0,80.0000);
    ffxb1=6.5957e+06;
    ffxb2=5.5834e-10;

    理想点法运行结果:
    minxc=(0,80.0000);
    ffxc1= 6.5957e+06;
    ffxc2=5.5834e-10;

    ps:如果minfun程序显示“无法收敛,请重新构造单纯型”,其原因可参看此文:https://blog.csdn.net/Randall_crow_J/article/details/106265961

    展开全文
  • 线性加权

    2021-09-30 16:34:45
    线性加权是一种评价函数方法。是按各目标的重要性赋予它相应的权系数,然后对其线性组合进行寻优的求解多目标规划问题的方法。对于问题(VMP),即归结为求:[1] 的最优解,其中wk≥0(k=1,2,…,m)为权...

    线性加权和法是一种评价函数方法。是按各目标的重要性赋予它相应的权系数,然后对其线性组合进行寻优的求解多目标规划问题的方法。对于问题(VMP),即归结为求: [1]

     

    的最优解,其中wk≥0(k=1,2,…,m)为权系数,且: [2]


    评价函数方法

    编辑 语音

    评价函数方法是一类求解多目标规划问题的方法。是通过构造一个把多个目标转化为单个数值目标的评价函数,将多目标规划问题归结为求解相应评价函数的数值最优化问题的方法的统称。一般地,采用不同形式的评价函数可求得多目标规划问题的不同意义下的解。常用的评价函数方法有线性加权和法、极大-极小法和理想点法。

    展开全文
  • 将物体波前中的振幅信息与相位信息同时作为焦平面判定准则,...运用线性加权法,将物体的振幅CC 曲线和相位CC 曲线峰值所确定的焦平面距离加权来确定物体的焦平面。运用一系列实验验证了该焦平面方法的可行性和有效性。
  • 由于传统模型无法准确描述其地质状况的复杂性,所以在建立属性模型时,采用改进后的加权线性规划对变差函数进行拟合,随后对地质储量进行复算。研究表明,改进后的加权线性规划能够显著提高变差函数拟合精度,建立的...
  • 带钢的表面缺陷种类繁多,各种缺陷的严重程度也不尽相同,本文主要针对带钢的质量等级评价方法进行了讨论,提出了线性加权评价与聚类分析,通过确定各级权重值、利用最短距离,对同批次带钢的质量等级进行了...
  • 对于一般的非线性系统,通用加权测量融合(WMF)算法通过泰勒级数展开表示。基于建议的融合算法和著名的无味卡尔曼滤波器(UKF),即WMF-UKF。事实证明,所提出的WMF-UKF渐近地趋向于集中式测量融合UKF(CMF-UKF)...
  • 局部加权法MATLAB实现

    2015-09-11 13:15:23
    局部加权法利用MATLAB实现,自己写的
  • 为了更好地为一项新设计任务估算合理的设计时间,为流程设计者提供...采用加权分配对工作流各个节点的执行时间进行估算,给出了加权分配的公式,并采用正态分布对工作流及工作流各个任务节点的工作进度进行了估算。
  • 局部加权线性回归线性回归的一个问题是可能出现 欠拟合 现象,因为它求的是 最小均方误差的无偏估计 。我们可以在估计中引入一些偏差,从而降低预测的均方误差。其中的一个方法是  局部 加权 线性回归 。...
  • 多目标线性规划求解方法及matlab实现

    万次阅读 多人点赞 2018-01-21 14:51:02
    求解多目标线性规划的基本思想是将多目标转化为单目标,常见的方法有理想点法、线性加权法、最大最小法、目标规划法、模糊数学解法等。这里就这几种方法进行举例说明,并用matlab实现。 一、多目标线性规划模型 ...
  • matlab开发-加权加权线性。对不同标准差的数据点进行加权拟合。
  • 证明了经典的加权残值和新成立的归一化加权残值是解决结构动力学数值收敛性问题的有效方法。归一加权残值也延伸到解二阶非线性常微分方程,数值例子说明了其有效性。
  • 图像处理之双线性插值

    万次阅读 多人点赞 2018-04-22 19:02:31
    线性插值线性插值 2、另一位牛人讲的比较易懂 1.双线性插值 2.存在的问题 3、又是另一位讲的通俗易懂 1,原理 2,计算方法 3,加速以及优化策略 3.1 源图像和目标图像几何中心的对齐  3.2 将浮点运算...
  • 残差恒定是线性回归建模的一个前提条件,《线性回归中的方差齐性探察》一文曾介绍过各种线性回归的方差齐性的检验方法。...SPSS中至少有两个过程可以实现加权线性回归,一是直接在线性回归中直接指明权...
  • 以一个点 x为中心,向前后截取一段长度为frac的数据,对于该段数据用权值函数 w做一个加权线性回归,记 ( x , y ^ )为该回归线的中心值,其中 y ^为x拟合后曲线对应值。对于所有的n个数据点则可以做出n条加权回归...
  • 局部加权线性回归,使用matlab编写,有结果图 程序流程为 标准化 样本矩阵与输出向量 计算权重对角矩阵 梯度下降 反标准化 显示
  • 使用非线性拉格朗日函数迭代拟合直线方程
  • 这里我们将详细介绍线性回归、局部加权线性回归,简单介绍岭回归、lasso回归及逐步线性回归。 线性回归 概念梳理 回归的目的就是预测数值型的目标值。最直接的办法是依据输入写出一个目标值的计算公式...
  • 线性加权最小二乘优化的点到面ICP算法
  • MATLAB局部加权线性拟合

    千次阅读 2019-11-10 13:20:21
    局部加权线性拟合相对于多项式拟合,计算线性模型时引入了一个加权函数: 来给当前预测数据分配权重。给距离近的点更高的权重,给距离远的点更低的权重,往往能具有更高的精确性。 x=(1:0.1:10)'; y=x.^2+3.*x+...
  • 1、线性回归,岭回归,Lasso回归,局部加权线性回归 2、logistic回归,softmax回归,最大熵模型 3、广义线性模型 4、Fisher线性判别和线性感知机 5、三层神经网络 6、支持向量机...
  • 在本文中,我们提出了通过凸松弛来解决线性模型问题的连续迭代加权最小二乘算法(CIRLS),并证明了该算法的收敛性。 在某些情况下,我们给出算法的误差范围。 另外,数值结果表明了该算法的有效性。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,100
精华内容 10,840
关键字:

线性加权法