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

线性编程:在PYTHON中使用DocPlex生成的所有解决方案列表(cplex解决方案池失败)?

申高峯
2023-03-14

在解决问题的过程中,我实际上面临着一个问题。我的问题是一个线性规划问题,具有食物饮食优化和成本最小化。因为这个问题和这个类似(https://ibmdecisionoptimization.github.io/docplex-doc/mp/diet.html),我已经在Python中安装了docplex来解决这个问题,它可以正常工作!问题是我需要获得所有可行的解决方案并将其输出。但是IBM的例子只让我能够访问最好的解决方案。因此,我添加了解决方案池功能以访问所有解决方案:

def soln_pool(mdl):
    cpx = mdl.get_cplex()
    cpx.populate_solution_pool()
    numsol = cpx.solution.pool.get_num()
    print("The solution pool contains %d solutions." % numsol)

    sol_pool = []

    for i in range(numsol):
        x_i = cpx.solution.pool.get_values(i)
        nb_vars = len(x_i)
        sol = []
        for k in range(nb_vars):
            sol.append(x_i[k])
        sol_pool.append(sol)
    results=sol_pool
    return(results)

results=soln_pool(mdl)

for k,solution in enumerate(results):
    label=data.index
matrix_results=pd.DataFrame()

for k,solution in enumerate(results):
    matrix_results[str(k)]=solution
matrix_results.index=data.index

唯一的问题是,这种方法给了我大约30个解决方案时,应该是可用的。我假设这是因为解决方案池的数量限制在30个左右。因此,我更改了参数,用IBM网站上描述的更多解决方案填充我的解决方案池(https://www.ibm.com/docs/en/icos/12.9.0?topic=solutions-如何枚举全部)和其他一些页面(如何增加Cplex解决方案的数量?)

def soln_pool(mdl):
    cpx = mdl.get_cplex()
    
    cpx.parameters.mip.pool.intensity.set(4)
    cpx.parameters.mip.pool.absgap.set(0.0)
    cpx.parameters.mip.limits.populate.set(2 000 000)   
    cpx.populate_solution_pool()
    numsol = cpx.solution.pool.get_num()
    print("The solution pool contains %d solutions." % numsol)

    sol_pool = []

    for i in range(numsol):
        x_i = cpx.solution.pool.get_values(i)
        nb_vars = len(x_i)
        sol = []
        for k in range(nb_vars):
            sol.append(x_i[k])
        sol_pool.append(sol)
    results=sol_pool
    return(results)

results=soln_pool(mdl)

for k,solution in enumerate(results):
    label=data.index
matrix_results=pd.DataFrame()

for k,solution in enumerate(results):
    matrix_results[str(k)]=solution
matrix_results.index=data.index


with pd.ExcelWriter('Results.xlsx') as writer:
    data.to_excel(writer, sheet_name='Data')
    matrix_results.to_excel(writer, sheet_name='Solutions')

但是有了这个,我就更没有办法了!(只有一个)。我想我的错误来自以下部分:

for k in range(nb_vars):
    sol.append(x_i[k])
sol_pool.append(sol)

但不幸的是,我找不到在哪里。提前感谢您的帮助。

共有1个答案

高德水
2023-03-14

“填充解决方案池”功能并不意味着生成所有可能的解决方案,而只是生成一些备选(非最佳)解决方案。看见https://www.ibm.com/docs/en/icos/20.1.0?topic=pool-什么是填充解决方案以获取更多详细信息。不幸的是,Cplex无法列举MIP问题的所有可行解。CPLEX是用来寻找最优解的。相反,您应该考虑使用基于约束的编程(DOCPLIEX.CP)来实现这一目的。

此外,您提到了安装Docplex,但您的示例基于基于Cplex矩阵的API。自版本2.16以来,Docplex支持填充功能,请在Docplex留档中搜索填充

http://ibmdecisionoptimization.github.io/docplex-doc/mp/docplex.mp.model.html

 类似资料:
  • 我想知道如何在Python CPLEX API中使用MIP回调来记录可行的解决方案。目前我的cplex模型可以运行10个小时,看起来客观值一点也没有提高,但是我不能中途停下来,因为数据会丢失,所以我想知道如何在MILP问题中使用回调来记录可行的解决方案 编辑:我没有用docplex,我用的是cplex

  • 1px 方案在 VUX 组件内应用广泛,包括 Grid, ButtonTab, XTable, XButton, Cell 等等。 利用 Flexbox + 1px 你可以实现复杂的宫格布局。 引入 在你项目的App.vue引入,组件内不需要再重复引入。 <style lang="less"> @import '~vux/src/styles/1px.less'; </style> 可用类名:

  • 问题内容: 我正在尝试编写一种算法,以Java或Javascript创建合法的Sudoku板。两者都不起作用,我也不完全清楚为什么。 本质上,两个程序中的问题是x或y的增量都超过了其应有的幅度(跳过平方)。我一生无法弄清楚这是怎么发生的。如果需要,我可以提供完成JS解决方案的HTML。 我最好的猜测是它与我如何使用递归创建堆栈有关,但是据我所知,它 应该可以 工作。在我的旧代码中,有一个不正确的f

  • 本文向大家介绍Python修改列表值问题解决方案,包括了Python修改列表值问题解决方案的使用技巧和注意事项,需要的朋友参考一下 由于惯性思维,导致使用for循环修改列表中的值出现问题 首次尝试: 运行结果 显然列表中的值并没有改变。 思考:for语句定义一个变量进行遍历,但只是访问当前值。操作列表中的值正确方法是使用下标。 修改后: 运行结果 以上就是本文的全部内容,希望对大家的学习有所帮助,

  • 本文向大家介绍python os.listdir()乱码解决方案,包括了python os.listdir()乱码解决方案的使用技巧和注意事项,需要的朋友参考一下 计算机一般来说是需要定期的清理,系统的内存不能无限延伸,同时有一些不需要的文件也可以得以清除掉。有些人会使用os.remove来进行文件的清楚,从而导致一些错误的出现,可以说这是对于os.remove的用法还没有熟练掌握。下面我们就os

  • 当我们基本完成程序的设计,我们就可以编写代码了,它是对我们的解决方案的实施。 版本一 例10.1 备份脚本——版本一 #!/usr/bin/python # Filename: backup_ver1.py importos importtime # 1. The files and directories to be backed up are specified in a list. sour