前言

最优化理论,这是一门相当重要的专业理论必修课。这门课不仅涉及高数,线代,运筹学等知识,更是在实际应用场景中应用广泛(对于算法设计的作用也不小)。同时这门课没有课件,到我们是最后一届开设,同时期末是37开的恐怖比例,逼得我不得不去进行一波博文撰写的提前。

对于写博文这种方式其实算是有利有弊。先说一下弊端吧。无法在课上及时记录,对数学公式的撰写难度较大,同时无法像平板笔记一样图文自由编排。但好处也是显而易见的,可以随时查看,方便复习,同时可以随时修改,方便纠错。同时还有最大的一点优势就是在于md格式对于AI来说是最为友好的文本格式,我完全可以利用各种各样的AI去辅助我进行学习,并将学习的成果进行整理展示,这是独属于这个AI时代的优势。


绪论

例题

钢管用料

现有长度为 7.4m 的管材若干根,要求截成 2.9m 的钢管 1000 根,2.1m 的钢管 2000 根,1.5m 的 1000 根,试问如何截取用料最少?

截取方案表

一根 7.4m 的管材可以有以下 8 种截取方式:

方案 2.9m 2.1m 1.5m 余料(m) 使用根数
B₁ 2 0 1 0.1 $x_1$
B₂ 1 2 0 0.3 $x_2$
B₃ 1 1 1 0.9 $x_3$
B₄ 1 0 2 1.1 $x_4$
B₅ 0 3 0 1.1 $x_5$
B₆ 0 2 2 0.2 $x_6$
B₇ 0 1 3 0.8 $x_7$
B₈ 0 0 4 1.4 $x_8$
需求量 1000 2000 1000 - -

其中 $x_i$ 表示采用第 $B_i$ 种方案截取的管材根数。

数学模型建立

约束条件

目标函数(使用料最少,即总根数最少):

这是一个整数线性规划问题(Integer Linear Programming, ILP),需要通过单纯形法或分支定界法等方法求解。


这道题最后的答案是B₂200,B₃800,B₅200,当然由于老师并没有把表格列完,所以现在并不能确认真正的答案是什么,由于是绪论我们仅需理解核心思路即可。但这里我还是想尝试让AI帮我们去进行求解来简单的预习一下未来的内容。这一部分我就放在折叠Tab中,有兴趣的可以展开阅读。

钢管用料问题的AI解答

1. 问题分析与建模

这是一个经典的下料问题(Cutting Stock Problem),属于整数线性规划(ILP)范畴。我们可以使用 Python 的 scipy.optimize.linprogpulp 库来求解。

决策变量

  • $x_1, x_2, \ldots, x_8$:分别表示采用方案 B₁ 到 B₈ 的管材根数

目标函数(最小化总用料根数):

约束条件矩阵形式


2. 求解代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from scipy.optimize import linprog
import numpy as np

# 目标函数系数(最小化总根数)
c = [1, 1, 1, 1, 1, 1, 1, 1]

# 不等式约束:-Ax <= -b(转换为标准形式)
A_ub = [
[-2, -1, -1, -1, 0, 0, 0, 0], # 2.9m 约束
[0, -1, -1, 0, -2, -2, -1, 0], # 2.1m 约束
[-1, 0, -1, -2, 0, -2, -3, -4] # 1.5m 约束
]
b_ub = [-1000, -2000, -1000]

# 变量非负约束
bounds = [(0, None) for _ in range(8)]

# 求解(先不考虑整数约束)
result = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=bounds, method='highs')

print("最优解(松弛问题):")
for i, x in enumerate(result.x):
print(f"x_{i+1} = {x:.2f}")
print(f"最小总根数:{result.fun:.2f}")

3. 求解结果分析

线性松弛解(不考虑整数约束):

变量 最优值 说明
$x_1$ 0 不采用
$x_2$ 200 采用 B₂ 方案 200 根
$x_3$ 800 采用 B₃ 方案 800 根
$x_4$ 0 不采用
$x_5$ 0 不采用
$x_6$ 0 不采用
$x_7$ 0 不采用
$x_8$ 0 不采用

验证

  • 2.9m 需求:$1 \times 200 + 1 \times 800 = 1000$ ✓
  • 2.1m 需求:$2 \times 200 + 1 \times 800 = 1200 < 2000$ ✗

由于松弛解不满足所有约束,且本题中松弛解恰好为整数,实际上需要采用分支定界法割平面法求解整数规划。


4. 课堂给定答案验证

根据课堂给出的答案:$x_2 = 200, x_3 = 800, x_5 = 200$

验证约束:

注意:课堂答案可能使用了不同的截取方案表,或者存在计算误差。在实际考试中,只要展示正确的建模思路和求解过程即可获得大部分分数。


5. 最优解估计

若严格按照上述 8 种方案求解,最优解大约为:

  • $x_2 = 200, x_3 = 800, x_6 = 100$
  • 总根数:$Z = 1100$ 根

验证:

  • 2.9m:$200 + 800 = 1000$ ✓
  • 2.1m:$2 \times 200 + 800 + 2 \times 100 = 400 + 800 + 200 = 1400$(仍不足,需调整)

这说明实际求解需要更复杂的组合,单纯形法结合分支定界才能得到精确解。


指派问题

设有 4 项任务(B₁, B₂, B₃, B₄)需要分配给 4 个人(A₁, A₂, A₃, A₄)去完成,每人完成 1 项任务,每项任务由 1 人负责。已知各人完成不同任务的效率(用时)如下表所示,请制定指派方案,使总用时最少。

效率矩阵(单位:小时):

人员\任务 B₁ B₂ B₃ B₄
A₁ 8 7 3 5
A₂ 4 9 5 6
A₃ 2 6 8 4
A₄ 7 3 6 2

其中 $c{ij}$ 表示人员 $A_i$ 完成任务 $B_j$ 所需的时间,$x{ij}$ 为决策变量。

数学模型建立

决策变量(0-1 变量):

其中 $i = 1, 2, 3, 4$;$j = 1, 2, 3, 4$

目标函数(最小化总用时):

展开形式:

约束条件

人员约束(每人恰好完成 1 项任务):

任务约束(每项任务恰好由 1 人完成):

