使用 Python Gekko 的全局最小值与局部最小值解决方案

2024-02-17

一个简单的优化示例有 2 个局部最小值(0,0,8)有目标的936.0 and (7,0,0)有目标的951.0。在 Python Gekko 中使用本地优化器的技术有哪些(APOPT,BPOPT,IPOPT)寻找全局解决方案?

from gekko import GEKKO
m = GEKKO(remote=False)
x = m.Array(m.Var,3,lb=0)
x1,x2,x3 = x
m.Minimize(1000-x1**2-2*x2**2-x3**2-x1*x2-x1*x3)
m.Equations([8*x1+14*x2+7*x3==56,
             x1**2+x2**2+x3**2>=25])
m.solve(disp=False)
res=[print(f'x{i+1}: {xi.value[0]}') for i,xi in enumerate(x)]
print(f'Objective: {m.options.objfcnval:.2f}')

这会产生局部最小值:

x1: 7.0
x2: 0.0
x3: 0.0
Objective: 951.00

有一些用于全局最优解的求解器,例如BARON, COCOS, GlobSol, ICOS, LGO, LINGO, and OQNLP,但是有哪些快速策略可以与局部优化器一起使用来搜索全局解决方案?一些工业应用具有高度非线性模型,这些模型尚未针对控制和设计方面的全局解决方案进行全面测试。该策略可以在 Python 中并行化吗?


多启动方法(使用随机起点)可能很有用。不能保证全局最优,但至少你可以免受一些令人尴尬的糟糕的本地解决方案的影响。一些本地 NLP 求解器具有此内置功能(例如 Knitro)。

以下是使用多启动方法获取全局解的示例的 Python 代码。它使用多线程来并行化搜索。

import numpy as np
import threading
import time, random
from gekko import GEKKO

class ThreadClass(threading.Thread):
    def __init__(self, id, xg):
        s = self
        s.id = id
        s.m = GEKKO(remote=False)
        s.xg = xg
        s.objective = float('NaN')

        # initialize variables
        s.m.x = s.m.Array(s.m.Var,3,lb=0)
        for i in range(3):
            s.m.x[i].value = xg[i]
        s.m.x1,s.m.x2,s.m.x3 = s.m.x

        # Equations
        s.m.Equation(8*s.m.x1+14*s.m.x2+7*s.m.x3==56)
        s.m.Equation(s.m.x1**2+s.m.x2**2+s.m.x3**2>=25)

        # Objective
        s.m.Minimize(1000-s.m.x1**2-2*s.m.x2**2-s.m.x3**2
                     -s.m.x1*s.m.x2-s.m.x1*s.m.x3)

        # Set solver option
        s.m.options.SOLVER = 1

        threading.Thread.__init__(s)

    def run(self):
        print('Running application ' + str(self.id) + '\n')
        self.m.solve(disp=False,debug=0) # solve
        # Retrieve objective if successful
        if (self.m.options.APPSTATUS==1):
            self.objective = self.m.options.objfcnval
        else:
            self.objective = float('NaN')
        self.m.cleanup()

# Optimize at mesh points
x1_ = np.arange(0.0, 10.0, 3.0)
x2_ = np.arange(0.0, 10.0, 3.0)
x3_ = np.arange(0.0, 10.0, 3.0)
x1,x2,x3 = np.meshgrid(x1_,x2_,x3_)

threads = [] # Array of threads

# Load applications
id = 0
for i in range(x1.shape[0]):
    for j in range(x1.shape[1]):
        for k in range(x1.shape[2]):
            xg = (x1[i,j,k],x2[i,j,k],x3[i,j,k])
            # Create new thread
            threads.append(ThreadClass(id, xg))
            # Increment ID
            id += 1

# Run applications simultaneously as multiple threads
# Max number of threads to run at once
max_threads = 8
for t in threads:
    while (threading.activeCount()>max_threads):
        # check for additional threads every 0.01 sec
        time.sleep(0.01)
    # start the thread
    t.start()

# Check for completion
mt = 10.0 # max time (sec)
it = 0.0  # time counter
st = 1.0  # sleep time (sec)
while (threading.active_count()>=3):
    time.sleep(st)
    it = it + st
    print('Active Threads: ' + str(threading.active_count()))
    # Terminate after max time
    if (it>=mt):
        break

# Initialize array for objective
obj = np.empty_like(x1)

# Retrieve objective results
id = 0
id_best = 0; obj_best = 1e10
for i in range(x1.shape[0]):
    for j in range(x1.shape[1]):
        for k in range(x1.shape[2]):
            obj[i,j,k] = threads[id].objective
            if obj[i,j,k]<obj_best:
                id_best = id
                obj_best = obj[i,j,k]
            id += 1

print(obj)
print(f'Best objective {obj_best}')
print(f'Solution {threads[id_best].m.x}')

它产生了全局解决方案:

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

使用 Python Gekko 的全局最小值与局部最小值解决方案 的相关文章

