如何在 python Gekko 中加速具有 1446 个变量的整数非线性规划?

2024-02-03

我正在解决一个整数非线性编程问题与蟒蛇壁虎,其中有 1446 个整数变量、31 个变量线性组合的约束以及 1 个要最大化的非线性目标。

该程序需要很长时间,我想知道是否可以speed up,以及如何更好地调整m.solver_options.

这是代码。(我只留下一些关于变量的注释,因为它们的计算依赖于一些外部数据文件。)

m = GEKKO()
m.options.SOLVER = 1  # APOPT is an MINLP solver
# optional solver settings with APOPT
m.solver_options = ['minlp_maximum_iterations 500',
                    'minlp_as_nlp 0',
                    'minlp_branch_method 1',
                    'minlp_integer_tol 0',
                    'nlp_maximum_iterations 50',
                    ]

# Constraint: sum of all weights <= 1
# e.g. weights = [0.04 * int_v1, 0.05 * int_v2, ..., 0.03 * int_v1446]
m.Equation(m.sum(weights) <= 1)

# Constraint: sum of weights on each cluster has an upper bound
# e.g. weights_per_cluster = {'1': [int_v2, int_v5, int_v8], '2': [int_v1, int_v4, int_v6], ..., '30': [int_v9, int_v12]}
for cluster in clusters:
    m.Equation(m.sum(weights_per_cluster[cluster]) <= 0.1)

mu_sig_raw = np.array(mu_sig_raw).transpose() # real value, shape (106, 1446)
mu = np.mean(mu_sig_raw, axis=0) # real value, shape (1446, 1)
sigma = np.cov(np.transpose(mu_sig_raw)) # real value, shape (1446, 1446)

k = len(mu)
# Objective: profit-rate mean-variance model
m.Maximize(
    (m.sum([mu[i] * weights[i] for i in range(k)]) - 0.03)
    /
    m.sqrt(m.sum([
            m.sum([sigma[i, j] * weights[i] * weights[j] for j in range(k)])
            for i in range(k)
    ]))
)

m.solve(disp=True)