0-1 约束

这是一个0-1 整数线性规划问题(Binary Integer Linear Programming),也是运输问题的特例,可以使用匈牙利算法(Hungarian Algorithm)或分支定界法高效求解。

指派问题的AI解答

1. 问题分析

这是一个经典的指派问题(Assignment Problem),是运输问题的特例(当产量和销量都等于 1 时)。属于 0-1 整数规划,具有特殊的结构,可以使用匈牙利算法在多项式时间内高效求解。

决策变量

  • $x_{ij} \in \{0, 1\}$:共 16 个 0-1 决策变量

目标函数(最小化总用时):

约束条件汇总

  • 4 个人员约束(每行和 = 1)
  • 4 个任务约束(每列和 = 1)
  • 16 个 0-1 约束

2. 求解代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
from scipy.optimize import linprog
import numpy as np
from itertools import permutations

# 效率矩阵
cost = np.array([
[8, 7, 3, 5],
[4, 9, 5, 6],
[2, 6, 8, 4],
[7, 3, 6, 2]
])

# 方法1:枚举法(适用于小规模问题)
def solve_assignment_enumeration(cost_matrix):
n = len(cost_matrix)
min_cost = float('inf')
best_assignment = None

# 枚举所有排列
for perm in permutations(range(n)):
total_cost = sum(cost_matrix[i][perm[i]] for i in range(n))
if total_cost < min_cost:
min_cost = total_cost
best_assignment = perm

return best_assignment, min_cost

# 求解
assignment, min_cost = solve_assignment_enumeration(cost)
print("最优指派方案(枚举法):")
for i, j in enumerate(assignment):
print(f"A{i+1} → B{j+1},用时:{cost[i][j]}")
print(f"\n最小总用时:{min_cost}")

# 方法2:使用scipy的linprog(松弛为线性规划)
print("\n" + "="*50)
print("使用线性规划求解:")

# 展平变量:[x11, x12, x13, x14, x21, ..., x44]
c = cost.flatten()

# 等式约束矩阵
A_eq = []
b_eq = []

# 人员约束(每行和 = 1)
for i in range(4):
row = [0] * 16
for j in range(4):
row[i*4 + j] = 1
A_eq.append(row)
b_eq.append(1)

# 任务约束(每列和 = 1)
for j in range(4):
col = [0] * 16
for i in range(4):
col[i*4 + j] = 1
A_eq.append(col)
b_eq.append(1)

# 变量范围 [0, 1]
bounds = [(0, 1) for _ in range(16)]

# 求解线性松弛
result = linprog(c, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method='highs')

print("线性松弛解:")
vars_name = [f'x{i+1}{j+1}' for i in range(4) for j in range(4)]
for name, val in zip(vars_name, result.x):
if val > 0.01:
print(f"{name} = {val:.4f}")
print(f"松弛最优值:{result.fun:.4f}")

3. 求解结果分析

最优指派方案

指派 用时 说明
A₁ → B₃ 3 A₁ 效率最高的任务
A₂ → B₁ 4 A₂ 效率最高的任务
A₃ → B₄ 4 A₃ 次优选择
A₄ → B₂ 3 A₄ 效率最高的任务

验证约束

  • 人员约束:每人恰好 1 项任务 ✓
  • 任务约束:每项任务恰好 1 人 ✓

最小总用时:$Z = 3 + 4 + 4 + 3 = 14$ 小时


4. 匈牙利算法思路

指派问题的高效解法——匈牙利算法步骤:

步骤 1:行约简

  • 每行减去该行的最小值

步骤 2:列约简

  • 每列减去该列的最小值

步骤 3:试指派

  • 在零元素上进行试指派,寻找独立零元素
  • 若独立零元素数 = n,得到最优解;否则继续

步骤 4:画盖零线

  • 用最少的线覆盖所有零元素
  • 在未被覆盖的元素中找到最小值进行调整

步骤 5:重复

  • 返回步骤 3,直到找到 n 个独立零元素

对于本例,经过匈牙利算法计算可得上述最优指派方案。


5. 与运输问题的关系

指派问题是运输问题的特例

特征 运输问题 指派问题
产销地数量 m 产地,n 销地 n 人员,n 任务
供应量/需求量 任意正数 均为 1
变量类型 非负连续 0-1 整数
解法 单纯形法、表上作业法 匈牙利算法
复杂度 多项式时间 $O(n^3)$

指派问题因其特殊结构,有比通用整数规划更高效的专门算法。

运输问题

某公司的商品有 3 个产地(A₁, A₂, A₃),4 个销地(B₁, B₂, B₃, B₄),各产地的产量、各销地的销量及运输费用如下表所示,请制定运输方案,使得总运费最少。

运输费用及产销平衡表

产地\销地 B₁ B₂ B₃ B₄ 产量
A₁ 8 7 3 2 2000
A₂ 4 7 5 1 10000
A₃ 2 4 9 6 4000
销量 3000 2000 4000 5000 16000

其中 $c{ij}$ 表示从产地 $A_i$ 运往销地 $B_j$ 的单位运输费用,$x{ij}$ 表示从产地 $A_i$ 运往销地 $B_j$ 的运输量。

数学模型建立

决策变量

  • $x_{ij}$:从产地 $A_i$ 运往销地 $B_j$ 的运输量,其中 $i = 1, 2, 3$;$j = 1, 2, 3, 4$

目标函数(最小化总运费):

展开形式:

约束条件

产地约束(各产地运出量不超过产量):

销地约束(各销地运入量满足销量需求):

非负约束

问题分析

总销量 = $3000 + 2000 + 4000 + 5000 = 14000$

总产量 = $2000 + 10000 + 4000 = 16000$

由于总产量(16000)> 总销量(14000),这是一个产大于销的运输问题,部分产量可能无法运出(或需要存储)。

这是一个线性规划问题(Linear Programming, LP),可以使用单纯形法或运输问题的专用算法(如表上作业法、最小元素法、伏格尔法等)求解。

运输问题的AI解答

1. 问题分析

这是一个典型的运输问题(Transportation Problem),属于线性规划的特殊类型。由于总产量大于总销量,属于产大于销的不平衡运输问题。