随机推荐

  • 在 Android 上滑动即可切换标签,例如 YouTube/Google Music 应用

    在最新版本的应用程序中 谷歌实现了一种非常酷的方式 可以在选项卡之间滑动而不是单击选项卡标题 我想知道是否有人对如何做到这一点有更具体的想法 以下是一些想法 欢迎批评 我最初的想法是这不是一个标准TabActivity举办儿童活动 事实上
  • 使用 ftrace 和 kprobes 捕获用户空间程序集(通过使用虚拟地址转换)?

    对于这篇较长的帖子表示歉意 我无法以较短的方式表述它 另外 也许这更适合 Unix Linux Stack Exchange 但我会首先在这里尝试 因为有一个ftrace tag 无论如何 我想观察用户程序的机器指令在完整的上下文中执行fu
  • 方法“[]”在 null 上调用。接收者:空

    为了隔离问题 我创建了一个新代码 一个新程序和一台新机器 相同的结果 它只是不想打印 quotes 之后且具有 anythingPrice 的任何值 我再次可以给您一个临时密钥 您可以完全运行代码 在你身边 请告诉我 import dart
  • AS3 中 onReleaseOutside 最简单的实现?

    我是 ActionScript 2 的长期用户 现在开始使用 ActionScript 3 我缺少的一件事是复制 AS2 MovieClip onReleaseOutside 功能的简单方法 几乎总是有必要实现这个事件 否则你会得到一些有趣
  • Http 请求仅在发布 Android APK 时失败

    我正在努力让我的应用程序在 Android APK 版本上运行 唯一失败的情况是生成和签名 apk 所有的http请求都不起作用 服务器在SSL下运行 我已经尝试过的所有场景 ionic serve gt 工作正常 ionic cordov
  • Gstreamer - Android 上的硬件加速视频解码

    我在 Android 手机上通过 RTP UDP 接收视频 但我发现 CPU 使用率非常高 几乎 100 的一个核心都用于解码视频 在高端设备上 视频播放几乎流畅 但在中低端设备上 我几乎每秒无法获得 1 帧 这是一个 H 264 视频流
  • WebApi 中的 Windows 任务计划程序或 TaskService 函数

    我想在 ASP NET Web API 中创建一些函数 这些函数应该每天在特定时间执行并执行特定任务 例如更新状态 记录 生成电子邮件 短信 我应该在代码中创建一个 TaskService using System using Micros
  • 为什么我的 unique_ptr 认为有一个空函数指针删除器? [复制]

    这个问题在这里已经有答案了 我正在尝试使用 C 学习 SDL 我创建了一个window h标头和一个window cpp用于存储 Window 类的源文件 在window h它看起来像这样 Class Window public Windo
  • 如何在 MongoDB 中对 $filter 结果进行 $slice ?

    我有一个具有以下格式的集合 id 123 items status inactive created ISODate 2016 03 16T10 39 28 321Z status active created ISODate 2016 0
  • 将 SVG 和 .JPG 合并为一张图像?

    我有一个在地图应用程序中使用 SVG VML 通过 Raphael JS 设置的网站 其中 SVG 用于在背景地图图像上显示图形 这在屏幕上非常有效 并且可以打印带有叠加层的硬拷贝地图 然而 当用户想要将带有 SVG 叠加层的地图图像保存到
  • 如何使用 ELKI 中的索引结构?

    这些是报价形式http elki dbs ifi lmu de http elki dbs ifi lmu de 本质上 我们将抽象距离查询绑定到数据库 然后对该距离进行最近邻搜索 此时 ELKI 将自动选择最合适的 kNN 查询类 如果我
  • 使用 VB.NET 连接到 socket.io

    我有一个在 Heroku 上运行的应用程序 它使用套接字 io http socket io 与客户沟通 到目前为止 所有客户端都是 HTML JS 所以效果很好 现在我想用 Visual Basic 编写一个客户端 但我找不到任何其他人编
  • 查看 Chrome 控制台是否打开

    我正在使用这个小脚本来查明 Firebug 是否打开 if window console window console firebug is open 而且效果很好 现在我搜索了半个小时 想找到一种方法来检测Google Chrome内置的
  • 装饰器运行错误:“UnboundLocalError:赋值前引用的局部变量‘count’”

    我在两个不同的装饰器中创建了两个变量 一个装饰器工作正常 但另一个显示错误 def running average func data total 0 count 0 def wrapper args kwargs print data v
  • 理解扩展 ElementAt(index)

    考虑这段代码 int size 100 1000 1000 var emu Enumerable Range 0 size var arr Enumerable Range 0 size ToArray 当我调用 emu ElementAt
  • Angular 2:设置和删除自定义管道?

    我创建了三个自定义管道来从服务器订购数据 ASC DESC 和默认 它们工作得很好 我希望这三个管道是否处于活动状态 具体取决于用户的交互 问题是 例如 是否可以使用变量更改自定义管道 这是我的代码
  • 如何在cpp宏中生成换行符?

    如何编写扩展以包含换行符的 cpp 宏 我正在开发一个大型项目 其中涉及大量预处理器宏函数来合成无法被模板替换的任何代码 相信我 我熟悉各种模板技巧 但是只要没有可以直接创建代码的标准化 类型安全的元编程语言 我们就必须坚持使用旧的预处理器
  • '4.5:语法错误:算术运算符无效(错误标记为“.5”)' - 但代码似乎仍然有效。为什么? [复制]

    这个问题在这里已经有答案了 当我尝试使用运算符 以及数字 4 5 和 2 时 我的计算器会生成标题中提到的错误 这 就像错误状态一样 很可能是由于 4 5 中小数点后面的内容造成的 但我不知道如何解决这个问题 也不知道为什么脚本实际上能够在
  • VS2015监视窗口不接受空条件语法

    请注意 它既不能在立即窗口中工作 也不能在设置条件断点时工作 谁能解释我做错了什么 EDIT 1 使用旧版 C 和 VB 表达式计算器未选中 然而 使用托管兼容模式已检查 但我记得打开它是为了解决 VS 2015 调试器中的错误 我需要更多
  • 使用 Python Gekko 的全局最小值与局部最小值解决方案

    一个简单的优化示例有 2 个局部最小值 0 0 8 有目标的936 0 and 7 0 0 有目标的951 0 在 Python Gekko 中使用本地优化器的技术有哪些 APOPT BPOPT IPOPT 寻找全局解决方案 from ge