L-shape 方法

L-shape 方法是求解两阶段随机规划的一种常用方法,基本思想是利用切平面将第二阶段的反馈函数线性化,在构造切平面条件时有点类似 bender’s 方法。

在这里插入图片描述
注:这个图形中黑实线 Q(x)\mathcal{Q}(x)Q(x) 就是下面模型中的 L(x)\mathscr{L}(x)L(x)

两阶段随机规划的模型可以表示为:

min⁡xcTx+L(x)s.t.Ax=bx≥0 \begin{aligned} &\min_x\quad &&c^Tx+\mathscr{L}(x)\\ &s.t.\\ &&&Ax=b\\ &&&x\geq 0 \end{aligned} xmins.t.cTx+L(x)Ax=bx0

其中,L(x)=E[Q(x,ξ(ω))]\mathscr{L}(x)=\mathbb{E}[Q(x, \xi(\omega))]L(x)=E[Q(x,ξ(ω))],被称作反馈函数 (recourse function),而 Q(x,ξ(ω))Q(x, \xi(\omega))Q(x,ξ(ω)) 为给定 xxxω\omegaω 时,第二段模型的最优值,即:

Q(x,ξ(ω))=min⁡yq(ω)Tys.t.T(ω)x+Wy=h(ω)y≥0 \begin{aligned} &&&Q(x, \xi(\omega))=\min_y q(\omega)^Ty\\ s.t.\\ &&&T(\omega)x+Wy=h(\omega)\\ &&&y\geq 0 \end{aligned} s.t.Q(x,ξ(ω))=yminq(ω)TyT(ω)x+Wy=h(ω)y0

模型中,xxx 为第一阶段的决策变量,必须在不确定性发生之前作出决定,yyy 为第二阶段的决策变量,在不确定性发生之后作出决定。ξ\xiξ 为随机变量,而 ω\omegaω 为随机变量的一个具体实现值,模型中的决策变量与随机变量都可以是向量形式。

上面第二个模型中,可以看出 WWWω\omegaω 无关,即第二阶段求解变量 yyy 的系数是一个确定值,并不是随机变量。此时,上面两个模型称作固定反馈 (fixed recourse) 的两阶段随机规划模型。因为固定反馈时,第二阶段模型 xxx 的可行域为一个闭凸集,这样就能使用很多方法求解了,否则第二阶段模型 xxx 的可行域不一定是闭凸集(为什么?目前还没搞清楚)。

假设随机变量 ξ\xiξ 具有有限个,即 KKK 个实现值(realization),每个实现值对应的概率为 pkp_kpk,则两阶段规划的扩展模型(extensive form)可以表示为:

min⁡xcTx+∑k=1KpkqkTyks.t.Ax=bTkx+Wyk=hk,k=1,…,K,x≥0,yk≥0,k=1,…,K. \begin{aligned} &\min_x\quad &&c^Tx+\sum_{k=1}^K p_kq_k^Ty_k\\ &s.t.\\ &&&Ax=b\\ &&&T_kx+Wy_k=h_k,\quad k=1,\dots, K,\\ &&&x\geq 0,y_k\geq 0,\quad k=1,\dots, K. \end{aligned} xmins.t.cTx+k=1KpkqkTykAx=bTkx+Wyk=hk,k=1,,K,x0,yk0,k=1,,K.

为什么叫 L-shaped 方法,是因为前两个约束条件左端的系数矩阵可以写成类似 L 的形式:

AT1WT2W⋮Tk……W \begin{aligned} &A\\ &T_1\quad W\\ &T_2\qquad W\\ &\vdots\\ &T_k\quad\dots\dots\qquad W \end{aligned} AT1WT2WTk……W

L-shape 方法的基本步骤是:

  • 给定第一阶段求解变量 xxx 的一个初始值,带入到第二阶段的模型进行求解
  • 若有可行解,根据第二阶段的对偶值,计算出最优性切平面约束(optimality cut)添加到第一阶段的模型中
  • 若无可行解,根据另外一个构造的线性规划模型(以后补充)求出可行性约束(feasibility cut)添加到第一阶段模型中
  • 求解第一阶段模型,返回第一步
  • 循环以上过程,直到达到一定的迭代终止条件

未完待续。。

### L-Shape算法代码实现 对于L-Shape算法,该算法通常用于特定的应用场景中,比如路径规划或是形状检测等领域。然而,在标准机器学习库或编程环境中并没有直接提供名为“L-Shape”的现成函数或类。因此,下面给出一种基于Python的简单模拟实现方式来构建所谓的"L-Shape"结构。 ```python import numpy as np import matplotlib.pyplot as plt def create_l_shape(width=5, height=10): """ 创建一个简单的L型矩阵表示法 参数: width (int): L形宽部分长度,默认为5. height (int): L形高部分长度,默认为10. 返回值: points (list of tuples): 表示L-shape的所有坐标点列表 """ # 定义水平线段上的点 horizontal_segment = [(i, 0) for i in range(width)] # 定义垂直线段上的点 vertical_segment = [(width - 1, j) for j in range(1, height + 1)] # 合并个片段形成完整的L-shape l_shape_points = horizontal_segment + vertical_segment return l_shape_points if __name__ == "__main__": # 设置图形大小参数 w, h = 7, 8 # 获取L-shape的数据集 data = create_l_shape(w, h) # 绘制图像展示结果 fig, ax = plt.subplots() xs, ys = zip(*data) ax.scatter(xs, ys) ax.set_aspect('equal') plt.xlim(-1, max(xs)+2) plt.ylim(-1, max(ys)+2) plt.grid(True) plt.show() ``` 这段程序定义了一个`create_l_shape()`函数用来生成指定宽度和高度下的L型几何体,并通过matplotlib可视化这些离散点的位置分布情况。需要注意的是这里的“L-Shape”并非指代任何已知的标准算法而是按照字面意思创建的一个二维平面上类似于字母‘L’形态的一组点集合[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心态与习惯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值