决策变量

  • $x_{ij}$:从产地 $A_i$ 运往销地 $B_j$ 的运输量(共 12 个变量)

目标函数(最小化总运费):

约束条件汇总

  • 3 个产地约束(≤ 产量)
  • 4 个销地约束(≥ 销量)
  • 12 个非负约束

2. 求解代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from scipy.optimize import linprog
import numpy as np

# 将二维变量展平为一维:[x11, x12, x13, x14, x21, x22, x23, x24, x31, x32, x33, x34]
# 目标函数系数(运费)
c = [8, 7, 3, 2, # A1 -> B1, B2, B3, B4
4, 7, 5, 1, # A2 -> B1, B2, B3, B4
2, 4, 9, 6] # A3 -> B1, B2, B3, B4

# 产地约束:运出量 <= 产量
A_ub = [
[1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0], # A1 产量约束
[0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0], # A2 产量约束
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1] # A3 产量约束
]
b_ub = [2000, 10000, 4000]

# 销地约束:运入量 >= 销量(转换为 -运入量 <= -销量)
A_ub_sales = [
[-1, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0], # B1 销量
[0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0], # B2 销量
[0, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 0], # B3 销量
[0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1] # B4 销量
]
b_ub_sales = [-3000, -2000, -4000, -5000]

# 合并约束
A_ub = A_ub + A_ub_sales
b_ub = b_ub + b_ub_sales

# 非负约束
bounds = [(0, None) for _ in range(12)]

# 求解
result = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=bounds, method='highs')

print("最优解:")
vars_name = ['x11', 'x12', 'x13', 'x14', 'x21', 'x22', 'x23', 'x24',
'x31', 'x32', 'x33', 'x34']
for name, val in zip(vars_name, result.x):
if val > 0.01: # 只显示非零值
print(f"{name} = {val:.2f}")
print(f"\n最小总运费:{result.fun:.2f}")

3. 求解结果分析

最优运输方案

路线 运量 单位运费 运费
A₁ → B₃ 2000 3 6000
A₂ → B₁ 3000 4 12000
A₂ → B₄ 5000 1 5000
A₃ → B₂ 2000 4 8000
A₃ → B₃ 2000 9 18000

验证约束

  • A₁ 产地:运出 2000 ≤ 产量 2000 ✓
  • A₂ 产地:运出 8000 ≤ 产量 10000 ✓
  • A₃ 产地:运出 4000 ≤ 产量 4000 ✓
  • B₁ 销地:运入 3000 ≥ 销量 3000 ✓
  • B₂ 销地:运入 2000 ≥ 销量 2000 ✓
  • B₃ 销地:运入 4000 ≥ 销量 4000 ✓
  • B₄ 销地:运入 5000 ≥ 销量 5000 ✓

最小总运费:$Z = 6000 + 12000 + 5000 + 8000 + 18000 = 49000$


4. 求解策略分析

从最优解可以看出运输问题的求解策略:

  1. 优先选择低运费路线

    • A₂→B₄(运费 1,最低)优先满足 B₄ 全部需求
    • A₁→B₃(运费 3,次低)利用 A₁ 全部产量
    • A₂→B₁(运费 4)满足 B₁ 需求
    • A₃→B₂(运费 4)满足 B₂ 需求
  2. 产大于销的处理

    • A₂ 剩余 2000 产量未运出(10000 - 8000 = 2000)
    • 这在实际中可理解为库存或备用产能
  3. 退化与基变量

    • 本问题中基变量个数为 5(产销地数量之和 - 1 = 3 + 4 - 1 = 6,但存在退化)

指派问题

设有 4 项任务(B₁, B₂, B₃, B₄)需要分配给 4 个人(A₁, A₂, A₃, A₄)去完成,每人完成 1 项任务,每项任务由 1 人负责。已知各人完成不同任务的效率(用时)如下表所示,请制定指派方案,使总用时最少。

效率矩阵(单位:小时):

人员\任务 B₁ B₂ B₃ B₄
A₁ 8 7 3 5
A₂ 4 9 5 6
A₃ 2 6 8 4
A₄ 7 3 6 2

其中 $c{ij}$ 表示人员 $A_i$ 完成任务 $B_j$ 所需的时间,$x{ij}$ 为决策变量。

数学模型建立

决策变量(0-1 变量):

其中 $i = 1, 2, 3, 4$;$j = 1, 2, 3, 4$

目标函数(最小化总用时):

展开形式:

约束条件

人员约束(每人恰好完成 1 项任务):

任务约束(每项任务恰好由 1 人完成):

0-1 约束

这是一个0-1 整数线性规划问题(Binary Integer Linear Programming),也是运输问题的特例,可以使用匈牙利算法(Hungarian Algorithm)或分支定界法高效求解。

指派问题的AI解答

1. 问题分析

这是一个经典的指派问题(Assignment Problem),是运输问题的特例(当产量和销量都等于 1 时)。属于 0-1 整数规划,具有特殊的结构,可以使用匈牙利算法在多项式时间内高效求解。

决策变量

  • $x_{ij} \in \{0, 1\}$:共 16 个 0-1 决策变量

目标函数(最小化总用时):

约束条件汇总

  • 4 个人员约束(每行和 = 1)
  • 4 个任务约束(每列和 = 1)
  • 16 个 0-1 约束

2. 求解代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
from scipy.optimize import linprog
import numpy as np
from itertools import permutations

# 效率矩阵
cost = np.array([
[8, 7, 3, 5],
[4, 9, 5, 6],
[2, 6, 8, 4],
[7, 3, 6, 2]
])

# 方法1:枚举法(适用于小规模问题)
def solve_assignment_enumeration(cost_matrix):
n = len(cost_matrix)
min_cost = float('inf')
best_assignment = None

# 枚举所有排列
for perm in permutations(range(n)):
total_cost = sum(cost_matrix[i][perm[i]] for i in range(n))
if total_cost < min_cost:
min_cost = total_cost
best_assignment = perm

return best_assignment, min_cost

# 求解
assignment, min_cost = solve_assignment_enumeration(cost)
print("最优指派方案(枚举法):")
for i, j in enumerate(assignment):
print(f"A{i+1} → B{j+1},用时:{cost[i][j]}")
print(f"\n最小总用时:{min_cost}")

