CPLEX出現(xiàn)'q1' is not convex力喷?

不知道大家在寫CPLEX的時候遇到過這個問題沒有足删?

image

其實有過經(jīng)驗的小伙伴都知道該怎么處理了眨层,但是小編決定還是寫一下避免剛?cè)胄械男』锇閭儾瓤印?/p>

這個錯誤呢查了ibm knowledge center顯示如下:

image

里面講了一堆想必大家也懶得去看了,我來講講這類問題的解決方案吧~出現(xiàn)這個錯誤的原因不是編程上的問題面哥,而是建模方式上的問題哎壳。簡單來說就是目標函數(shù)或者約束上出現(xiàn)了非線性的數(shù)學(xué)表達式。

那么什么是線性和非線性呢尚卫?我這里引一下百度知道上一個非常通俗易懂的解釋:

兩個變量之間的關(guān)系是一次函數(shù)關(guān)系的——圖象是直線归榕,這樣的兩個變量之間的關(guān)系就zhi是“線性關(guān)系”;如果不是一次函數(shù)關(guān)系的——圖象不是直線吱涉,就是“非線性關(guān)系”刹泄。比如說y=kx 就是線形的 而y=x^2就是非線形的線形的圖形一般是一條直線。


“非線性”的意思就是“所得非所望”怎爵。一個線性關(guān)系中的量是成比例的:十枚橘子的價錢是一枚的十倍特石。非線性意味著批發(fā)價格是不成比例的:一大箱橘子的價錢比一枚的價錢乘以橘子的個數(shù)要少。這里重要的觀念是“反饋”——折扣的大小反過來又影響顧客購買的數(shù)量鳖链。

也就是說你的模型中很可能出現(xiàn)了多個變量相乘的情況姆蘸,例如下面這種情景:

image

要解決這個問題,首先就得想你的模型給linearlized了芙委。而最常用的做法就是“大M”法了逞敷,通過增加一個充分大的數(shù),將多個相乘的變量給拆開灌侣,從而達到線性化的目的推捐。

不過像上圖那種情況就非常麻煩(其實是我建模建錯了),今天就先不討論侧啼。舉個簡單的例子牛柒,VRP的arc-flow模型中貨物流常見的約束如下:

image

其中Q_j^kx_{i,j}^k為決策變量堪簿,Q_j^k表示車輛k離開客戶j以后的載重量,而x_{i,j}^k為1表示車輛走過邊(i, j)焰络,否則為0戴甩。這條約束的含義是非常明了的,如果車輛經(jīng)過邊(i, j)闪彼,那么該車輛離開客戶j的載重量必須大于等于車輛離開客戶i的載重量加上客戶j的需求量甜孤,這是貨物流平衡。

可以看到不等式右邊出現(xiàn)了變量和變量相乘的情況畏腕,這就造成了我們剛剛說的“非線性”問題缴川,那么這個模型放進cplex中肯定會報“not convex”的錯誤。為了讓cplex能求解該模型描馅,我們需要將非線性的約束轉(zhuǎn)成線性的把夸。

常見的一個辦法是引入一個充分大的數(shù),我們都喜歡叫它大M铭污。當(dāng)然這個數(shù)具體要多大恋日,是不是越大越好,也不一定嘹狞,后面我再講岂膳。

先觀察約束(8)右端的式子,發(fā)現(xiàn)只有當(dāng)x_{i,j}^k為1時磅网,才需要Q_j^k \ge Q_i^k + q_i谈截,當(dāng)x_{i,j}^k為0時,Q_j^k就無所謂了涧偷。這是一個非常明顯的if else約束簸喂。因此可以考慮將x_{i,j}^k提取出來,和一個大M相乘:

Q_j^k \ge Q_i^k + q_j +M(x_{i,j}^k-1)

我們現(xiàn)在來檢驗上面這個約束含義是否和之前的保持一致燎潮。首先當(dāng)x_{i,j}^k為1時喻鳄,M(x_{i,j}^k-1)=0,約束變成Q_j^k \ge Q_i^k + q_j,這個沒問題确封。然后當(dāng)x_{i,j}^k為0時诽表,M(x_{i,j}^k-1)=-M,這個約束就被松弛掉了隅肥,也就是說Q_j^k取其定義域內(nèi)任意值都能滿足竿奏,也和之前的保持一致。

