目录
[一 优化模型的类型](#一 优化模型的类型)
[二 线性规划1](#二 线性规划1)
[三 0-1规划](#三 0-1规划)
前言
数学建模主要是将问题转化为模型,然后再以编程的形式输出出来
算法都知道,数学建模也需要用到算法,但是不是主要以编程形式展示,而是利用模型和有关于数学建模的公具加以展示,这里主要以问题的形式引出数学建模的知识点和编程知识点
一 优化模型的类型
|---|---------|
| 1 | 线性规划 |
| 2 | 非线性规划 |
| 3 | 正数规划 |
| 4 | "0-1"规划 |
二 线性规划1
问题一:合理利用线材问题
现在要做100套钢架,每套用长为2.9m,2.1m,1.5m的元钢各一根,已知原料长7.4m,问应该如何进行下料使用的原材料更小
首先我们要知道我们这个题目明显是一个取最优解的问题,那么就是一个切割最优问题
其次就要去找题目里面的未知量,找到未知量,才可以构建出模型
模型的确定是根据目标函数和约束条件确定的为什么是线性规划
我们需要确定如何从7.4米长的原料中切割出所需的2.9米、2.1米和1.5米的元钢,以最小化浪费的材料。这个问题可以表示为一个线性规划问题,因为:
目标函数是线性的:我们的目标是最小化使用的原料根数,即 x1+x2+x3+x4+x5+x6,这是一个线性函数。
约束条件是线性的:我们需要满足切割出的元钢总数至少为100根的条件,这些条件可以表示为线性不等式,例如 2.9*x1+2.9*2x2+2.9x5≥100。
变量是非负的:切割的套数 xi 必须是非负整数。
那么我们知道这些未知量了,我们就要构建模型,首先我们来构建一个表格
|-----|-----|-----|-----|-----|-----|
| | 方案1 | 方案2 | 方案3 | 方案4 | 方案5 |
| 2.9 | 1 | 2 | ❌ | 1 | ❌ |
| 2.1 | ❌ | ❌ | 2 | 2 | 1 |
| 1.5 | 3 | 1 | 2 | ❌ | 3 |首先我们有这么多种的方案,每一个方案构建的总值都是小于7.4m的
这里讲讲为什么不考虑使用2.9 2.1 1.5各自取一根不加?
📌 结论
- 单看浪费大小不够,要考虑整体优化。
- 如果一个方案的浪费比其他方案都大,通常不会被选入最优解。
- 有些方案即使浪费稍多,但可能是拼凑 100 套钢架的"必要补充",可以加入。
- 最好的方法是用整数规划(ILP)求解,让计算机自动决定是否要用某个方案。
💡 所以,加不加 6.5m 方案?可以加,但最终让计算机决定! 🚀
因为我们看倒数第二个,这个是已经到7.1了,之前都是7.4,7.3,7.2,这个是7.1所以加入,但是我们到第五种方案的时候已经到达了6.6,跨度很大,这个时候,我们就取这个,首先我们电脑是会自己判断这个方案取不取的,这个时候我们加上是为了避免电脑取最优解要用到,保险,这个时候,其实没有必要加这个方案六,每个都取一根,因为我们已经有一个保险的了
即使你加了也没事,因为这个电脑可能不会选择,不考虑这个方案,我们这个题目是要减少浪费的
那么我们要怎么判断是否要加上方案呢?以下是al分析,作者先记下来,方便下次复习看
📌 原则 1:能否减少浪费?
- 计算当前已有方案的最小浪费 (例如,方案 2 只浪费 0.1m)。
- 如果你的新方案浪费比所有已知方案都多(例如浪费 0.9m),那它几乎不会被选入最优解。
- ✅ 选择浪费更少的方案,❌ 排除浪费更多的方案。
示例对比(假设现有方案最小浪费 0.1m):
方案 切割方式 总长 浪费 方案 2 2.9m ×2 + 1.5m ×1 7.3m 0.1m ✅(最优之一) 方案 3 2.1m ×2 + 1.5m ×2 7.2m 0.2m ✅ 方案 5 2.1m ×1 + 1.5m ×3 6.6m 0.8m ❓(可能需要) 你的方案 2.9m ×1 + 2.1m ×1 + 1.5m ×1 6.5m 0.9m ❌(比 0.8m 更差,不需要) 🔍 如果新方案的浪费比已有方案大,基本就不会被选取
📌 原则 2:能否帮助满足 100 套需求?
即使方案本身浪费稍多,但如果它能让其他方案更好地拼接成 100 套,也可能有用!
如何判断?
- 尝试去掉某个方案,看看是否还能刚好满足 100 套需求。
- 如果去掉某个方案会导致解不可行,说明它是必要的,即使它浪费稍多。
- 如果所有方案能凑够 100 套,而某个方案总是没被选中,那它可以去掉。
💡 结论:如果一个方案不会被用到,或者可以被更优的方案替代,就不取!
📌 实践方法:让 ILP 自动决定
如果你不确定某个方案是否应该加入,可以让整数规划(ILP)自动决定:
- 先把所有可能的方案(包括 6.5m 方案)都放进去。
- 让 ILP 计算最优解,如果某个方案没有被选取,说明它不是最优的。
- 查看最终结果,看看哪些方案真正被使用了。
接下来我们就要把这个模型转换到这歌软件上进行操作
接下来我们就要用到这个LINGO来编写
首先这个sets:和endsets是表示定义一个aa集合,aa集合里面有x这个变量,然后这个1..5就是这个变量的下标
然后这个min就是求解最小值,@sum表示求和,遍历集合aa的里的i,然后紧接着根据这个aa(i)遍历里面的变量
也就是遍历里面aa里面的i,然后这个后面这个是aa集合里面的变量,随着者aa里的i进行改变下面就是一些约束条件了
@gin(x(i))
指定x(i)
必须是整数变量 ,然后for循环就是遍历这里面的变量,这些变量的值不可以是小数,而是整数
最后就输出90根钢铁了
二 非线性规划
线性规划2
问题二 某昼夜服务的公交路线每天个时间区段都需要的工作人员如下表格,设工作人员分别再各个时间区段一开始上班,并连续工作8小时,问该公交至少需要多少工作人员
|----|-------------|------|
| 班次 | 时间 | 需要人数 |
| 1 | 6:00-10:00 | 60 |
| 2 | 10:00-14:00 | 70 |
| 3 | 14:00-18:00 | 60 |
| 4 | 18:00-22:00 | 50 |
| 5 | 22:00-2:00 | 20 |
| 6 | 2:00-6:00 | 30 |接下来我们要分这个题目
首先我们题目问的是总共的工作人员最少,那么就是每个时间段的人我都是不知道那么是多少,删一个题目每一根钢材我都是知道的,我只需要设置出方案数量,然后把这些方案给规划起来求出值
所以我们这里设置的未知量就是每一个时间段的人数,考虑这里面的未知量
这里博主少打了一个就是上面还要确保每一个值都是正数
接下来我们就分析出了模型,接下来我们就可以编程了
三 0-1规划
在一个公司在市东南西三区建立门市部,有7个位置点(Ai,i=1.2.3...7)可供选择,规定:
1)在东区,由A1 A2 A3三个点至多选择两个
2)在西区,由A4 A5两个点至少选择一个
3)在南区,由A6 A7两个点至少选择一个
如果选用Ai点,设备投资估计为bi元,每年获利利润估计为ci元,但是投资总量不可以超过M元,问应该选择哪几个点建立门市部使得年利润最大
首先这个就是典型的0-1问题,每一个点我们都有选择和不选择,1就是选择,0就是不选择
那么我们就要考虑怎么选择就好了
接下来我们就只需要编程就好了
sets: aa/1..7/:b,c,x; endsets data: c = 1,5,7,4,6,8,9; b = 12,56,45,34,32,78,89; M = 200; enddata max = @sum(aa(i):c(i)*x(i)); x(1) + x(2) + x(3) <= 2; x(4) + x(5) >=1; x(6) + x(7) >=1; @sum(aa(i):b(i)*x(i)) <= M; @for(aa(i):@bin(x(i)));
总结
首先我们学习到了线性规划和0-1规划
0-1规划还是很好理解,但是这个线性规划还是有点抽象
首先第一个钢铁问题就是取走最优的部分,你可以看到这个就是把资源浪费最少的放上去,然后最后一个弄一个保险的就好了
第二个就是找出安排时间的问题,我们只需要把相邻的时间段弄出来,然后最后算出最后人数的最小值就好了因为这个是一环扣着一环的
你只需要把问题利用数学模型描述出来,编程就会自动帮你跑出来,也就是C++里面的抽象