在一些难以找到初始可行点的线性规划中,单纯形法在其第一阶段算法中会失败。但是我们可以通过遗传算法等其他方法找到这样一个可行点:问题是这样的解决方案可能对某个坐标有很多小数的“噪声”。我们想使用单纯形来完成这样一个可以消除这些噪音的解决方案。但是单纯形法不会使用用户提供的 x0。有一种建议的线性转换方法来改变原始问题,使 0 成为原始 x0 并规避单纯形的限制:https ://scicomp.stackexchange.com/a/7699/4584. 这种方法需要额外的工作来重新格式化问题。有没有更简单的解决方法,比如修改simplexphaseone的几行代码,直接使用x0?
如何使用用户提供的可行初始点使线性规划单纯形法
我不明白你是怎么回答这个问题的,因为单纯形算法的第 1 阶段是专门为找到原始问题的可行点而设计的,第 2 阶段可以从该点开始。无需使用遗传算法或类似算法来找到更好的起点。
但除此之外,您的问题非常具体到您似乎正在使用的一种特定实现,但您什么也没告诉我们。显然,如果您自己实现单纯形法,很容易跳过阶段 1 并从某个地方开始阶段 2。这是你的代码,你可以随心所欲地实现它。但是,如果它不是您自己编写的代码,您通常无法从第 2 阶段开始。在这种情况下,最简单的选择当然是按原样使用它,即包括第 1 阶段,因为第 1 阶段保证给你一个起点。如果第一阶段失败,您需要向我们解释
- 你正在使用什么实现
- 第一阶段如何失败
- 错误消息意味着您从代码中得到什么。
可能是您的阶段 1 失败了,因为您的线性程序中没有可行的点,因此找不到阶段 2 的起点。当然,在这种情况下,您将无法通过使用不同的方法为阶段 2 选择起点来纠正这种情况。
如果用户为单纯形提供了一个基本可行的解决方案,我不明白为什么不能直接从第 2 阶段单纯形开始。(实际上,结合内点法和单纯形法的求解器通过使用“交叉”从当前内点迭代中找到基本可行解,从内点法过渡到单纯形法。)
也就是说,沃尔夫冈是绝对正确的:第一阶段要么找到问题的基本可行解决方案,要么失败,在这种情况下你的线性程序是不可行的。
可能是您的意思是第一阶段花费的时间太长,在这种情况下,我建议使用内点法。事实上,如果你找到任何可行的解决方案,你可以把它作为一个内点方法的起点,而单纯形只能使用基本可行的解决方案。如果不使用交叉程序之类的东西,我不会使用遗传算法来生成基本可行的解决方案。我什至不确定我是否会使用遗传算法来生成可行的解决方案,除非我必须这样做;求解线性规划的技术非常成熟,即使对于包含数百万到数千万个决策变量的问题,除非您的问题明显大于此,否则很难理解为什么要使用替代方法来寻找可行的方法解决方案,因为再次:
- 单纯形法和内点法都具有计算有效初始点的稳健初始化程序
- 单纯形法需要一个基本的可行解
- 内点法只需要一个可行的解决方案
作为替代方案,我们没有修改simplexphaseone,而是修改了GA-MPC的维修操作员的一些地方,以便它可以自行完成解决方案并摆脱那些“噪音”。在我们的 TVaR 约束优化问题测试用例中,它可以得到与 linprog 线性化解一样精确的解,但运行时间比 linprog 少 60%。