這樣腥放,我們就將兩個相乘的變量通過一個大M將其拆開了泛啸。將其他非線性約束改成非線性約束,就能放進CPLEX跑了秃症。當(dāng)然了候址,小編才疏學(xué)淺吕粹,目前只知道這種方法,不過已經(jīng)夠小編用了岗仑,就沒繼續(xù)往下深究匹耕。關(guān)于大M法將if else類的約束線性化,我這里貼一個知乎上的回答:

image

如果有多個變量相乘荠雕,那可能就得引入多個大M稳其。不過呢,到這里還沒有結(jié)束炸卑。下面我們聊聊關(guān)于大M的取值與CPLEX的精度可能造成的BUG既鞠。這種BUG是非常可怕的盖文,如果不了解這一點嘱蛋,可能要走很多很多彎路哦,而且書本上才不會告訴你這些五续。

還是下面這條式子:

Q_j^k \ge Q_i^k + q_j +M(x_{i,j}^k-1)

關(guān)鍵就在于CPLEX可能會存在精度損失洒敏,比如為0-1的決策變量有可能求解之后是這樣的:

image

也就是說當(dāng)x=0.9999999995343387或者當(dāng)x=1.0000000004656613,本應(yīng)該為0的M(x_{i,j}^k-1)此刻都不是0了疙驾。那么這就很有可能造成約束失效桐玻,從而使模型無法滿足所有約束。

不過注意荆萤,我上面說的是有可能造成約束失效,而非一定铣卡。x=0.9999999995343387x=1.0000000004656613链韭,它們和1相差的值都在小數(shù)點的后九位。也就是說當(dāng)M設(shè)置得足夠大的時候(比如10^{10})煮落,M(x_{i,j}^k-1)也會足夠大敞峭,大到影響約束原本的作用。而當(dāng)M不那么大的時候(比如10^{5})蝉仇,M(x_{i,j}^k-1)也是小數(shù)點后4位旋讹,對原約束可以認為是沒有影響的。

當(dāng)然這個沒有影響是相對于Q_j^kq_j而言轿衔,因為他們要求為整數(shù)并且大于等于0沉迹,就相當(dāng)于你有1000萬,那么丟幾塊錢對你來說除了有點小小的不爽以外害驹,基本上也是沒影響的鞭呕。

那么M取什么值比較合適呢,這就需要大家去做一個簡單的bound了宛官,簡單判斷下影響約束的一個upper bound或者lower bound葫松,只需要大致估算一個值即可瓦糕。比如上面那個貨物流平衡,可以取M = 2V_{cap}腋么,其中V_{cap}為車輛的容量咕娄。

好了,以上就是今天分享的內(nèi)容了珊擂∈ダ眨可以關(guān)注我們,不定時分享一下小編踩過的雷未玻,這樣你就不會在漫漫科研路上踩到相同的雷啦灾而。

image

來都來了,不點個再看嗎扳剿?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夭织,一起剝皮案震驚了整個濱河市踢步,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖磕诊,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乎串,居然都是意外死亡健霹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門辟狈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肠缔,“玉大人,你說我怎么就攤上這事哼转∶魑矗” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵壹蔓,是天一觀的道長趟妥。 經(jīng)常有香客問我,道長佣蓉,這世上最難降的妖魔是什么披摄? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮勇凭,結(jié)果婚禮上疚膊,老公的妹妹穿的比我還像新娘。我一直安慰自己虾标,他們只是感情好酿联,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般贞让。 火紅的嫁衣襯著肌膚如雪周崭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天喳张,我揣著相機與錄音续镇,去河邊找鬼。 笑死销部,一個胖子當(dāng)著我的面吹牛摸航,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舅桩,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼酱虎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了擂涛?” 一聲冷哼從身側(cè)響起读串,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撒妈,沒想到半個月后恢暖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡狰右,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年杰捂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棋蚌。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡嫁佳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谷暮,到底是詐尸還是另有隱情蒿往,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布坷备,位于F島的核電站,受9級特大地震影響情臭,放射性物質(zhì)發(fā)生泄漏省撑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一俯在、第九天 我趴在偏房一處隱蔽的房頂上張望竟秫。 院中可真熱鬧,春花似錦跷乐、人聲如沸肥败。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馒稍。三九已至皿哨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纽谒,已是汗流浹背证膨。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鼓黔,地道東北人央勒。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像澳化,于是被迫代替她去往敵國和親崔步。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容