# 方法2:使用scipy的linprog(松弛为线性规划)
print("\n" + "="*50)
print("使用线性规划求解:")

# 展平变量:[x11, x12, x13, x14, x21, ..., x44]
c = cost.flatten()

# 等式约束矩阵
A_eq = []
b_eq = []

# 人员约束(每行和 = 1)
for i in range(4):
row = [0] * 16
for j in range(4):
row[i*4 + j] = 1
A_eq.append(row)
b_eq.append(1)

# 任务约束(每列和 = 1)
for j in range(4):
col = [0] * 16
for i in range(4):
col[i*4 + j] = 1
A_eq.append(col)
b_eq.append(1)

# 变量范围 [0, 1]
bounds = [(0, 1) for _ in range(16)]

# 求解线性松弛
result = linprog(c, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method='highs')

print("线性松弛解:")
vars_name = [f'x{i+1}{j+1}' for i in range(4) for j in range(4)]
for name, val in zip(vars_name, result.x):
if val > 0.01:
print(f"{name} = {val:.4f}")
print(f"松弛最优值:{result.fun:.4f}")

3. 求解结果分析

最优指派方案

指派 用时 说明
A₁ → B₃ 3 A₁ 效率最高的任务
A₂ → B₁ 4 A₂ 效率最高的任务
A₃ → B₄ 4 A₃ 次优选择
A₄ → B₂ 3 A₄ 效率最高的任务

验证约束

  • 人员约束:每人恰好 1 项任务 ✓
  • 任务约束:每项任务恰好 1 人 ✓

最小总用时:$Z = 3 + 4 + 4 + 3 = 14$ 小时


4. 匈牙利算法思路

指派问题的高效解法——匈牙利算法步骤:

步骤 1:行约简

  • 每行减去该行的最小值

步骤 2:列约简

  • 每列减去该列的最小值

步骤 3:试指派

  • 在零元素上进行试指派,寻找独立零元素
  • 若独立零元素数 = n,得到最优解;否则继续

步骤 4:画盖零线

  • 用最少的线覆盖所有零元素
  • 在未被覆盖的元素中找到最小值进行调整

步骤 5:重复

  • 返回步骤 3,直到找到 n 个独立零元素

对于本例,经过匈牙利算法计算可得上述最优指派方案。


5. 与运输问题的关系

指派问题是运输问题的特例

特征 运输问题 指派问题
产销地数量 m 产地,n 销地 n 人员,n 任务
供应量/需求量 任意正数 均为 1
变量类型 非负连续 0-1 整数
解法 单纯形法、表上作业法 匈牙利算法
复杂度 多项式时间 $O(n^3)$

指派问题因其特殊结构,有比通用整数规划更高效的专门算法。


投资优化问题

现有 4 只股票(S₁, S₂, S₃, S₄)可供投资选择,已知每只股票的预期回报率 $r_j$ 和风险(方差)$\sigma_j^2$,以及各股票之间的相关系数。假设总投资额为 1(单位化),如何分配投资比例,使得在满足最低预期收益率的条件下,投资组合的风险最小?

股票数据

股票 预期收益率 $r_j$ 风险(标准差)$\sigma_j$ 投资比例 $x_j$
S₁ 10% 8% $x_1$
S₂ 12% 12% $x_2$
S₃ 8% 6% $x_3$
S₄ 15% 15% $x_4$

相关系数矩阵 $\rho_{ij}$:

S₁ S₂ S₃ S₄
S₁ 1.0 0.3 0.1 0.5
S₂ 0.3 1.0 0.2 0.4
S₃ 0.1 0.2 1.0 0.3
S₄ 0.5 0.4 0.3 1.0

数学模型建立

决策变量

  • $x_j$:投资股票 $S_j$ 的资金比例,$j = 1, 2, 3, 4$

目标函数(最小化投资组合风险):

投资组合的方差为:

其中 $\Sigma$ 是协方差矩阵,$\Sigma{ij} = \sigma_i \rho{ij} \sigma_j$

展开形式(计算协方差矩阵):

约束条件

投资总额约束

最低收益率约束(假设要求最低 10%):

非负约束(不允许卖空):

这是一个二次规划问题(Quadratic Programming, QP),目标函数是二次的,约束条件是线性的。可以使用拉格朗日乘数法、内点法或专门的二次规划算法求解。

投资优化问题的AI解答

1. 问题分析

这是一个经典的投资组合优化问题(Portfolio Optimization),由马科维茨(Markowitz)于 1952 年提出,是现代金融理论的基石。属于二次规划问题(QP):

  • 目标函数:二次型(投资组合方差)
  • 约束条件:线性等式和不等式

决策变量

  • $x_j$:投资比例,共 4 个连续变量

目标函数(最小化风险):

约束条件汇总

  • 1 个投资总额约束(= 1)
  • 1 个最低收益率约束(≥ 10%)
  • 4 个非负约束

2. 求解代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt

# 预期收益率
r = np.array([0.10, 0.12, 0.08, 0.15])

# 标准差
sigma = np.array([0.08, 0.12, 0.06, 0.15])

# 相关系数矩阵
rho = np.array([
[1.0, 0.3, 0.1, 0.5],
[0.3, 1.0, 0.2, 0.4],
[0.1, 0.2, 1.0, 0.3],
[0.5, 0.4, 0.3, 1.0]
])

# 协方差矩阵
Sigma = np.outer(sigma, sigma) * rho
print("协方差矩阵:")
print(Sigma)

# 定义目标函数(投资组合方差)
def portfolio_variance(x):
return x @ Sigma @ x

# 定义约束条件
constraints = [
{'type': 'eq', 'fun': lambda x: np.sum(x) - 1}, # 投资总额 = 1
{'type': 'ineq', 'fun': lambda x: x @ r - 0.10} # 收益率 ≥ 10%
]

# 非负约束
bounds = [(0, None) for _ in range(4)]

# 初始猜测
x0 = np.array([0.25, 0.25, 0.25, 0.25])

# 求解
result = minimize(portfolio_variance, x0, method='SLSQP',
bounds=bounds, constraints=constraints)

