簡體   English   中英

如何增加 Cplex 解決方案的數量?

[英]How to increase number of Cplex solutions?

我有這個cplex 模型,它有 1 個二進制變量 (x_i)。 現在我有 2 個關於其復雜解決方案的問題(我把它們放在一篇文章中,因為它們是相關的)。

第一:對於我的模型,我得到 26 個解決方案,但我知道實際上還有更多解決方案。如何在 cplex 中生成解決方案? 有什么辦法可以增加解的數量?

第二:我想使用解決方案池訪問所有解決方案,但是當我嘗試打印所有解決方案時,它會打印所有現有變量(顯然我只需要等於 1 的變量)及其值。

這是我的解決方案池代碼:

def generate_soln_pool(mdl):      
    cpx = mdl.get_cplex()
    cpx.solnpoolintensity=4
    cpx.solnpoolagap=0
    cpx.populatelim=100000
    try:
        cpx.populate_solution_pool()
    except CplexSolverError:
        print("Exception raised during populate")
        return []
    numsol = cpx.solution.pool.get_num()
    print(numsol)
    nb_vars = mdl.number_of_variables
    sol_pool = []
    for i in range(numsol):

        x_i = cpx.solution.pool.get_values(i)
        assert len(x_i) == nb_vars
        sol = mdl.new_solution()
        for k in range(nb_vars):
            vk = mdl.get_var_by_index(k)
            sol.add_var_value(vk, x_i[k])
        sol_pool.append(sol)
    return sol_pool

bm=CModel()
pool = generate_soln_pool(bm)
for s, sol in enumerate(pool,start=1):
        print(" this is solution #{0} of the pool".format(s))
        sol.display()

這是我輸出的一部分:

x_0 = 0
x_1 = 0
x_2 = 0
x_3 = 0
x_4 = 0
x_5 = 0
x_6 = 0
x_7 = 0
x_8 = 0
x_9 = 0
x_10= 0
x_11 = 1
x_12 = 0
x_13 = 0
.
.
.

我猜您從文檔中的示例中獲取了參數設置? 這些參數將使 CPLEX 枚舉所有最優解。 如果您想要所有解決方案,您必須將解決方案池差距設置為一個非常大的值。

CPLEX 有多種生成解的方法,但大致遵循啟發式增強的標准分支定界方案。

當然,一個解決方案對每個變量都有一個值。 如果您只需要某些變量,那么您可以使用 Python 提供的各種過濾和理解類型。 例如,要獲取解決方案中為 1 的二進制變量的索引,您可以這樣做:

indices = [j for j, a in enumerate(cpx.solution.pool.get_values(i)) if a > 0.5]

編輯:在查看並運行代碼后,我們發現了問題所在:

  1. 代碼只設置了絕對間隙參數,還應該設置相對間隙參數。

  2. 代碼設置參數,如cpx.solnpoolintensity = 4 這不是設置參數的正確方法。 該語句只會在對象中創建一個被其余代碼忽略的新屬性。

為枚舉(最多)4000 個解決方案設置參數的正確方法是

cpx.parameters.mip.pool.intensity.set(4)
cpx.parameters.mip.pool.absgap.set(1e75)
cpx.parameters.mip.pool.relgap.set(1e75)
cpx.parameters.mip.limits.populate.set(4000)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM