簡體   English   中英

CPLEX C ++接口:如何獲取違反約束的索引?

[英]CPLEX C++ Interface: How to get the index of a violated constraint?

我嘗試使用C ++中的求解器IBM ILOG CPLEX求解整數線性程序(ILP)。 求解器指出問題是不可行的,並指出了違反約束的索引。 我的問題涉及C ++中此約束的識別和分析。

手動分析約束的方法是使用函數extractModel將問題導出到文本文件,然后在此文件中查找違反的約束。

最好,我想獲取C ++中違反約束的索引,並獲取有關此沖突的盡可能多的信息。

當前,我正在使用沖突優化程序,但沒有從中獲取任何有用的信息。 具體來說,我保留一個IloRangeArray ,其中包含我曾經添加到模型中的所有約束,為此數組調用refineConflict ,然后使用函數getConflict來(可能)查詢違反的約束。 結果是我曾經添加的所有約束都可能被違反,並且沒有任何約束被證明違反。

我如何訪問錯誤消息中報告的一個約束的索引,指出該問題不可行?

另外,我是否錯誤地使用了沖突優化程序? 例如,當我將約束的副本復制到單獨的數組中時,我做錯什么了嗎? (Cplex中某些類的復制構造函數和賦值運算符似乎具有我不理解的非標准行為。)

任何幫助表示贊賞。

我沒有嘗試使用沖突優化程序API。 可能應該研究一下……但是我在獨立的交互式CPLEX中大量使用了沖突改進器。 我不知道將約束的副本保存在自己的代碼中的任何問題-之前我已經在CPLEX&Concert with C ++中做到了。 這可能是沖突磨練者所做的事情的概念性誤解。

請記住,只有一個可識別的不可行約束非常罕見。 更為常見的是,存在不能一起滿足的一組約束,但是如果除去該組約束中的任何約束,則其余約束才是可行的。 通常將其稱為“不可約不可行集”。

以三個約束為例:

a >= b + 1
b >= c + 1
c >= a + 1

顯然,這三個約束不能同時滿足,但只要取走其中一個,其他兩個就可以了。 在某些情況下,很難確定哪個約束是錯誤的,並且實際上取決於對問題及其模型的更深入的了解。

無論如何,請嘗試將模型導出為LP,MPS或SAV格式文件,然后將其讀取到獨立的CPLEX優化器中。 然后對其進行優化-它也應該失敗,並報告為不可行。 然后運行沖突優化程序,然后顯示計算的(不可約)不可行集:

read fred.lp
optimize
conflict
display conflict all

我發現MPS文件更適合保留問題的全部精度,並且可能更易於與其他求解器一起嘗試,但是LP文件更易於閱讀。 SAV文件格式應該是CPLEX內存中最准確的副本,但是它非常不透明,並且特定於CPLEX。 如果您的問題顯然不可行,則使用LP格式可能會更好,但是如果問題不可行,您可能會從LP文件中得到不同的行為。 如果您也將所有變量都命名為廣告約束,則可能會對您有很大幫助。 也許只是在調試版本中進行命名,或者添加一個標志來控制是否進行其他命名。

暫無
暫無

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

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