线性规划

题型:有限的条件下,最大的收益

一组公式和对公式中每个变量的解释,就是一个线性规划模型。

线性规划就是在一组线性约束条件下,求线性目标函数的最大或最小值(线性意味着每个变量都是一次方)

数学建模_最小值



数学建模_线性规划_02



注意点:就是要先化成matlab标准模型,然后再根据linprog函数来求对应的参数再带进去,最后记得要取负。

代码:

f = [-40;-30];
a = [1,1;-1,0;0,-1;240,120];
b = [6;-1;-1;1200];
[x,y] = linprog(f,a,b)
y = -y





非线性规划

数学建模_线性规划_03



数学建模_最小值_04

看到角度、收益率等就要想到非线性规划


代码:

function f = fun1(x)
f = x(1)^2+x(2)^2+x(3)^2+8;


function [g,h] = fun2(x)
g = [-x(1)^2+x(2)-x(3)^2    %g是非线性不等式
    x(1)+x(2)^2+x(3)^3-20]
h = [-x(1)-x(2)^2+2         %h是非线性等式
    x(2)+2*x(3)^2-3]
    
    
    
    
[x,y] = fmincon('fun1',[12;0;0],[],[],[],[],[0;0;0],[],'fun2')







多规划目标

数学建模_最小值_05


数学建模_最小值_06


数学建模_线性规划_07


数学建模_线性规划_08


序贯算法


clc,clear
%初始化优化问题框架
 
%创建优化变量
%%2个产品【用x表示】【最小值=0】
x = optimvar('x',2,'LowerBound',0);
%%3个目标函数的正偏差变量 【最小值=0】
dp = optimvar('dp',3,'LowerBound',0);
%%3个目标函数的负偏差变量 【最小值=0】
dm = optimvar('dm',3,'LowerBound',0);
 
%创建优化问题对象
p = optimproblem('ObjectiveSense','min');
 
%设置约束条件
 
%%设置绝对约束
p.Constraints.cons1 = (2*x(1)+x(2)<=11);
%%设置3个目标约束
p.Constraints.cons2 = [x(1)-x(2)-dp(1)+dm(1)==0
                       x(1)+2*x(2)-dp(2)+dm(2)==10
                       8*x(1)+10*x(2)-dp(3)+dm(3)==56];
 
%设置目标函数
obj = [dp(1);dm(2)+dp(2);dm(3)];
 
% 单级目标函数的最优值goal,初始设为足够大的数
% 非常宽松的约束就等于没有约束,确保第一级的正常运算
goal=100000*ones(3,1);
 
%序贯算法(迭代最优)
for i=1:3
    % 重要:更新上一级的最优值,作为该级的约束条件;
    p.Constraints.cons3=[obj<=goal];
    p.Objective = obj(i);
    %求解【 针对优化问题使用solve,会自动选择求解方式】
    [sx,fval] = solve(p);
    %【下面两行可注释】只是展示每一次迭代结果
    fprintf('第%d级目标求解为:\n',i)
    fval, xx=sx.x, sdm=sx.dm, sdp=sx.dp
    %sx类似于python中创建的类【这里指优化类】
    %x(最后得到的优化方案)、dm(负偏差变量)、dp(正偏差变量)为3个sx下的对象
    goal(i) = fval;
end



代码方面可能lingo简单一点,之后学学后补充一下~




最短路径

数学建模_最小生成树_09


数学建模_线性规划_10


数学建模_线性规划_11



最小生成树

Kruskal算法

用minspantree函数求解最小生成树

代码:

s = [1,1,2,2,3,3,4,4,4,5];
t = [2,3,4,5,4,7,5,6,7,6];
weight = [50,60,65,40,52,45,50,30,42,70];
%生成无向图,其中s和t代表着边,weights是权值
G = graph(s,t,weight);
%求出最小生成树,得到的T包含最小生成树的节点和对应边的权值
T = minspantree(G);
%'EdgeLabel',G.Edges.Weight让边显示权值  'MarkerSize',8给结点设置字体大小
%p = plot(G);
p = plot(G,'EdgeLabel',G.Edges.Weight,'MarkerSize',8);
%突出显示绘制的图中的节点和边
highlight(p,T,'EdgeColor','red',"LineWidth",3)


Prim算法

先任选一个点,然后选最小边,然后圈出已选的所有顶点,继续选择最小边,知道选到了所有的顶点,最后生成的最小生成树可能不唯一,但是权值之和相同