当前位置: 首页 > 知识库问答 >
问题:

DOCPLEX MIP暖机启动

马俊
2023-03-14

我正在尝试解决一个大型MIP调度问题。因为解决这个问题需要很长时间,所以我想用更少的事件点运行同一个模型,并找到它的第n个解决方案。将该解决方案用作更大(更多事件点)模型的初始解决方案/种子,以找到其第n个解决方案,并使用该解决方案级联到所需数量的事件点。

使用这个小问题的解决方案,我在mip start中使用它的二进制值,并让新添加的事件点不被触及。我将这些值保存在一个名为seed_sol的字典中,其中键是二进制变量(创建变量时获取),值是上一次求解的0/1。

m.add_mip_start解决方案(m,seed_sol)

使用上面的代码,我可以开始更大的跑步。然而,当我查看输出日志时,我意识到解决方案很少有改进,而且差距非常小(我知道实际的最佳解决方案要高得多)。我怀疑“add_mip_start”函数会强制将解决方案值添加到我的初始种子解决方案中,并尝试仅通过调整新添加的二进制变量来改进解决方案。

我如何解决这个问题,以获得预期的结果?

使用:

  • Python 3.6。8
  • cplex 12.10。0.0
  • docplex 2.19。202

共有2个答案

巫煌
2023-03-14

MIP开始用作起点,但其开始值可能会在搜索中更改,而不是固定开始,其中固定值被视为硬约束。顺便说一句,还可以实现具有约束的固定启动,这有助于添加或删除这些固定启动。

然而,MIP start的兴趣在于初始解决方案的质量。在您的情况下,初始解决方案似乎比大问题小得多,因此可能没有多大帮助。

要评估MIP性能问题,您是否可以指出问题的大小(由Model.print_information())打印)以及CPLEX日志(至少是CPLEX暂停的部分)

汝才良
2023-03-14

warmstart提供了一个起点,但不会减少搜索空间。

例如https://github.com/AlexFleischerParis/zoodocplex/blob/master/zoowarmstartapi.py:

from docplex.mp.model import Model

mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.minimize(nbbus40*500 + nbbus30*400)

warmstart=mdl.new_solution()
warmstart.add_var_value(nbbus40,8)
warmstart.add_var_value(nbbus30,0)
mdl.add_mip_start(warmstart)


sol=mdl.solve(log_output=True)

for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value)

你可以尝试的是固定启动

来自https://github.com/AlexFleischerParis/zoodocplex/blob/master/zoofixedstart.py

from docplex.mp.model import Model

mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.minimize(nbbus40*500 + nbbus30*400)

#Fixed start nbBus40 should be 5
nbbus40.lb=5
nbbus40.ub=5

mdl.solve()


for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value)
 类似资料:
  • 我正在阅读Solr In Action这本书,对变暖搜索者有点困惑。有人提到 如果正在进行提交,Solr允许陈旧读取,并且在新搜索器预热之前不会关闭当前搜索器。 但之后的一些声明解释了useColdSearcher useColdSearcher=false表示在所有预热查询完成之前,所有对solr的操作都将被阻止 useColdSearcher=true意味着新的搜索器在预热查询完成执行之前就已

  • linux系统下workerman如何开机自动启动 打开/etc/rc.local,在exit 0前添加类似以下代码 ulimit -HSn 102400 /usr/bin/env php /磁盘/路径/start.php start -d exit 0

  • 计算机开机是一个神秘的过程。我们只是按了开机键,就看到屏幕上的进度条或者一行行的输出,直到我们到达登录界面。然而,计算机开机又是个异常脆弱的过程,我们满心期望的登录界面可能并不会出现,而是一个命令行或者错误信息。了解计算机开机过程有助于我们修复开机可能出现的问题。 最初始阶段 当我们打开计算机电源,计算机会自动从主板的BIOS(Basic Input/Output System)读取其中所存储的程

  • 在spring boot中有没有一种方法可以控制App的优雅关机。 我知道在bean中可以使用@predestroy方法,但如何控制调用这些@predestroy方法的顺序。 您可以有多个相互依赖的bean,上下文的关闭是否已经寻找这种依赖关系并以正确的顺序调用@predestroy方法? 2.)阻止rabbit消息侦听器接受新消息 3.)等待关机前已经开始但尚未完成的所有处理。

  • 当我尝试使用start-slave.sh连接到主服务器时,spark://master:port如这里所述 我正在得到这个错误日志 我尝试使用本地ip和本地名称访问主服务器(我设法同时使用和不使用密码ssh到主服务器、用户和root用户) 谢了!

  • 直到最近,我的Discord机器人一直工作得很好,我没有对代码做任何更改,它与工作时处于相同的状态。但是出于某种原因,现在当我尝试通过控制台启动bot时(在我的情况下): 节点my-discord-bot.js 它什么也不做,没有错误,只是空白,我应该收到一个确认,说‘准备好了!’我的机器人应该上线,但这一切都不会发生。 下面是我用来启动我的bot(直到最近才开始工作)的代码: 我真的不知道问题出