作者:张舒政,东北大学管理科学与工程系在读博士生,研究方向:鲁棒优化、数据驱动优化
编者按:
本推文将介绍MIT教授Dimitris Bertsimas的最新成果《Robust and Adaptive Optimization under a Large Language Model Lens》。该论文预印本于2024年12月31日发布于arxiv,并投稿在INFORMS Journal of Computing。该论文旨在解决:如何使用ChatGPT建模和求解鲁棒优化及多阶段鲁棒优化问题?本推文对原文中提示词和实例进行了翻译,并应用于DeepSeek模型,表明了推文翻译的中文版提示词应用于大语言模型的有效性和DeepSeek模型建模求解鲁棒优化问题的能力。
论文原文摘要如下:在本文中,我们探讨了ChatGPT在鲁棒优化和自适应鲁棒优化领域的应用。我们表明,通过适当的提示词,ChatGPT可用于自动制定和解决简单的鲁棒和自适应优化问题。我们首先开发针对自适应和一般鲁棒优化领域量身定制的专业提示信息。然后,我们表明使用这些提示词,ChatGPT 能够(i)建模优化问题,(ii)调整问题以解释用户指定的不确定性,(iii)推导出问题的计算上可处理的鲁棒对应物,以及(iv)生成求解的可执行码。对于简单的优化问题,我们表明ChatGPT能够执行这些步骤,几乎没有错误。我们还重点介绍了一些错误执行步骤的实例。总体而言,我们表明使用上下文学习(In-Context learning),ChatGPT可以适应高专业和小众领域,反之其表现出非常糟糕的开箱即用性能。
1、引言
许多实际决策可以作为数学优化问题进行建模和求解。运筹学已经在各种重要应用中取得了巨大进展,例如航空运输、供应链管理和金融等。然而,数学优化并不像机器学习等领域那样受到全球社区的欢迎。部分原因是使用优化方法建模和解决实际问题通常需要用户成为专家,即能够识别问题中的特定结构并利用它们来生成准确且易于求解的优化模型。而机器学习包(package)的广泛使用让每个人都只需编写几行代码,即可训练和运行 ML 模型。因此,本文探讨是否可以让使用大型语言模型(如 ChatGPT)让非专家更容易使用优化模型。本文将重点放在优化的一个子领域,称为鲁棒优化(Robust Optimization, RO),其通常需要更多的建模专业知识才能应用于实际问题。鲁棒优化专注于寻找稳健的解决方案,而不是最优解决方案。RO 有助于解决 (a) 优化问题数据中的不确定性,(b) 问题可行解的实现错误,以及 (c) 不确定性下的多阶段优化。
应用RO存在各种挑战,需要确定问题的不确定参数;选择适当的不确定集(Uncertainty Set)对其进行建模;然后需要将这些不确定性嵌入到统一的 RO模型中;最后,通过应用一系列理论推导,我们需要将原来的 RO 模型转化为一个精确易控的优化问题,令商业求解器可以高效解决。在实践中,这个过程可能既复杂又耗时,这使得没有足够背景的用户难以应用鲁棒优化。因此,在本文中,我们尝试使用大语言模型来帮助非专家实现RO 建模求解过程。特别是,我们利用 ChatGPT 和上下文学习来自动化 (i) 将经典优化模型转换为统一的 RO 模型,(ii) 将原始 RO/模型转换为易于求解的优化问题,以及 (iii) 生成求解优化问题的可执行代码。
特别的,由于 RO 是利基研究领域,ChatGPT 在此类问题中的开箱即用表现非常糟糕,因为这些主题的训练数据有限。除此之外,制定可处理的 RO问题需要建模者应用和组合各种数学定理,以便将问题转化为可以使用标准优化求解器(例如 Gurobi, CPLEX)求解的形式。同样,ChatGPT 没有配备执行这些转换所需的数学工具。为了克服这些困难,本文设计了特定的提示词,可以帮助 ChatGPT 通过上下文学习自动建模和求解 RO 问题。据我们所知,本文是该方向的首篇研究。
2、本文使用的鲁棒优化中术语和符号
本文考虑以下形式鲁棒优化问题,其中仅约束左端项的系数 a \mathbf{a} a为不确定参数,目标函数和约束右端包含不确定性的问题可以轻易转化成该形式,此处不做赘述。
此时可以将该问题表示如下
3、ChatGPT 建模和求解鲁棒优化的提示词
为了使用 ChatGPT 建模和求解 RO 问题,我们将使用上下文学习(即提示词)来引入鲁棒优化的概念和必要工具。本文中所有提示词均翻译成中文,英文版提示词见原文。作为我们提示词的一部分,我们要求模型将生成过程分解为更小的中间步骤。这样,模型可以将更多的计算分配给需要更多推理步骤的过程。具体来说,我们分为以下步骤
- 初始问题生成:首先要求 ChatGPT 生成一个名义上的线性优化问题,该问题在其参数中没有不确定性。除了“ minimize c T x ; s.t. A x ≤ b \text{minimize} \ \mathbf{c}^T \mathbf{x}; \ \text{s.t.}\ A \mathbf{x} \leq \mathbf{b} minimize cTx; s.t. Ax≤b“外,ChatGPT 还可以生成其他常见的优化问题,例如网络流问题、设施位置问题、饮食问题等。此外,用户还可以指定他们可能想要生成的自定义问题。
- 引入不确定参数:要求 ChatGPT 转化上一步中的问题,以便其考虑到问题数据中的不确定性。在此步骤中,我们还指定了不确定集的类型。我们还为 ChatGPT 提供了一个快速的上下文提示,说明什么是鲁棒优化,我们应该如何转换约束以考虑不确定性以及可用的不确定集是什么。
- 鲁棒对应物的制定:我们要求 ChatGPT 推导出第 2 步问题的鲁棒对应物(Robust Counterpart),以便将问题转化为易于求解的形式。在此步骤中,我们为不同的不确定集提供上下文提示,还提供了有关如何处理不确定集组合(例如交集)的信息。
- 代码生成:在最后一部分,我们要求 ChatGPT 生成一个可运行的代码,使用示例数据解决问题。为此,我们还包含一个提示,帮助 ChatGPT 处理 L 1 L1 L1和 L ∞ L\infty L∞范数(即通过线性化它们)和 L 2 L2 L2范数(通过添加二阶锥约束)。
在上面描述的 4 个步骤中,我们只在第 2、3 和 4 步中使用上下文提示,因为 ChatGPT 已经知道如何制定基本优化问题(即第 1 步)。此类上下文提示的示例如下所示:
- 步骤 2 的提示词:
提示词 2.1: 假设你有一个线性优化问题。如果要增加参数向量 a \mathbf{a} a 的鲁棒性,该参数向量是约束中变量的系数向量,则首先必须将涉及您感兴趣的参数的不等式约束转换为 a T x ≤ b \mathbf{a}^T \mathbf{x} \leq \mathbf{b} aTx≤b的形式。然后,对于所有 z ∈ Z \mathbf{z} \in \mathcal{Z} z∈Z,你可以通过将约束转换为 ( a + P z ) T x ≤ b (\mathbf{a} + \mathbf{P} \mathbf{z})^T \mathbf{x} \leq \mathbf{b} (a+Pz)Tx≤b来增加稳健性,其中 Z \mathcal{Z} Z是所需的不确定集, P \mathbf{P} P是预定义的参数矩阵。常见的不确定集 Z \mathcal{Z} Z包括 p p p范数不确定集 Z = { z ∈ R n : ∥ z ∥ p ≤ ρ } \mathcal{Z} = \{\mathbf{z} \in \mathbb{R}^n: \| \mathbf{z}\|_p \leq \rho \} Z={z∈Rn:∥z∥p≤ρ}和多面体不确定集 Z = { z ∈ R n : d − D z ≤ 0 } \mathcal{Z} = \{\mathbf{z} \in \mathbb{R}^n: \mathbf{d} - \mathbf{D} \mathbf{z} \leq 0\} Z={z∈Rn:d−Dz≤0}。
- 步骤3的提示词:
在此步骤中,我们使用 2 个提示词的变体,一个简单一个复杂。简单的提示词只包括一小类不确定集,并且在推导鲁棒对应物时不使用支持函数:
提示词 2.2: 在鲁棒优化中,如果你想采用鲁棒对应物并使问题易于求解。假设你有一个形式为 ( a + P z ) T x ≤ b (\mathbf{a} + \mathbf{P} \mathbf{z})^T \mathbf{x} \leq \mathbf{b} (a+Pz)Tx≤b的约束,则对于所有 z ∈ Z \mathbf{z} \in \mathcal{Z} z∈Z,你可以使用以下规则:
- 若 Z \mathcal{Z} Z是半径为 r r r的欧几里得球不确定集(即 ∥ z ∥ 2 ≤ r \|\mathbf{z}\|_2 \leq r ∥z∥2≤r) 则该约束可以转换为: a T x + r ∥ P T x ∥ 2 ≤ b \mathbf{a}^T \mathbf{x} + r\|\mathbf{P}^T \mathbf{x}\|_2 \leq \mathbf{b} aTx+r∥PTx∥2≤b .
- 若 Z \mathcal{Z} Z是多面体不确定集(即 Z = { z : D z ≤ d } \mathcal{Z} = \{\mathbf{z}: \mathbf{D} \mathbf{z} \leq d\} Z={z:Dz≤d}),则约束可以转换为以下约束集: a x + d T y ≤ b \mathbf{a} \mathbf{x} + \mathbf{d}^T \mathbf{y}\leq \mathbf{b} ax+dTy≤b, D T y = P T x \mathbf{D}^T \mathbf{y} = \mathbf{P}^T \mathbf{x} DTy=PTx, y ≥ 0 \mathbf{y} \geq \mathbf{0} y≥0。
- 若 Z \mathcal{Z} Z是半径为 r r r的一般 p-范数球不确定集(即 Z = { z : ∥ z ∥ p ≤ r } \mathcal{Z} = \{\mathbf{z}: \|\mathbf{z}\|_p \leq r\} Z={z:∥z∥p≤r}),则约束可以转换为: a T x + r ∥ P T x ∥ q ≤ b \mathbf{a}^T \mathbf{x} + r\|\mathbf{P}^T \mathbf{x}\|_q \leq \mathbf{b} aTx+r∥PTx∥q≤b 其中 q = p / ( p − 1 ) q = p/(p-1) q=p/(p−1)。这意味着 ∥ ⋅ ∥ p \| \cdot\|_p ∥⋅∥p是 ∥ ⋅ ∥ q \| \cdot\|_q ∥⋅∥q的对偶范数。
- 若 Z \mathcal{Z} Z是半径为 r r r 的 1 范数不确定集(即 Z = { z : ∥ z ∥ 1 ≤ r } \mathcal{Z} = \{\mathbf{z}: \|\mathbf{z}\|_1 \leq \mathbf{r}\} Z={z:∥z∥1≤r}),则约束可以转换为 a T x + r ∥ P T x ∥ ∞ ≤ b \mathbf{a}^T \mathbf{x} + r\|\mathbf{P}^T \mathbf{x}\|_\infty \leq \mathbf{b} aTx+r∥PTx∥∞≤b。
- 若 Z \mathcal{Z} Z是半径为 r的无穷范数不确定集(即 Z = { z : ∥ z ∥ ∞ ≤ r } \mathcal{Z} = \{\mathbf{z}: \|\mathbf{z}\|_\infty \leq \mathbf{r}\} Z={z:∥z∥∞≤r}),则约束可以转换为 a T x + r ∥ P T x ∥ 1 ≤ b \mathbf{a}^T \mathbf{x} + r\|\mathbf{P}^T \mathbf{x}\|_1 \leq \mathbf{b} aTx+r∥PTx∥1≤b。
第二类提示词使用支持函数来推导鲁棒对应物,并包含更多不确定集。此提示词的好处是它还包含有关如何组合不确定集(例如交集或 Minkowski 和)的信息:
提示词 2.3: 在鲁棒优化中,如果你想采用鲁棒对应物并使问题易于处理,你可以使用以下规则:假设你有一个形式为 ( a + P z ) T x ≤ b (\mathbf{a} +\mathbf{P} \mathbf{z})^T \mathbf{x} \leq \mathbf{b} (a+Pz)Tx≤b的约束,则对于所有 z ∈ Z \mathbf{z} \in \mathcal{Z} z∈Z,其鲁棒对应物是 a T x + d ∗ ( P T x ∣ Z ) ≤ b \mathbf{a}^T \mathbf{x} + d^*(\mathbf{P}^T \mathbf{x} |\mathcal{Z}) \leq \mathbf{b} aTx+d∗(PTx∣Z)≤b。 其中, d ∗ ( x ∣ Z ) d^*(\mathbf{x} |\mathcal{Z}) d∗(x∣Z) 是在 x \mathbf{x} x处评估的不确定集 Z \mathcal{Z} Z的支持函数的共轭。 以下属性适用于支持函数:
- 若 Z \mathcal{Z} Z是无穷范数球(即 ∥ z ∥ ∞ ≤ r \|\mathbf{z}\|_\infty \leq r ∥z∥∞≤r) 则 d ∗ ( x ∣ Z ) = r ∥ x ∥ 1 d^*(\mathbf{x} |\mathcal{Z}) = r\|\mathbf{x}\|_1 d∗(x∣Z)=r∥x∥1 .
- 若 Z \mathcal{Z} Z是2范数球(即 ∥ z ∥ 2 ≤ r \|\mathbf{z}\|_2 \leq r ∥z∥2≤r) 则 d ∗ ( x ∣ Z ) = r ∥ x ∥ 2 d^*(\mathbf{x} |\mathcal{Z}) = r\|\mathbf{x}\|_2 d∗(x∣Z)=r∥x∥2 .
- 若 Z \mathcal{Z} Z是p范数球(即 ∥ z ∥ p ≤ r \|\mathbf{z}\|_p \leq r ∥z∥p≤r) 则 d ∗ ( x ∣ Z ) = r ∥ x ∥ q d^*(\mathbf{x} |\mathcal{Z}) = r\|\mathbf{x}\|_q d∗(x∣Z)=r∥x∥q 其中 q = p / ( p − 1 ) q = p/(p-1) q=p/(p−1)。这意味着 ∥ ⋅ ∥ p \| \cdot\|_p ∥⋅∥p是 ∥ ⋅ ∥ q \| \cdot\|_q ∥⋅∥q的对偶范数。
- 若 Z = { z : ∑ i = 1 l ( 1 + z i ) ln ( 1 + z i ) + ( 1 − z i ) ln ( 1 − z i ) } \mathcal{Z} = \{\mathbf{z}: \sum_{i=1}^l\ (1 + z_i) \ln(1 + z_i) + (1 - z_i) \ln(1 - z_i)\} Z={z:∑i=1l (1+zi)ln(1+zi)+(1−zi)ln(1−zi)},则 d ∗ ( x ∣ Z ) = ∑ i = 1 l { t i − s i + u ( e s i / u − 1 + e − t i / u − 1 ) } d^*(\mathbf{x} |\mathcal{Z}) = \sum_{i=1}^l \{t_i - s_i + u(e^{s_i/u-1} + e^{-t_i/u-1})\} d∗(x∣Z)=∑i=1l{ti−si+u(esi/u−1+e−ti/u−1)}。
- 若 Z \mathcal{Z} Z是多面体不确定集(即 Z = { z : D z ≤ d } \mathcal{Z} = \{\mathbf{z}: \mathbf{D} \mathbf{z} \leq d\} Z={z:Dz≤d}),则应将 d ∗ ( x ∣ Z ) d^*(\mathbf{x} |\mathcal{Z}) d∗(x∣Z) 替换为 d T u \mathbf{d}^T \mathbf{u} dTu,并添加以下 2 个约束: D T u = P T x \mathbf{D}^T \mathbf{u} = \mathbf{P}^T \mathbf{x} DTu=PTx 和 u ≥ 0 \mathbf{u} \geq \mathbf{0} u≥0。
- 若 Z \mathcal{Z} Z是 Z 1 \mathcal{Z}1 Z1和 Z 2 \mathcal{Z}2 Z2的交集,则 d ∗ ( x ∣ Z ) d^*(\mathbf{x} |\mathcal{Z}) d∗(x∣Z) 不可显式表示,但可以将 d ∗ ( x ∣ Z ) d^*(\mathbf{x} |\mathcal{Z}) d∗(x∣Z) 替换为 d ∗ ( w 1 ∣ Z 1 ) + d ∗ ( w 2 ∣ Z 2 ) d^*(\mathbf{w}1 |\mathcal{Z}1)+ d^*(\mathbf{w}2 |\mathcal{Z}2) d∗(w1∣Z1)+d∗(w2∣Z2) 并添加约束 x = w 1 + w 2 \mathbf{x}=\mathbf{w}1+\mathbf{w}2 x=w1+w2,其中 x \mathbf{x} x 是 d ∗ ( x ∣ Z ) d^*(\mathbf{x} |\mathcal{Z}) d∗(x∣Z)的参数。
- 若 Z \mathcal{Z} Z是 Z 1 \mathcal{Z}1 Z1和 Z 2 \mathcal{Z}2 Z2的闵可夫斯基和,则 d ∗ ( x ∣ Z ) = d ∗ ( x ∣ Z 1 ) + d ∗ ( x ∣ Z 2 ) d^*(\mathbf{x} |\mathcal{Z}) = d^*(\mathbf{x} |\mathcal{Z}1)+ d^*(\mathbf{x} |\mathcal{Z}2) d∗(x∣Z)=d∗(x∣Z1)+d∗(x∣Z2)。
- 步骤4的提示词:对于代码编写步骤,我们使用以下提示词:
提示词 2.4:
- 如果你有形式如 g ( x ) + ∥ x ∥ 1 ≤ b g(\mathbf{x}) + \| \mathbf{x}\|_1 \leq \mathbf{b} g(x)+∥x∥1≤b(或绝对值求和)的约束,那么你需要通过引入辅助变量 t i t_i ti来摆脱 1范数,用 g ( x ) + ∑ ( t i ) ≤ b g(\mathbf{x}) + \sum(t_i) \leq \mathbf{b} g(x)+∑(ti)≤b 替换原约束,并对于所有 i i i添加额外的约束 t i ≥ x i t_i \geq x_i ti≥xi 和 t i ≥ − x i t_i \geq -x_i ti≥−xi。此过程用于线性化 L1 范数。
- 如果你有形式如 g ( x ) + ∥ x ∥ ∞ ≤ b g(\mathbf{x}) + \| \mathbf{x}\|_\infty \leq \mathbf{b} g(x)+∥x∥∞≤b的约束,那么你需要去掉无穷范数。为此,你可以引入辅助变量 t t t,并将原约束替换为 g ( x ) + t ≤ b g(\mathbf{x}) + t \leq \mathbf{b} g(x)+t≤b,并对于所有 i i i添加约束 t ≥ x i t \geq x_i t≥xi 和 t ≥ − x i t \geq -x_i t≥−xi。这样,你可以线性化无穷范数。
- 如果你有形式如 g ( x ) + ∥ x ∥ 2 ≤ b g(\mathbf{x}) + \| \mathbf{x}\|_2 \leq \mathbf{b} g(x)+∥x∥2≤b的约束,那么你需要去掉 2 范数。你可以通过引入辅助变量 t t t来实现这一点,用 g ( x ) + t ≤ b g(\mathbf{x}) + t \leq \mathbf{b} g(x)+t≤b替换约束,然后添加约束 t 2 ≥ ∑ ( x i 2 ) t^2 \geq \sum(x_i^2) t2≥∑(xi2).
4、使用ChatGPT建模和求解鲁棒优化的示例
本节将使用前述的提示词和步骤展示与 ChatGPT 实际交互的示例。所有对话均翻译成中文。在呈现 ChatGPT 回复时,省略部分回复以仅显示最相关的信息。
4.1 例1:自定义问题,每个约束具有不同的不确定性
用户:
建模问题 maximize 50 ∗ x1 + 40 ∗ x2 + 60 ∗ x3 + 30 ∗ x4 s.t. 10 ∗ x1 + 20 ∗ x2 + 30 ∗ x3 + 40 ∗ x4 >= 500 和 2 ∗ x1 + 3 ∗ x2 + 4 ∗ x3 + 5 ∗ x4 <= 300,并为其添加鲁棒优化。在第一个约束的系数中,添加欧几里得球不确定性,而在第二个约束的系数中,添加无穷范数不确定性。请使用以下信息为你提供指导:{提示词2.1}
ChatGPT:
…
让我们首先将不等式约束转换为所需的形式 a^T x <= b 以实现鲁棒优化。
第一个约束:10x1 + 20x2 + 30x3 + 40x4 >= 500。我们可以将这个约束改写为: −10x1 − 20x2 − 30x3 − 40x4 <= −500 让我们把它改写成 aT x <= b 的形式 : a = [−10, −20, −30, −40], b = −500。
第二个约束:2x1 + 3x2 + 4x3 + 5x4 <= 300。这个约束已经是所需的形式:a = [2, 3, 4, 5], b = 300。
现在,我们将使用指定的不确定集为这些约束增加稳健性。
第一个约束的欧几里得球不确定性: (a + z)T x <= b, ∀z ∈ z,其中 z = {z : ||z ||2 <= r}
变换后的约束变为: (−10 + z1) ∗ x1 + (−20 + z2) ∗ x2 + (−30 + z3) ∗ x3 + (−40 + z4) ∗ x4 <= −500
第二个约束的无穷范数不确定性: (a + z)T x <= b, ∀z ∈ Z,其中 z = {z : ||z ||∞ <= r}
变换后的约束变为: (2 + z1) ∗ x1 + (3 + z2) ∗ x2 + (4 + z3) ∗ x3 + (5 + z4) ∗ x4 <= 300
最后,我们将鲁棒优化问题组合在一起:
Maximize: 50x1 + 40x2 + 60x3 + 30x4
s.t.
(−10 + z1) ∗ x1 + (−20 + z2) ∗ x2 + (−30 + z3) ∗ x3 + (−40 + z4) ∗ x4 <= −500, ∀z : ||z ||2 <= r
(2 + z1) ∗ x1 + (3 + z2) ∗ x2 + (4 + z3) ∗ x3 + (5 + z4) ∗ x4 <= 300, ∀z : ||z ||∞ <= r
…
用户:
你现在可以推导出问题的鲁棒对应物以使问题易于求解吗? 可以使用以下信息来指导:{提示词 2.2}
ChatGPT:
…
现在,问题的鲁棒对应物为:
目标函数:maximize 50x1 + 40x2 + 60x3 + 30x4
s.t.
(2x1 + 3x2 + 4x3 + 5x4) + r ∗ sqrt (x12 + x22 + x32 + x42) <= 300
(10x1 + 20x2 + 30x3 + 40x4) − r ∗ (|x1| + |x2| + |x3| + |x4|) >= 500
…
用户:
你现在能否编写一段 julia 代码来解决这个问题?请使用 JuMP 和 Gurobi。在实施中,请注意以下事项:{提示词2.4}
ChatGPT:
using JuMP
using Gurobi
#Define the optimization model
model = Model(Gurobi.Optimizer)
@variable(model , x[1:4] >= 0) # Non-negative variables x1, x2 , x3, x4
@variable(model , t[1:4] >= 0)
@variable(model , t2 >= 0)
r = 0.1 # Set the value of r for the uncertainty sets
@constraint(model , constraint1 , 2x[1] + 3x[2] + 4x[3] + 5x [4] + r*t2 <= 300)
for i in 1:4
@constraint(model , abs_constraint [i], t[i] >= x[i])
@constraint(model , abs_constraint [i], t[i] >= -x[i])
end
@constraint(model , constraint2 , 10x[1] + 20x[2] + 30x[3] + 40x[4] - r*sum(x[i] for i in 1:4) >= 500)
@constraint(model , l2_norm_constraint , t2ˆ2 >= sum(x[i]ˆ2 for i in 1:4))
@objective(model , Max , 50x[1] + 40x[2] + 60x[3] + 30x[4])
optimize !( model )
…
在这个实例中,ChatGPT 能够接受给定的问题,使用指定的不确定集增加鲁棒性,将鲁棒优化问题转换为鲁棒对应问题,最后编写一段代码来求解。请注意,在这个特定示例中,ChatGPT 克服了许多挑战:
- 给出的第一个约束是 a T x ≥ b \mathbf{a}^T \mathbf{x} \geq \mathbf{b} aTx≥b,而我们的提示只描述了当约束的形式为 a T x ≤ b \mathbf{a}^T \mathbf{x} \leq \mathbf{b} aTx≤b时如何引入鲁棒性。因此, ChatGPT 首先将约束转换为正确的形式,然后继续增加鲁棒性。
- 有不同类型的不确定性约束,ChatGPT 独立处理了 2 个约束,并为每个约束添加了不同类型的不确定性。
- 当采用第二个约束的鲁棒对应物时,ChatGPT 考虑了不等式的方向,并正确地在 1-范数项前添加了一个减号。
- 在为该问题编写 Julia 代码时,ChatGPT 正确引入了辅助变量,将 2 范数建模为二阶锥约束,并将 1 范数线性化。
4.2 例2:一步即可获得饮食问题的鲁棒对应物
用户:
请建模饮食优化问题。另外,请添加预算约束。
ChatGPT:
饮食问题是数学和运筹学中的经典优化问题。它涉及确定日常饮食中要包含的食品的最佳组合,同时遵守某些营养限制和预算限制。目标是根据这些限制来最小化或最大化特定目标,例如成本或营养价值。从形式上讲,饮食问题可以定义如下:
目标函数:最小化或最大化特定目标,通常为以下目标之一
- 最小化成本:将所选食品的成本降至最低。
- 最大化营养价值:最大化所选食品的营养价值(例如,总卡路里、蛋白质、维生素)。
变量:
设xi 为饮食中要包含的食物 i 的量(以克或份数为单位)
约束:
-
营养约束:确保所选饮食符合特定的营养需求。这些限制可能包括对卡路里、蛋白质、碳水化合物、脂肪、维生素、矿物质等的限制。正式地说,对于每种营养物质或成分 j:
sum_i(x_i · i 的营养成分) ≥ 所需营养j的最低含量
-
预算约束:确保所选食品的总成本不超过给定的预算限制
sum_i(x_i · i 的成本) ≤ 成本限制
-
非负约束:确保所选食品的数量为非负数
x_i ≥ 0,对于所有 i
…
用户:
为预算约束添加鲁棒优化。请添加 1 范数不确定性。请一步一步地工作,尤其是在采用鲁棒的对应物时。可以使用以下信息来指导你:{提示词 2.1} + {提示词 2.3}
ChatGPT:
…
第1步:转换预算约束
最初的预算约束是:
sum_i(x_i · i 的成本) ≤ 成本限制
我们可以将其改写为:
aT x ≤ b
其中:
- a 是一个向量,其中每个元素对应于相应食品的成本。
- x 是决策变量向量,表示每种食品的数量。
- b 是预算限制。
第 2 步:增加鲁棒性
现在,我们将通过将不确定集 Z 中所有 z 的预算约束转换为 ( a + P z ) T x ≤ b (\mathbf{a} + \mathbf{P} \mathbf{z})^T \mathbf{x} \leq \mathbf{b} (a+Pz)Tx≤b来增加预算约束的稳健性。在这里,我们将考虑 1 范数不确定集,其中 Z 是定义为 Z = { z : ∥ z ∥ 1 ≤ r } \mathcal{Z} = \{\mathbf{z}: \|\mathbf{z}\|_1 \leq \mathbf{r}\} Z={z:∥z∥1≤r} 的 1 范数球。
鲁棒对应模型为:
a
T
x
+
d
∗
(
P
T
x
∣
Z
)
≤
b
\mathbf{a}^T \mathbf{x} + d^*(\mathbf{P}^T \mathbf{x} |\mathcal{Z}) \leq \mathbf{b}
aTx+d∗(PTx∣Z)≤b
现在,让我们找到 1 范数球的
d
∗
(
P
T
x
∣
Z
)
d^*(\mathbf{P}^T \mathbf{x} |\mathcal{Z})
d∗(PTx∣Z):
d
∗
(
P
T
x
∣
Z
)
=
r
∥
P
T
x
∥
∞
d^*(\mathbf{P}^T \mathbf{x} |\mathcal{Z}) = r\|\mathbf{P}^T \mathbf{x}\|_\infty
d∗(PTx∣Z)=r∥PTx∥∞
将其代入鲁棒约束:
a
T
x
+
r
∥
P
T
x
∥
∞
≤
b
\mathbf{a}^T \mathbf{x} + r\|\mathbf{P}^T \mathbf{x}\|_\infty\leq \mathbf{b}
aTx+r∥PTx∥∞≤b
这是具有 1 范数不确定性的饮食问题的鲁棒预算约束。
注意:要使此问题易于处理,您需要根据特定应用程序和所需的鲁棒性级别指定 r 和 P 的值。此外,这个稳健的公式可以使用各种优化技术(包括线性规划)来解决。
用户:
现在能否编写一段 julia 代码来解决这个问题?请使用 JuMP 和 Gurobi。在实施中,请注意以下事项:{提示词 2.4}
ChatGPT:
using JuMP
using Gurobi
#Define the parameters of the problem
num_food_items = 5 # Number of food items
budget_limit = 50.0 # Budget limit
costs = [10.0, 20.0, 15.0, 25.0, 30.0] # Cost of each food item
nutrient_content = [200, 300, 150, 250, 350] # Nutrient content of each food item
nutrient_requirements = [1500, 2000, 1000, 1800, 2200] # Minimum nutrient requirements
#Create a JuMP model and set the solver to Gurobi
model = Model(Gurobi.Optimizer)
#Define decision variables
@variable(model , x[1:num_food_items ] >= 0)
#Introduce an auxiliary variable for linearizing the infinity norm
@variable(model , t >= 0)
#Define the robust budget constraint
@constraint(model , sum(costs[i] * x[i] for i in 1: num_food_items ) + t <= budget_limit)
for i in 1:num_food_items
@constraint(model , t >= x[i])
@constraint(model , t >= -x[i])
end
#Add constraints to ensure nutritional requirements are met
for j in 1:length(nutrient_requirements )
@constraint(model , sum(nutrient_content [i] * x[i] for i in 1:num_food_items ) >= nutrient_requirements [j])
end
#Set the objective to minimize total cost
@objective(model , Min , sum(costs[i] * x[i] for i in 1: num_food_items ))
#Solve the robust diet problem
optimize !( model )
…
在这个例子中, ChatGPT 同样能够为问题增加鲁棒性,制定鲁棒对应物并生成可执行代码来解决示例数据的问题。 这个特定示例中的一些挑战如下:
- 步骤 3 中,我们没有使用简单提示,而是使用了第二个更高级的提示(即提示词2.3),它在推导稳健的对应项时使用支持函数。尽管如此,ChatGPT 仍然能够找到正确的支持函数并使用它来获取鲁棒对应函数。
- 在这个例子中,我们将步骤 2 和 3 合并为一个步骤,并要求 ChatGPT 增加稳健性并在同一步骤中采用鲁棒对应物。我们通过将步骤 2 的提示和步骤 3 的提示合并为一个提示来实现这一点。然而,尽管使用了很长的提示并要求 ChatGPT 同时执行多个推理步骤,它仍然能够正确执行这些步骤。
- ChatGPT 所需的代码编写步骤,以生成示例数据并将 L∞ 范数线性化,这两个步骤都已成功执行。
5、拓展应用:使用DeepSeek和中文提示词建模求解鲁棒优化问题
本节中将使用本文翻译的中文提示词,与国产大语言模型DeepSeek-V3实际交互来建模和求解鲁棒优化问题,注意由于访问量过大,本文并未使用最新模型DeepSeek-R1来求解实例。
用户:
请建模饮食优化问题。另外,请添加预算约束。
DeepSeek:
- 定义变量
- x_i:第 i 种食物的摄入量(单位:克、份等)。
- n:食物的种类总数。
- 目标函数
目标是优化饮食,通常有两种常见目标:
- 最小化成本:最小化总饮食成本。
- 其中,c_i 是第 i种食物的单位成本。
- 最大化营养:最大化某种或多种营养成分的摄入。
- 其中,n_ij是第 ii种食物中第 j种营养成分的含量。
- 约束条件
- 营养需求:确保摄入的营养成分满足最低或最高要求。
- 其中,N_j^min和 N_j^max分别是第 j种营养成分的最低和最高需求。
- 食物摄入量限制:每种食物的摄入量不能超过一定上限。
- 其中,U_i是第 i种食物的最大摄入量。
- 非负约束:摄入量不能为负。
- 预算约束
- 总成本限制:总饮食成本不能超过预算 B。
示例模型
假设目标是最小化成本,并且有以下约束:
- 满足每日蛋白质、碳水化合物和脂肪的最低需求。
- 每种食物的摄入量不超过其最大摄入量。
- 总成本不超过预算 B。
模型如下:
其中:
- pi:第 i种食物的蛋白质含量。
- ci:第 i种食物的碳水化合物含量。
- fi:第 i种食物的脂肪含量。
- Pmin、Cmin、Fmin:蛋白质、碳水化合物和脂肪的最低需求。
总结
通过上述模型,可以在满足营养需求和预算约束的情况下,优化饮食方案。
用户:
为预算约束添加鲁棒优化。请添加 1 范数不确定性。请一步一步地工作,尤其是在采用鲁棒的对应物时。可以使用以下信息来指导你:{提示词 2.1} + {提示词 2.3}
DeepSeek:
为了在预算约束中引入鲁棒优化并采用 1 范数不确定性,我们将按照以下步骤逐步进行:
(1). 问题描述
我们有一个线性优化问题,其中预算约束为:
其中:
ci是第 i种食物的单位成本。
xi 是第 i种食物的摄入量。
B 是预算上限。
我们希望引入鲁棒性,假设成本系数 ci 是不确定的,且不确定性由 1 范数不确定性集 描述。
(2). 引入不确定性
假设成本系数 cici 是不确定的,且可以表示为:
其中:
cˉi 是名义成本(已知的标称值)。
c~i 是成本的不确定性部分,满足 ∥c~∥1≤ρ,即:
这里,ρ 是不确定性的总幅度。
(3). 鲁棒预算约束
鲁棒预算约束要求在所有可能的不确定性下,预算约束都成立。因此,我们需要将原始预算约束转换为:
这可以重写为:
(4). 计算鲁棒对应物
根据提示词 2.3,对于 1 范数不确定性集,支持函数的共轭为:
因此,鲁棒对应物为:
(5). 将鲁棒约束转化为可处理形式
为了将 ∥x∥∞ 转化为线性约束,我们引入一个辅助变量 t,并添加以下约束:
这样,t表示 ∥x∥∞。
最终的鲁棒预算约束为:
(6). 完整的鲁棒优化模型
将鲁棒预算约束整合到原始饮食优化问题中,完整的鲁棒优化模型为:
(7). 总结
通过引入 1 范数不确定性,我们将预算约束转化为鲁棒形式,确保在成本系数不确定的情况下,预算约束仍然成立。最终的鲁棒优化模型可以通过线性规划求解器高效求解。
用户:
现在能否编写一段 Python 代码来解决这个问题?请使用 Python 和 Gurobi。在实施中,请注意以下事项:{提示词 2.4}
DeepSeek:
以下是使用 Python 和 Gurobi 求解带 1 范数不确定性鲁棒预算约束 的饮食优化问题的完整代码:
import gurobipy as gp
from gurobipy import GRB
#----------------------
#数据定义(示例参数)
#----------------------
n = 3 # 食物种类数量
foods = [“Food1”, “Food2”, “Food3”]
#名义成本(单位:元/克)
nominal_costs = [3.0, 2.5, 4.0]
#营养成分(蛋白质、碳水化合物、脂肪含量,单位:克/克)
protein = [0.2, 0.1, 0.3] # 每克食物的蛋白质含量
carbs = [0.5, 0.4, 0.2] # 每克食物的碳水化合物含量
fat = [0.1, 0.2, 0.05] # 每克食物的脂肪含量
#营养需求(单位:克)
min_protein = 50.0 # 最低蛋白质需求
min_carbs = 200.0 # 最低碳水化合物需
min_fat = 30.0 # 最低脂肪需求
#食物摄入量上限(单位:克)
max_intake = [500.0, 300.0, 400.0]
#预算参数
budget = 1000 # 总预算(元)
rho = 50.0 # 1-范数不确定性参数(控制成本波动的鲁棒性)
#----------------------
#创建模型
#----------------------
model = gp.Model(“RobustDietOptimization”)
#----------------------
#定义变量
#----------------------
#食物摄入量(非负,且不超过最大摄入量)
x = model.addVars(n, lb=0.0, ub=max_intake, name=“x”)
#辅助变量 t(用于处理无穷范数)
t = model.addVar(lb=0.0, name=“t”)
#----------------------
#设置目标函数:最小化总名义成本
#----------------------
total_cost = gp.quicksum(nominal_costs[i] * x[i] for i in range(n))
model.setObjective(total_cost, GRB.MINIMIZE)
#----------------------
#添加约束
#----------------------
#1. 鲁棒预算约束:总成本 + 鲁棒项 ≤ 预算
robust_budget = total_cost + rho * t
model.addConstr(robust_budget <= budget, “RobustBudget”)
#2. 辅助约束:t ≥ |x_i|(线性化无穷范数)
for i in range(n):
model.addConstr(t >= x[i], f"t_geq_x_{i}")
model.addConstr(t >= -x[i], f"t_geq_neg_x_{i}")
#3. 营养需求约束
model.addConstr(
gp.quicksum(protein[i] * x[i] for i in range(n)) >= min_protein,
"ProteinRequirement"
)
model.addConstr(
gp.quicksum(carbs[i] * x[i] for i in range(n)) >= min_carbs,
"CarbsRequirement"
)
model.addConstr(
gp.quicksum(fat[i] * x[i] for i in range(n)) >= min_fat,
"FatRequirement"
)
#----------------------
#求解模型
#----------------------
model.optimize()
#----------------------
#输出结果
#----------------------
if model.status == GRB.OPTIMAL:
print("优化成功!")
print(f"总成本: {model.ObjVal:.2f} 元")
print(f"鲁棒项 t: {t.X:.2f}")
print("\n食物摄入量:")
for i in range(n):
print(f"{foods[i]}: {x[i].X:.2f} 克")
else:
print("未找到可行解!")
关键点解释
- 鲁棒预算约束:
原始约束 ∑c_i x_i ≤ B 被替换为 ∑(名义成本 * x_i) + ρ * t ≤ B。
t 是辅助变量,表示食物摄入量的无穷范数 ‖x‖_∞。 - 无穷范数线性化:
通过约束 t ≥ x_i 和 t ≥ -x_i,强制 t 表示 max(|x_1|, |x_2|, …, |x_n|)。
由于 x_i ≥ 0(摄入量非负),实际只需 t ≥ x_i,但添加两个约束保证通用性。 - 参数调整:
rho 控制鲁棒性强度:较大的 rho 表示对成本不确定性更保守(但可能导致更高的名义成本)。
调整 budget、max_intake 和营养需求以匹配实际问题。
…
可以看到,DeepSeek-V3模型成功建模了饮食问题,并为问题增加鲁棒性,制定鲁棒对应物并生成可执行代码来解决示例数据的问题,且其在第二步中没有提示词的情况下直接线性化了无穷范数。这表明了本文翻译的中文提示词直接输入DeepSeek中学习的有效性。
但是其存在一些缺陷,即实例模型的参数失衡导致问题不能求解,DeepSeek实例代码中总预算budget = 1000,不确定预算rho = 50.0,将其调整为budget = 3000,不确定预算rho = 5.0才有解。正如DeepSeek输出所说,需要“调整 budget、max_intake 和营养需求以匹配实际问题”。实际上,由于类似的原因,原文中ChatGPT生成的的实例2也无解,其最终代码甚至缺少了不确定集半径r的设定(或是默认其为1),至少这一问题上ChatGPT并未比免费的DeepSeek-V3做得更好。其原因不难理解,毕竟大语言模型并未真正求解优化问题,并且参数设定本身需要依赖主观经验。因此原文中得出较为保守的结论“对于简单的优化问题,我们表明ChatGPT能够执行这些步骤,几乎没有错误”,以及“在某些情况下,尽管有专门的提示,ChatGPT 在执行各个步骤时还是会犯一些小错误。在许多情况下,这些错误源于大型语言模型在处理数学定理和代数表达式方面的固有弱点”。总之,与在其他专业领域类似,当下大语言模型在建模和求解鲁棒优化问题时可以作为参考,需要批判性使用。
原文的剩余部分内容为使用ChatGPT建模求解多阶段鲁棒优化模型的提示词和实例,以及用大语言模型建模求解RO和自适应RO的总体优势和局限性,剩余部分后续更新,敬请期待。
参考文献:
Bertsimas, D., & Margaritis, G. (2024). Robust and Adaptive Optimization under a Large Language Model Lens (No. arXiv:2501.00568). arXiv. https://doi.org/10.48550/arXiv.2501.00568