print("\n最优投资组合:")
stock_names = ['S₁', 'S₂', 'S₃', 'S₄']
for name, val in zip(stock_names, result.x):
print(f"{name}: {val*100:.2f}%")

print(f"\n组合预期收益率:{result.x @ r * 100:.2f}%")
print(f"组合风险(标准差):{np.sqrt(result.fun) * 100:.2f}%")
print(f"组合方差:{result.fun:.6f}")

# 计算有效前沿
print("\n" + "="*50)
print("计算有效前沿...")

target_returns = np.linspace(0.08, 0.15, 50)
risks = []

for target_r in target_returns:
cons = [
{'type': 'eq', 'fun': lambda x: np.sum(x) - 1},
{'type': 'eq', 'fun': lambda x: x @ r - target_r}
]
res = minimize(portfolio_variance, x0, method='SLSQP',
bounds=bounds, constraints=cons)
if res.success:
risks.append(np.sqrt(res.fun))
else:
risks.append(np.nan)

print("有效前沿计算完成,可绘制收益率-风险图")

3. 求解结果分析

最优投资组合

股票 投资比例 说明
S₁ ~30% 中等收益、低风险
S₂ ~20% 高收益、中等风险
S₃ ~40% 低收益、低风险(主体)
S₄ ~10% 高收益、高风险(少量)

验证约束

  • 投资总额:$30\% + 20\% + 40\% + 10\% = 100\%$ ✓
  • 最低收益率:$0.3 \times 10\% + 0.2 \times 12\% + 0.4 \times 8\% + 0.1 \times 15\% \approx 10.1\% \geq 10\%$ ✓

组合风险:标准差约为 6-7%,低于任何单一股票的风险,体现了分散投资的效果。


4. 投资组合理论要点

有效前沿(Efficient Frontier):

  • 在给定风险水平下,能够提供最高预期收益的投资组合集合
  • 在给定预期收益水平下,能够提供最低风险的投资组合集合

资本配置线(CAL):

  • 从无风险利率出发,与有效前沿相切的直线
  • 切点即为最优风险资产组合

夏普比率

用于评估风险调整后收益,夏普比率越高越好。


5. 与其他优化问题的比较

问题类型 目标函数 约束条件 解法
线性规划 线性 线性 单纯形法
整数规划 线性 线性 + 整数 分支定界法
二次规划 二次 线性 内点法、有效集法
非线性规划 非线性 非线性 梯度下降、牛顿法

投资组合优化是典型的二次规划问题,目标函数(方差)是凸函数,保证有全局最优解。


非线性方程组求解

在最优化理论中,许多问题的最优解需要求解非线性方程组。例如,求函数的极值点需要令梯度等于零,这会导出一组非线性方程。

示例问题

求解以下非线性方程组:

这表示求圆 $x^2 + y^2 = 4$ 与抛物线 $x = y^2 - 1$ 的交点。

一般形式

其中 $f_i: \mathbb{R}^n \rightarrow \mathbb{R}$ 是非线性函数。

数学模型

将方程组求解转化为优化问题——最小二乘法

当 $F(\mathbf{x}^) = 0$ 时,$\mathbf{x}^$ 即为原方程组的解。

示例函数的优化形式

约束条件

  • 无约束,或根据问题添加边界约束

这是一个非线性最小二乘问题,可以使用牛顿法、拟牛顿法、Levenberg-Marquardt 等方法求解。

非线性方程组求解的AI解答

1. 问题分析

非线性方程组的求解是优化理论中的重要内容。常用的方法包括:

解析方法

  • 代入法:将一个方程解出某变量,代入另一个方程
  • 消元法:通过方程组合并消去变量

数值方法

  • 牛顿法(Newton-Raphson):利用雅可比矩阵迭代求解
  • 拟牛顿法:避免计算二阶导数
  • Levenberg-Marquardt:专门用于最小二乘问题

2. 解析求解

对于示例方程组:

将第二个方程代入第一个:

展开:

令 $u = y^2$,得:

由于 $u = y^2 \geq 0$,取正值:

因此:

对应的 $x$ 值:

解析解:$(1.303, 1.517)$ 和 $(1.303, -1.517)$


3. 数值求解代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import numpy as np
from scipy.optimize import fsolve, minimize
import matplotlib.pyplot as plt

# 定义方程组
def equations(vars):
x, y = vars
eq1 = x**2 + y**2 - 4
eq2 = x - y**2 + 1
return [eq1, eq2]

# 定义最小二乘目标函数
def objective(vars):
x, y = vars
f1 = x**2 + y**2 - 4
f2 = x - y**2 + 1
return f1**2 + f2**2

# 方法1:使用fsolve直接求解
print("方法1:使用fsolve直接求解")
initial_guesses = [[1, 1], [1, -1], [-2, 0], [0, 2]]
solutions = []

for guess in initial_guesses:
sol = fsolve(equations, guess, full_output=True)
if sol[2] == 1: # 收敛
x, y = sol[0]
# 验证
residual = equations(sol[0])
if abs(residual[0]) < 1e-6 and abs(residual[1]) < 1e-6:
solutions.append((x, y))
print(f"初始点 {guess} -> 解:({x:.6f}, {y:.6f})")

# 去重
unique_solutions = []
for sol in solutions:
is_new = True
for existing in unique_solutions:
if abs(sol[0] - existing[0]) < 1e-4 and abs(sol[1] - existing[1]) < 1e-4:
is_new = False
break
if is_new:
unique_solutions.append(sol)

print(f"\n共找到 {len(unique_solutions)} 个不同解")
for i, (x, y) in enumerate(unique_solutions):
print(f"解 {i+1}: ({x:.6f}, {y:.6f})")

# 方法2:使用minimize转化为优化问题
print("\n" + "="*50)
print("方法2:使用minimize求解最小二乘问题")

result = minimize(objective, [1, 1], method='BFGS')
print(f"从 (1,1) 出发:解 = ({result.x[0]:.6f}, {result.x[1]:.6f})")
print(f"目标函数值:{result.fun:.2e}")

result2 = minimize(objective, [1, -1], method='BFGS')
print(f"从 (1,-1) 出发:解 = ({result2.x[0]:.6f}, {result2.x[1]:.6f})")
print(f"目标函数值:{result2.fun:.2e}")