由于自由度较高(# 变量 >> # 方程)或许多整数变量,APOPT 求解器可能会很慢。一种策略是使用 IPOPT 求解器进行初始化,然后切换到 APOPT 以获得整数解。

m.options.SOLVER=3 # IPOPT
m.solve()

m.options.SOLVER=1 # APOPT
m.solve()

另一件有用的事情是将不等式重新定义为变量并为该变量设置上限。

for cluster in clusters:
    m.Equation(m.sum(weights_per_cluster[cluster]) <= 0.1)

变换为:

v = []
for cluster in clusters:
    v.append(m.Var(ub=0.1))
    m.Equation(m.sum(weights_per_cluster[cluster]) == v[-1])

您可能还想进一步调整求解器选项。 APOPT 求解器有许多可用于调整求解器性能的选项。下面列出了一些可用选项和默认值:

  • minlp_maximum_iterations 10000- 分支定界法的 nlp 解决方案的最大数量。如果达到最大迭代次数有整数解,则返回成功解。否则,该解决方案不被认为是成功的,并且会返回一条错误消息以及失败的解决方案。
  • minlp_max_iter_with_int_sol 500- 找到候选整数解时,nlp 解的最大数量
  • minlp_as_nlp 1- 将 minlp 问题作为连续 nlp 问题求解,忽略整数约束
  • minlp_branch_method 3- 1=深度优先(更快地找到整数解),2=宽度优先,3=最低目标叶,4=最高目标叶
  • minlp_gap_tol 1.0e-2- 间隙是最低候选叶(obj_r=非整数解)和最佳整数解(obj_i)之间的分布。当间隙低于 minlp_gap_tol 时,返回最佳整数解。间隙定义为间隙=(obj_i-obj_r)/max((abs(obj_i)+abs(obj_r))/2,1)。
  • minlp_integer_tol 1.0e-2- 候选解变量可以偏离整数解但仍被视为整数的量。
  • minlp_integer_max 2.0e9- 被视为整数的最大值。由于用于存储整数的位数,超过 2147483647 或低于 -2147483648 的值无法使用内部整数变量类型正确存储。
  • minlp_integer_leaves 1- 添加额外的整数叶子,0=关闭,1=分支上具有不等式的整数叶子,2=分支上具有相等约束的整数叶子。
  • minlp_print_level 1- 打印级别(0-10)。开发版本具有额外的高级诊断功能。
  • nlp_maximum_iterations 500- 每个 nlp 子问题的最大迭代次数。减少 nlp 最大迭代次数可以提高求解速度,因为在可能不收敛的候选解上花费的计算时间更少
  • Objective_Convergence_Tolerance 1.0e-6- 目标函数的收敛容差。低于 1.0e-10 的值有时会因数值缩放而遇到覆盖问题,无法达到所要求的精度。
  • 约束收敛容差 1.0e-6- 约束的收敛容差。较低的收敛容差通常只会向解决方案添加几次额外的迭代,但解决方案也不会发生显着变化。

如果找到整数解,则minlp_gap_tol如果整数解的间隙足够小,可能有助于缩短求解时间。由于未发布完整的脚本,因此我们无法测试任何建议的改进。请考虑发布完整的脚本以供将来的问题使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 python Gekko 中加速具有 1446 个变量的整数非线性规划? 的相关文章

  • 使用单个文件的 Python 日志记录(函数名、文件名、行号)

    我正在尝试了解应用程序的工作原理 为此 我将调试命令插入作为每个函数主体的第一行 目的是记录函数的名称以及向日志输出发送消息的行号 代码内 最后 由于这个应用程序由许多文件组成 我想创建一个日志文件 以便我可以更好地理解应用程序的控制流 这
  • 为什么 pandas 在简单的数学运算上比 numpy 更快?

    最近 我观察到 pandas 的乘法速度更快 我在下面的例子中向您展示了这一点 如此简单的操作怎么可能做到这一点 这怎么可能呢 pandas 数据帧中的底层数据容器是 numpy 数组 测量 我使用形状为 10k 10k 的数组 数据框 i
  • 如何在 QTableView 标题中单击鼠标右键单击上下文菜单?

    下面的示例代码 很大程度上受到here http www saltycrane com blog 2007 12 pyqt 43 qtableview qabstracttablemodel 有一个右键单击上下文菜单 当用户单击表中的单元格
  • 区分大小写的实体识别

    我的关键字全部以小写形式存储 例如 折扣耐克鞋 我正在尝试对其执行实体提取 我遇到的问题是 spaCy 在 NER 方面似乎区分大小写 请注意 我不认为这是 spaCy 特有的 当我跑步时 doc nlp u i love nike sho
  • Python设置1和True的解释

    在 IPython 3 交互式 shell 中 In 53 set2 1 2 True hello In 54 len set2 Out 54 3 In 55 set2 Out 55 hello True 2 是因为 1 和 True 得到
  • 如何使用 python、openCV 计算图像中的行数

    我想数纸张 所以我正在考虑使用线条检测 我尝试过一些方法 例如Canny HoughLines and FLD 但我只得到处理过的照片 我不知道如何计算 有一些小线段就是我们想要的线 我用过len lines or len contours
  • Python函数组成

    我尝试使用良好的语法来实现函数组合 这就是我所得到的 from functools import partial class compfunc partial def lshift self y f lambda args kwargs s
  • 在 PhotoImage 下调整图像大小

    我需要调整图像大小 但我想避免使用 PIL 因为我无法使其在 OS X 下工作 不要问我为什么 无论如何 因为我对 gif pgm ppm 感到满意 所以 PhotoImage 类对我来说没问题 photoImg PhotoImage fi
  • 烧瓶 - 404 未找到

    我是烧瓶开发的新手 这是我在烧瓶中的第一个程序 但它向我显示了这个错误 在服务器上找不到请求的 URL 如果您输入了网址 请手动检查拼写并重试 这是我的代码 from flask import Flask app Flask name ap
  • Django Web 应用程序中的 SMTP 问题

    我被要求向使用 Django Python 框架实现的现有程序添加一个功能 此功能将允许用户单击一个按钮 该按钮将显示一个小对话框 表单以输入值 我确实编写了一些代码 显示电子邮件已发送的消息 但实际上 它没有发送 My code from
  • 如何将 Pyspark Dataframe 标题设置到另一行?

    我有一个如下所示的数据框 col1 col2 col3 id name val 1 a01 X 2 a02 Y 我需要从中创建一个新的数据框 使用 row 1 作为新的列标题并忽略或删除 col1 col2 等行 新表应如下所示 id na
  • 同一台机器上有多个Python版本?

    Python 网站上是否有关于如何在 Linux 上的同一台计算机上安装和运行多个版本的 Python 的官方文档 我可以找到无数的博客文章和答案 但我想知道是否有 标准 官方方法可以做到这一点 或者这一切都取决于操作系统 我认为它是完全独
  • Jupyter笔记本突然变得很慢

    我以前在anaconda环境下运行jupyter运行得很好 显示警告后 IOPub data rate exceeded The notebook server will temporarily stop sending output to
  • 如何全局安装 Python(开发)依赖项,以便我不必在每个 venv 中重新安装它们?

    我希望在为每个项目创建的每个 venv 虚拟环境 中都可以使用一些 Python 依赖项 例如 black flake8 和 pytest 这可能吗 如果可以 如何实现 我想安装这三个once在我的主要 Python 安装下 我必须在启动新
  • Python 或 C 语言中的 Matlab / Octave bwdist()

    有谁知道 Matlab Octave bwdist 函数的 Python 替代品 此函数返回给定矩阵的每个单元格到最近的非零单元格的欧几里得距离 我看到了一个 Octave C 实现 一个纯 Matlab 实现 我想知道是否有人必须用 AN
  • 重定向 python 交互式帮助()

    我正在为使用 Qt 的应用程序开发交互式 python shell 但是我似乎无法获得重定向的交互式帮助 我的 python 代码中有这个 class OutputCatcher def init self self data def wr
  • 如何使用logging.conf文件使用RotatingFileHandler将所有内容记录到文件中?

    我正在尝试使用RotatingHandler用于 Python 中的日志记录目的 我将备份文件保留为 500 个 这意味着我猜它将创建最多 500 个文件 并且我设置的大小是 2000 字节 不确定建议的大小限制是多少 如果我运行下面的代码
  • 避免“散点/点/蜂群”图中的数据点重叠

    使用绘制点图时matplotlib 我想偏移重叠的数据点以使它们全部可见 例如 如果我有 CategoryA 0 0 3 0 5 CategoryB 5 10 5 5 10 我想要每一个CategoryA 0 数据点并排设置 而不是彼此重叠
  • 使用 Numpy 进行多维批量图像卷积

    在图像处理和分类网络中 一个常见的任务是输入图像与一些固定滤波器的卷积或互相关 例如 在卷积神经网络 CNN 中 这是一种极其常见的操作 我已将通用版本任务减少为 Given 一批 N 个图像 N H W D 和一组 K 个滤镜 K H W
  • PYTHON:从 txt 文件中删除 POS 标签

    我有以下 txt 文件 其中包含 POS 词性 http en wikipedia org wiki Part of speech tagging 每个单词的标签 不用 jj到 说 vb 我 ppss是 bedz愤怒 jj在 在 dt无与伦

随机推荐