Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

2.4 几何规划

几何规划是处理涉及多项式及其推广形式函数的一种独特非线性优化问题模型。 虽然许多典型的几何规划在形式上可能是非凸的,但通过合适的变量变换,例如对数变换,常常可以转化为标准的凸优化问题来求解。

案例:有盖箱子表面面积最省的优化

假设我们需要设计一个容积严格为 VV有盖长方体箱子,长、宽、高分别记为 x0,x1,x2x_0, x_1, x_2。 我们的目标是在体积固定的前提下,使箱子的总表面积最小。对于有盖箱子,表面积为

2x0x1+2x0x2+2x1x2.2 x_0 x_1 + 2 x_0 x_2 + 2 x_1 x_2.

本节将用两种方式展示如何求解这个几何规划问题:

  1. 直接使用 GP 建模: 直接求解原始几何规划形式。

  2. 对数变换后的凸形式:yi=logxiy_i = \log x_i,将问题转化为凸优化模型后再求解。

import cvxpy as cp
import numpy as np
V = 3.0

# 有盖箱子的解析最优解是正方体。
a = V ** (1 / 3)
print("解析最优边长:", round(a, 4))
解析最优边长: 1.4422

直接使用原问题

# 创建优化变量
x = cp.Variable(3, pos=True)

# 创建限制条件
constraints = [x[0] * x[1] * x[2] == V]

# 创建目标函数:有盖箱子的表面积
obj = cp.Minimize(2 * (x[0] * x[1] + x[0] * x[2] + x[1] * x[2]))

# 创建优化问题
prob = cp.Problem(obj, constraints)
prob.solve(gp=True)

# 输出结果
print("求解状态:", prob.status)
print("最优值:", f"{prob.value:.4f}" if prob.value is not None else None)
if x.value is not None:
    print(f"最优变量:\n长 x0: {x.value[0]:.4f}\n宽 x1: {x.value[1]:.4f}\n高 x2: {x.value[2]:.4f}")
求解状态: optimal
最优值: 12.4805
最优变量:
长 x0: 1.4423
宽 x1: 1.4422
高 x2: 1.4422

使用转变的凸形式

# 创建优化变量
y = cp.Variable(3)

# 创建限制条件
constraints = [y[0] + y[1] + y[2] == np.log(V)]

# 创建目标函数:对有盖箱子表面积做对数变量替换后的凸形式
obj = cp.Minimize(
    2 * cp.exp(y[0] + y[1])
    + 2 * cp.exp(y[0] + y[2])
    + 2 * cp.exp(y[1] + y[2])
)

# 创建优化问题
prob = cp.Problem(obj, constraints)
prob.solve()

# 输出结果
print("求解状态:", prob.status)
print("最优值:", f"{prob.value:.4f}" if prob.value is not None else None)
if y.value is not None:
    x_opt = np.exp(y.value)
    print(f"最优变量 (即 exp(y)):\n长 x0: {x_opt[0]:.4f}\n宽 x1: {x_opt[1]:.4f}\n高 x2: {x_opt[2]:.4f}")
求解状态: optimal
最优值: 12.4805
最优变量 (即 exp(y)):
长 x0: 1.4422
宽 x1: 1.4423
高 x2: 1.4422