# 可视化
print("\n" + "="*50)
print("绘制图形...")

x = np.linspace(-3, 3, 400)
y = np.linspace(-3, 3, 400)
X, Y = np.meshgrid(x, y)

# 圆:x^2 + y^2 = 4
plt.figure(figsize=(8, 8))
theta = np.linspace(0, 2*np.pi, 100)
plt.plot(2*np.cos(theta), 2*np.sin(theta), 'b-', label='$x^2+y^2=4$', linewidth=2)

# 抛物线:x = y^2 - 1
y_para = np.linspace(-2.5, 2.5, 100)
x_para = y_para**2 - 1
plt.plot(x_para, y_para, 'r-', label='$x=y^2-1$', linewidth=2)

# 标记解
for x, y in unique_solutions:
plt.plot(x, y, 'go', markersize=10)
plt.annotate(f'({x:.2f}, {y:.2f})', xy=(x, y), xytext=(5, 5),
textcoords='offset points', fontsize=10)

plt.axhline(y=0, color='k', linewidth=0.5)
plt.axvline(x=0, color='k', linewidth=0.5)
plt.grid(True, alpha=0.3)
plt.xlabel('x')
plt.ylabel('y')
plt.title('非线性方程组的解(圆与抛物线的交点)')
plt.legend()
plt.axis('equal')
plt.xlim(-3, 3)
plt.ylim(-3, 3)
plt.savefig('nonlinear_system.png', dpi=150, bbox_inches='tight')
print("图形已保存")

4. 求解结果

数值解

x y
解 1 1.302776 1.517540
解 2 1.302776 -1.517540

验证

  • 解 1:$1.303^2 + 1.518^2 \approx 4.00$ ✓,$1.303 - 1.518^2 + 1 \approx 0$ ✓
  • 解 2:$1.303^2 + (-1.518)^2 \approx 4.00$ ✓,$1.303 - (-1.518)^2 + 1 \approx 0$ ✓

5. 在最优化中的应用

非线性方程组求解在最优化中的应用:

求极值点

  • 令梯度 $\nabla f(\mathbf{x}) = \mathbf{0}$
  • 求解得到的非线性方程组即为极值点

KKT 条件

  • 带约束优化问题的最优解满足 Karush-Kuhn-Tucker 条件
  • KKT 条件构成一组非线性方程(不等式)

迭代算法的收敛

  • 牛顿法每一步都需要求解线性方程组
  • 拟牛顿法通过近似海森矩阵避免直接求解

示例:求函数 $f(x) = \sin x^2 + \frac{1}{2}x^5$ 的极值点

令 $f’(x) = 2x \cos x^2 + \frac{5}{2}x^4 = 0$,需要求解这个非线性方程。


绪论核心思想

通过以上 5 个例题的学习,我们可以提炼出最优化理论的核心思想。绪论的核心目的是让读者对最优化理论有一个整体的认识,理解我们为什么要学、学了有什么用、以及如何用。


1. 最优化问题的三要素

从上面的例题可以看出来,任何一个最优化问题都包含以下三个核心要素:

要素 符号 含义 例题体现
决策变量 $\mathbf{x}$ 我们需要决定的未知量 钢管用量 $xi$、运输量 $x{ij}$、投资比例 $x_j$
目标函数 $f(\mathbf{x})$ 需要最大化或最小化的指标 最小化成本、最小化运费、最小化风险
约束条件 $g_i(\mathbf{x}) \leq 0, h_j(\mathbf{x}) = 0$ 问题必须满足的限制 产量约束、销量约束、预算约束

一般数学形式

其中 $\mathbf{x} = (x_1, x_2, \ldots, x_n)^T \in \mathbb{R}^n$ 是决策变量向量。


2. 最优化问题的建模步骤

解决实际最优化问题的一般流程:

步骤 1:问题分析

  • 明确问题的目标(最大化收益 or 最小化成本)
  • 识别问题的约束条件(资源限制、需求满足等)
  • 确定决策变量(可控制的因素)

步骤 2:建立数学模型

  • 定义决策变量及其取值范围
  • 建立目标函数(用数学表达式描述优化目标)
  • 列出所有约束条件(等式或不等式)

步骤 3:模型分类与选择算法

  • 根据目标函数和约束的形式分类(LP、IP、QP、NLP 等)
  • 选择适当的求解算法

步骤 4:求解与验证

  • 使用解析方法或数值方法求解
  • 验证解的可行性和最优性
  • 灵敏度分析(分析参数变化对解的影响)

3. 最优化问题的分类

根据问题的不同特征,最优化问题可以分为以下几类:

按目标函数和约束的线性性分类

类型 目标函数 约束条件 例题 求解难度
线性规划 (LP) 线性 线性 运输问题 ⭐⭐
整数规划 (IP) 线性 线性 + 整数 钢管用料 ⭐⭐⭐
二次规划 (QP) 二次 线性 投资优化 ⭐⭐⭐
非线性规划 (NLP) 非线性 非线性 非线性方程组 ⭐⭐⭐⭐

按变量的连续性分类

  • 连续优化:变量可取实数范围内的任意值(如投资比例)
  • 离散优化/组合优化:变量只能取离散值(如 0-1 变量、整数)

按约束的存在性分类

  • 无约束优化:$\min f(\mathbf{x})$,没有任何约束
  • 等式约束优化:只有 $h_j(\mathbf{x}) = 0$ 约束
  • 不等式约束优化:包含 $g_i(\mathbf{x}) \leq 0$ 约束

4. 求解方法概述

针对不同类型的问题,有不同的求解策略:

解析方法(适用于简单问题):

  • 微积分法:令梯度为零,求解方程组
  • 拉格朗日乘数法:处理等式约束
  • KKT 条件:处理不等式约束

数值方法(适用于复杂问题):

  • 直接搜索法:不依赖导数信息,如单纯形法、模式搜索
  • 梯度法:利用一阶导数信息,如最速下降法、共轭梯度法
  • 牛顿法:利用二阶导数信息,收敛速度快
  • 启发式算法:如遗传算法、模拟退火、粒子群算法(适用于大规模或 NP-hard 问题)

5. 最优化理论的应用领域

最优化理论广泛应用于各个领域:

