数学规划模型
线性规划的一般形式
数学规划的分类#
1、线性规划:如果目标函数f(x)的约束条件均是决策变量的线性表达式、#
2、非线性规划:当目标函数f(x)或者约束条件中有一个是决策变量x的非线性表达式。#
3、整数规划:一类要求变量取整数值的数学规划。线性整数规划#
4、0-1规划:整数变量的取值只能为0和1#
线性规划问题的求解
Matlab 求解线性规划的函数#
1、根据题目给的最值问题进行分析,写出符合题意要求的线性规划模型。
2、将模型转化为MATLAB标准化模型
- 列出决策变量,看总共有多少个决策变量,将每个变量前的系数写出来
- 找不等式约束前的常数项和后面的常数
- 找等式约束前的常数项和后面的常数
- 找出最大值和最小值的临界值
3、将找到的数值代入MATLAB
[x fval] = linprog(c, A, b, Aeq, beq, lb,ub
)
[x fval] = linprog(c, A, b, Aeq, beq, lb,ub, x0)#
c是目标函数的系数向量
A是不等式约束Ax<=b的系数矩阵
b是不等式约束Ax<=b的常数项#
Aeq是等式约束Aeq x=beq的系数矩阵,beq是等式约束Aeq x=beq的常数项#
#
%% Matlab求解线性规划 % [x fval] = linprog(c, A, b, Aeq, beq, lb,ub, x0) % c是目标函数的系数向量,A是不等式约束Ax<=b的系数矩阵,b是不等式约束Ax<=b的常数项 % Aeq是等式约束Aeq x=beq的系数矩阵,beq是等式约束Aeq x=beq的常数项 % lb是X的下限,ub是X的上限,X是向量[x1,x2,...xn]' , 即决策变量。 % 迭代的初始值为x0(一般不用给) % 更多该函数的用法说明请看讲义 %% 例题1 c = [-5 -4 -6]'; % 加单引号表示转置 % c = [-5 -4 -6]; % 写成行向量也是可以的,不过不推荐,我们按照标准型来写看起来比较正规 A = [1 -1 1; 3 2 4; 3 2 0]; b = [20 42 30]'; lb = [0 0 0]'; [x fval] = linprog(c, A, b, [], [], lb) % ub我们直接不写,则意味着没有上界的约束 % x = % 0 % 15.0000 % 3.0000 % % fval = % -78
⭐
最大化问题需要提前改成最小化问题#
%% 例题3 c = [-2 -3 5]'; A = [-2 5 -1; 1 3 1]; b = [-10 12]; Aeq = ones(1,3); beq = 7; lb = zeros(3,1); [x fval] = linprog(c, A, b, Aeq, beq, lb) fval = -fval % 注意这个fval要取负号(原来是求最大值,我们添加负号变成了最小值问题) % x = % 6.4286 % 0.5714 % 0 % fval = % -14.5714 % fval = % 14.5714
典型例题代码#
%% 生产决策问题 format long g %可以将Matlab的计算结果显示为一般的长数字格式(默认会保留四位小数,或使用科学计数法) % (1) 系数向量 c = zeros(9,1); % 初始化目标函数的系数向量全为0 c(1) = 1.25 -0.25 -300/6000*5; % x1前面的系数是c1 c(2) = 1.25 -0.25 -321/10000*7; c(3) = -250 / 4000 * 6; c(4) = -783/7000*4; c(5) = -200/4000 * 7; c(6) = -300/6000*10; c(7) = -321 / 10000 * 9; c(8) = 2-0.35-250/4000*8; c(9) = 2.8-0.5-321/10000*12-783/7000*11; c = -c; % 我们求的是最大值,所以这里需要改变符号 % (2) 不等式约束 A = zeros(5,9); A(1,1) = 5; A(1,6) = 10; A(2,2) = 7; A(2,7) = 9; A(2,9) = 12; A(3,3) = 6; A(3,8) = 8; A(4,4) = 4; A(4,9) = 11; A(5,5) = 7; b = [6000 10000 4000 7000 4000]'; % (3) 等式约束 Aeq = [1 1 -1 -1 -1 0 0 0 0; 0 0 0 0 0 1 1 -1 0]; beq = [0 0]';%加上'代表是列向量 %(4)上下界 lb = zeros(9,1); % 进行求解 [x fval] = linprog(c, A, b, Aeq, beq, lb) fval = -fval % fval = % 1146.56650246305
%投料问题 format long g %可以将Matlab的计算结果显示为一般的长数字格式(默认会保留四位小数,或使用科学计数法) % (1) 系数向量 a=[1.25 8.75 0.5 5.75 3 7.25]; % 工地的横坐标 b=[1.25 0.75 4.75 5 6.5 7.25]; % 工地的纵坐标 x = [5 2]; % 料场的横坐标 y = [1 7]; % 料场的纵坐标 c = []; % 初始化用来保存工地和料场距离的向量 (这个向量就是我们的系数向量) for j =1:2 for i = 1:6 c = [c; sqrt( (a(i)-x(j))^2 + (b(i)-y(j))^2)]; % 每循环一次就在c的末尾插入新的元素 end end % (2) 不等式约束 A =zeros(2,12); A(1,1:6) = 1; A(2,7:12) = 1; b = [20,20]'; % (3) 等式约束 Aeq = zeros(6,12); for i = 1:6 Aeq(i,i) = 1; Aeq(i,i+6) = 1; end % Aeq = [eye(6),eye(6)] % 两个单位矩阵横着拼起来 beq = [3 5 4 7 6 11]'; % 每个工地的日需求量 %(4)上下界 lb = zeros(12,1); % 进行求解 [x fval] = linprog(c, A, b, Aeq, beq, lb) x = reshape(x,6,2) % 将x变为6行2列便于观察(reshape函数是按照列的顺序进行转换的,也就是第一列读完,读第二列,即x1对应x_1,1,x2对应x_2,1)
整数规划
整数规划:在线性规划的基础上 , 加⼊的决策变量需要取整数#
[x,fval] = intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)#
%% 背包问题(货车运送货物的问题) c = -[540 200 180 350 60 150 280 450 320 120]; % 目标函数的系数矩阵(最大化问题记得加负号) intcon=[1:10]; % 整数变量的位置(一共10个决策变量,均为0-1整数变量) A = [6 3 4 5 1 2 3 5 4 2]; b = 30; % 线性不等式约束的系数矩阵和常数项向量(物品的重量不能超过30) Aeq = []; beq =[]; % 不存在线性等式约束 lb = zeros(10,1); % 约束变量的范围下限 ub = ones(10,1); % 约束变量的范围上限 %最后调用intlinprog()函数 [x,fval]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub) fval = -fval
%% 指派问题(选择队员去进行游泳接力比赛) clear;clc c = [66.8 75.6 87 58.6 57.2 66 66.4 53 78 67.8 84.6 59.4 70 74.2 69.6 57.2 67.4 71 83.8 62.4]'; % 目标函数的系数矩阵(先列后行的写法) intcon = [1:20]; % 整数变量的位置(一共20个决策变量,均为0-1整数变量) % 线性不等式约束的系数矩阵和常数项向量(每个人只能入选四种泳姿之一,一共五个约束) A = [1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1]; % A = zeros(5,20); % for i = 1:5 % A(i, (4*i-3): 4*i) = 1; % end b = [1;1;1;1;1]; % 线性等式约束的系数矩阵和常数项向量 (每种泳姿有且仅有一人参加,一共四个约束) Aeq = [1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0; 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0; 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0; 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1]; % Aeq = [eye(4),eye(4),eye(4),eye(4),eye(4)]; % 或者写成 repmat(eye(4),1,5) beq = [1;1;1;1]; lb = zeros(20,1); % 约束变量的范围下限 ub = ones(20,1); % 约束变量的范围上限 %最后调用intlinprog()函数 [x,fval] = intlinprog(c,intcon,A,b,Aeq,beq,lb,ub) % reshape(x,4,5)' % 0 0 0 1 甲自由泳 % 1 0 0 0 乙蝶泳 % 0 1 0 0 丙仰泳 % 0 0 1 0 丁蛙泳 % 0 0 0 0 戊不参加
灵敏度分析
作者:keep--fighting
出处:https://www.cnblogs.com/keep--fighting/p/15225050.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探