【问题标题】:Optimization algorithm for single objective, mixed integer, constrained programming?单目标、混合整数、约束规划的优化算法?
【发布时间】:2015-05-11 17:29:35
【问题描述】:

我有一个优化问题,解析或数值求解器很难解决,因为我无法为其提供导数。因此,我正在寻找使用启发式或遗传算法的解决方案。

我的问题包括以下内容:

  • 单一目标
  • 规模大,但应用程序。少于 10.000 个变量
  • 混合整数 (MIP)(变量主要是小数,少数是布尔/整数变量)
  • 受约束(变量边界约束、等式和不等式约束,app. 与变量的数量相同)

所以我的问题是:

  1. 是否有论文将启发式/遗传算法中的所有点都考虑在内(尤其是混合整数规划)?

  2. 有没有在启发式/遗传算法中实现混合整数规划的好方法?

  3. 如何以最佳方式处理启发式/遗传算法中的等式约束?

  4. 是否有任何(开源)库有希望?


到目前为止,我在MOEA-Framework 中使用算法类型NSGAII(及其一些派生词)或普通愚蠢的随机数生成器实现的问题是,当使用等式约束或MIP 问题,GA 没有找到解决方案,即使在允许大量世代和大量人口规模来解决一个非常小的问题时也是如此。

【问题讨论】:

  • AFAIK,十进制变量不是整数......你的目标函数是什么样的?
  • 是的,十进制(或浮点数)!= 整数。我以为MIP会结合十进制和整数变量的优化,也许我在这里错了?目标函数是不可预测的、非线性的、客户定义的子函数($$\rightarrow x \in \mathbb R$$)和一些(布尔)决策变量(也可以解释为整数变量,其可能值为0/1)。
  • 呃,MathJax 似乎在这里不起作用。目标函数由实数集中的变量组成。
  • 我在OptaPlanner 中有一个包含 50 000 个变量的数据集(MachineReassignment 数据集 B10),可以很好地解决延迟接受(一种本地搜索形式)。您可能想尝试 LA 或其他 LS 变体。
  • “所有变量的总和必须与预定义的总和相匹配”-> 自定义移动可能会有很大帮助:/ 在未来的版本中,我将添加对定量变量及其移动的更多支持。

标签: mathematical-optimization genetic-algorithm nonlinear-optimization


【解决方案1】:

你尝试过 sciPy/numPy 吗?它有一个执行模拟退火的命令。您唯一必须做的就是将约束转换为差异并将它们与目标函数相加。 看看这个:

最小 Z=x1^2+x2^2

受制于:

x1+x2>=2

这是我的python代码:

#import modules
import numpy as np
from scipy import optimize

#define Constraint 1
def diffC1(x1,x2):
    return max(x1+x2-2,0)

#penalization value
M=10000.

#define your objective function (with Constraint 1 inserted)
def f(X):
    x1,x2=X
    print x1,x2
    return x1**2+x2**2+M*(diffC1(x1,x2))
#initialize x1=2 and x2=2
X0=np.array([2., 2.])

#try your function
f(X0)

#solve!
np.random.seed(555)   # Seeded to allow replication.
res = optimize.anneal(f, X0, schedule="boltzmann",
                          full_output=True, maxiter=10000,
                           dwell=250, disp=True)

#evaluate your achieved objective function value
f(res[0])

【讨论】:

  • 谢谢!我目前正在寻找一种能够解决更多类型的数学问题(比如你的)而不是现实世界的问题(比如 OptaPlanner)的算法。 @GeoffreyDeSmet 和他的 OptaPlanner 在这方面给了我一个很好的开端,延迟验收 (LAHC) 似乎非常合适。但是,我目前正在努力解决此类启发式算法中决策变量的一般表示(因此 MIP 发挥作用)。
  • 我明白了。好吧,正如您在这个模拟退火中看到的那样,目标函数可以采取任何形式的限制。如果某些变量是整数,您可以尝试像这样将差异最小化:假设在某些迭代中“x1=4.75”、“Decimal Part=x1-math.ceil(x1)”,其中 Ceil 是一个仅采用整数部分的函数x1。然后像以前一样最小化小数部分作为目标函数的一部分。
  • 另一方面,我建议使用遗传算法将 x1 的搜索空间表示为仅整数(以及其他变量,无论它们是什么)。我目前正在开发一个面向数学编程的 GeneAlg 包,如果您有兴趣,请告诉我:)。
  • 我对你的方法很感兴趣,我真的很想看看你的库:)
  • 太棒了!一旦我完成“从头开始”,我会给你 github 链接:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 2013-12-24
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
相关资源
最近更新 更多