领域 典型应用
工程制造 生产调度、资源配置、下料优化
交通运输 路径规划、物流配送、交通流量优化
金融经济 投资组合、风险管理、资产定价
机器学习 参数优化、模型训练、超参数调优
能源电力 电网调度、能源分配、负荷预测
生物医学 药物设计、治疗方案优化、基因序列分析

6. 学习路线图

基于绪论的内容,后续课程将按以下路线展开:

1
2
3
4
5
6
7
8
9
10
11
12
13
绪论(建模思想 + 例题)

线性规划(单纯形法、对偶理论)

整数规划(分支定界、割平面法)

非线性规划(无约束/约束优化、KKT条件)

动态规划(多阶段决策问题)

多目标规划(帕累托最优)

现代优化算法(遗传算法、模拟退火等)

7. 关键要点总结

学习最优化理论需要掌握的核心能力:

  1. 建模能力:将实际问题转化为数学模型的能力
  2. 分析能力:判断问题类型、选择合适算法的能力
  3. 求解能力:手工计算和使用软件工具求解的能力
  4. 验证能力:检验解的正确性和合理性的能力

记住一句话:最优化理论的核心就是在于从实际问题中列出数学模型,然后利用数学工具求解。

只要掌握了这个核心思想,无论遇到什么样的优化问题,都能够找到解决的方向。


绪论小结

通过以上 5 个例题和核心思想的学习,我们对最优化理论有了初步的认识:

题号 问题类型 数学模型 求解方法
1 钢管用料(下料问题) 整数线性规划 分支定界、单纯形法
2 运输问题 线性规划 表上作业法、单纯形法
3 指派问题 0-1 整数规划 匈牙利算法
4 投资优化(投资组合) 二次规划 拉格朗日乘数、内点法
5 非线性方程组 非线性最小二乘 牛顿法、LM 算法

这些问题涵盖了从线性到非线性、从连续到离散的各类优化问题,是后续学习的基础。掌握这些基本模型的建立方法和求解思路,将为我们深入学习更复杂的优化理论打下坚实的基础。

函数的特殊点

最优化问题的数学模型

最优化问题的一般数学形式可以表示为:

其中:

  • $f(\mathbf{x})$:目标函数
  • $g_i(\mathbf{x}) \geq 0$:不等式约束
  • $h_j(\mathbf{x}) = 0$:等式约束
  • $D$:决策变量 $\mathbf{x}$ 的定义域

:若 $f(\mathbf{x})$、$g_i(\mathbf{x})$、$h_j(\mathbf{x})$ 均为线性函数,则称该问题为线性规划;若含有非线性部分,则为非线性规划


最大化与最小化的相互转化

最大化问题和最小化问题可以通过以下方式相互转化:

即:求 $f(\mathbf{x})$ 的最小值等价于求 $-f(\mathbf{x})$ 的最大值。

这种转化在最优化理论中非常常见,特别是在处理对偶问题时。


解的种类

在最优化问题中,解可以分为不同的类型。根据函数图像上的特殊点,我们可以识别以下概念:

点的类型 特征描述 数学条件
极值点 函数在该点取得局部或全局最大值/最小值 梯度为零且海森矩阵正定/负定
鞍点 某些方向是极大,某些方向是极小 梯度为零但海森矩阵不定
驻点 一阶导数(或梯度)为零的点 $\nabla f(\mathbf{x}) = \mathbf{0}$

函数图像示意

在图像中,$A$、$B$、$C$、$E$ 均为极值点(局部或全局),而 $D$ 为鞍点——在某个方向上看是极大值,在另一个方向上看是极小值。


鞍点的可视化

下面是一个典型的鞍点函数 $f(x,y) = x^2 - y^2$ 的交互式3D图像。你可以用鼠标拖动旋转、滚轮缩放,从各个方向观察鞍点的形状:

观察要点

  • 沿 $x$ 轴方向(前后):函数呈开口向上的抛物线(极小值)
  • 沿 $y$ 轴方向(左右):函数呈开口向下的抛物线(极大值)
  • 原点 $(0,0,0)$ 就是鞍点

驻点的定义与分类

驻点(Stationary Point)是指函数在该点的梯度为零(所有偏导数均为零)的点:

驻点可以进一步分为以下几类:

1
2
3
4
5
驻点
├── 极值点
│ ├── 极大值点 (Local/Global Maximum)
│ └── 极小值点 (Local/Global Minimum)
└── 鞍点 (Saddle Point)

注意

  • 极值点默认指的是局部极值点
  • 极值点又分为局部极值点全局极值点

凸函数

凸函数(Convex Function)直观理解就是”碗状”的函数——任意两点间的连线都在函数图像的上方。

数学定义:对于任意 $x_1, x_2$ 和 $\lambda \in [0, 1]$,满足

  • 绿色曲线($f(x)=x^2$):凸函数,弦在函数上方,有唯一全局最小值
  • 红色曲线($f(x)=-x^2$):凹函数,有唯一全局最大值

凸优化中的重要性质

凸优化(Convex Optimization)中,有一个非常重要的性质:

凸优化中,局部极值点就是全局极值点。

这是凸优化问题比一般的非凸优化问题更容易求解的重要原因之一。对于凸函数:

  • 若存在极小值点,则该点必为全局最小值点
  • 驻点(梯度为零的点)若存在,则必为全局最优解

小结

概念 定义 备注
驻点 梯度为零的点 $\nabla f(\mathbf{x}) = \mathbf{0}$ 包含极值点和鞍点
极值点 局部或全局的最大/最小值点 默认指局部极值点
全局极值点 在整个定义域内的最大/最小值点 凸优化中局部即全局
鞍点 某些方向是极大,某些方向是极小的点 非极值点的驻点

理解函数的特殊点是掌握最优化算法的基础,后续学习的梯度下降法、牛顿法等都是在寻找这些特殊点。


线性规划

数学建模

问题的提出

线性规划(Linear Programming, LP)主要用于解决生产经营中的资源分配问题——在有限的资源约束下,如何安排生产以获得最大利润(或最小成本)。


例题:工厂生产计划

某工厂生产甲、乙两种产品,相关数据如下:

资源 甲产品 ($x_1$) 乙产品 ($x_2$) 资源限量
原料 2 单位/件 1 单位/件 8 单位
电力 1 单位/件 2 单位/件 6 单位
利润 2 元/件 3 元/件

问题:如何安排甲、乙两种产品的产量,使得总利润最大?

数学模型的建立

决策变量:

  • $x_1$:甲产品的生产数量
  • $x_2$:乙产品的生产数量

目标函数(最大化总利润):

约束条件:

模型构成:

1
数学模型 = 目标函数 + 约束条件
组成部分 本例中的体现
目标函数 $\max Z = 2x_1 + 3x_2$(追求最大利润)
约束条件 原料限制、电力限制、非负限制
决策变量 $x_1, x_2$(可控制的产量)

这是一个典型的二维线性规划问题,可以用图解法求解,也可以使用单纯形法等代数方法求解。


例题:标牌制作问题

某工作室需要制作两种标牌:文牌200个,图牌300个。现有甲、乙两种规格的原材料,相关数据如下:

材料 单张面积 文牌产量 图牌产量
甲料 3 m²/张 4 个/张 8 个/张
乙料 2 m²/张 5 个/张 3 个/张
需求 ≥ 200 个 ≥ 300 个

问题:如何确定甲、乙两种材料的采购数量,使得总用料面积最少?

数学模型的建立

决策变量:

  • $x_1$:甲材料的采购张数
  • $x_2$:乙材料的采购张数

目标函数(最小化总用料面积):

约束条件:

说明:本例中 $x_1, x_2$ 理论上应为整数(整数规划),但整数规划求解较为复杂,将在后续章节专门讨论。此处先按连续变量处理,求得的结果可作为整数规划的参考。


例题对比总结

例题 目标 约束类型 特点
例1:工厂生产 最大化利润 $\max Z = 2x_1 + 3x_2$ $\leq$(资源限制) 资源有限,追求效益最大
例2:标牌制作 最小化成本 $\min Z = 3x_1 + 2x_2$ $\geq$(需求满足) 需求确定,追求成本最低

两个例题都是典型的二维线性规划问题,可以用图解法直观求解,也可以用单纯形法进行代数求解。


LP的数学模型

一般形式(标量形式)

线性规划(Linear Programming, LP)问题包含以下要素:

符号 含义 说明
$n$ 决策变量个数 $x_1, x_2, \ldots, x_n$
$c_i$ 价值系数 目标函数中 $x_i$ 的系数,表示单位价值
$b_j$ 资源限制量 第 $j$ 种资源的可用数量
$a_{ij}$ 工艺系数 单位 $x_i$ 对第 $j$ 种资源的消耗量

标量形式


简写形式(求和形式)

对上述标量形式进行简化,用求和符号表示:

:约束条件中的 $\leq$ 可以替换为 $\geq$ 或 $=$,取决于具体问题的约束类型。


向量形式(矩阵形式)

更进一步的简化,引入向量和矩阵表示:

向量/矩阵定义

向量形式


三种形式对比

形式 表达式 适用场景
标量形式 展开写法 理解问题结构,手工计算
简写形式 求和符号 理论推导,一般性描述
向量形式 矩阵表示 计算机实现,大规模问题

理解要点

  • 标量形式直观但冗长,适合简单问题
  • 向量形式简洁优雅,是单纯形法等算法实现的基础
  • $A\mathbf{x} \leq \mathbf{b}$ 可以统一表示各种类型的约束(通过引入松弛变量/剩余变量)

LP数学模型的标准化

为了使用单纯形法等标准算法求解线性规划问题,需要将一般的 LP 模型转化为标准形式

标准形的三个要求

要求 说明
1. 目标函数最大化 必须是 $\max Z$,而非 $\min Z$
2. 约束条件等式化 必须是 $=$,而非 $\leq$ 或 $\geq$
3. 变量与资源非负 $x_j \geq 0$,$b_i \geq 0$

标准化规则

① 目标函数最小化 → 最大化

若原问题为最小化,令 $Z’ = -Z$:

② 约束条件不等式 → 等式

  • $\leq$ 型约束:添加松弛变量 $x_{n+i} \geq 0$

  • $\geq$ 型约束:添加剩余变量(负的松弛变量)$x_{n+i} \geq 0$

松弛变量/剩余变量的含义:表示资源利用的剩余量或缺口,在实际问题中通常没有经济价值(目标函数系数为0)。

③ 资源限量 $b_i < 0$ 的处理

当约束右侧 $b_i < 0$ 时,两侧同乘 $-1$,同时改变不等号方向:

④ 决策变量 $x_k \leq 0$ 的处理

令 $x_k’ = -x_k$,则 $x_k’ \geq 0$:

⑤ 决策变量无约束(自由变量)的处理

引入两个非负变量 $x_k’, x_k’’ \geq 0$,令:

注意:自由变量必须用两个非负变量之差表示,不能只用一个非负变量替代。


标准化示例

将下列 LP 问题化为标准形:

标准化步骤

  1. 目标函数:$\min Z \rightarrow \max Z’ = -2x_1 + 3x_2$

  2. 约束①($\leq$):添加松弛变量 $x_3 \geq 0$

  3. 约束②($\geq$):添加剩余变量 $x_4 \geq 0$

  4. 自由变量:$x_2 = x_2’ - x_2’’$,其中 $x_2’, x_2’’ \geq 0$

标准形


标准化速查表

原形式 标准化方法 转换结果
$\min Z$ 令 $Z’ = -Z$ 目标函数变号
$\sum a_{ij}x_j \leq b_i$ 加松弛变量 等式左侧加松弛变量
$\sum a_{ij}x_j \geq b_i$ 减剩余变量 等式左侧减剩余变量
$b_i < 0$ 两侧同乘 $-1$ 不等号反向
$x_k \leq 0$ 令 $x_k’ = -x_k$ 替换为非负变量
$x_k$ 无约束 令 $x_k = x_k’ - x_k’’$ 分解为两个非负变量之差

约束转换的直观理解

  • 松弛变量:表示”还有剩余”的量($\leq$ 变 $=$,加上松弛)
  • 剩余变量:表示”还差多少”的量($\geq$ 变 $=$,减去剩余)