BZOJ1061 單純形法的初探

2021-07-10 22:13:50 字數 2283 閱讀 5826

起因是一道timus的題目 , 長著一副經典的線性規劃的模樣: ax

≥b求m

in(c

x)然而我嘗試去網路流建模 , 無果。 當時我就考慮 , 為什麼乙個明顯的線性規劃問題要用網路流去擬合呢? 為什麼不就用該用的方法去做呢? 於是我決定學學單純形法。

單純形法本身並不難理解 , 只是有很多名詞可能讓剛開始看的小夥伴有點為難。這裡推薦一篇**入門非常不錯。 看到pa

ge12 就可以啦。然後讓我們來看看一道很經典的網路流建圖的難題:

bzoj 1061 志願者招募

這裡設志願者數量的向量為

x , 每天需要人數的向量為

y, 目標最小值的係數向量為

c , 便可以得到乙個最小化目標值的線性規劃: ax

≥y求m

in(c

x)不要

問我為什

麼和上面

那玩意長

的那麼像

但這個線性規劃不好找基本解 , 所以我們嘗試把這玩意對偶: at

x′≤c

求max

(yx′

) 由於本題我們只求目標值而不用求對應的方案所以 , 我們其實只需要把那個矩陣轉置一下就好啦。 (並不推薦寫網上的某些寫法 , 把乙個好好的矩陣拆成三個qaq)

誒 , 當你正準備用單純形法求這玩意的最大值的時候你會發現 , 這玩意好像我存不下。 因為當我新增了若干鬆弛變數之後 , 這玩意就是108

級別的了。

當時這裡我糾結了很久 , 但這就是乙個很常見的針對稀疏矩陣的優化(弱省的學生學校裡沒有善良的學長啊)。

思路就是有的變數那乙個列向量只有乙個係數為1的值(其餘都是0) , 所以我們不存這些東西 , 當我們pi

vot 的時候我們sw

ap一下兩個變數的位置就好。

至此 ,此題就可以ac了。

這裡貼乙個會mle但是思路清晰的** , 自己做的時候可以把

a ,

b中的某個陣列去掉即可

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 1100;

const

int maxm = 11000;

const

double eps = 1e-7;

const

double inf = 1e20;

int dcmp(double a)

int n , m;

double b[maxn][maxm] , a[maxm][maxn];

void dualize()

void pivot(int l , int e)

for(int i=1;i<=m;i++) if(i!=e) a[l][i] /= a[l][e]; a[l][e] = 1/a[l][e];

}double ******x()

}int main(int argc, char *argv)

dualize();

printf("%d" , (int)(******x()+0.50));

return

0;}

一些問題:

q: 這玩意本來沒次pi

vot 的運算量就大 , 而且還是指數級別的演算法, 為神馬不超時呢?

a: 資料不好 , 好的話一樣超時……

q: 為什麼你不記錄此時的到底是哪些是鬆弛變數啊, 這樣到最後不就不知道哪些變數的對應關係了麼?

a: 是的 , 我確實應該記錄這些變數的對應關係 , 但是此題不要求輸出方案 , 這就免了(博主懶)

q: 我看到網上的很多單純形的**很長的樣子 , 你的**這麼短有沒有暗傷啊?

a: 博主巨弱 , 表示目前沒有發現

乙個小小的總結:

我後來又嘗試用單純形法解決網路流的題目 , 正確性和通解的優勢是明顯的 , 因為通過代數建模比通過圖論構造要靈活很多 , 就想用解析幾何來做幾何題一樣。但是很多題目, 無論是時間還是空間都很緊迫 , 所以此方法在大多時候都不能上「正席」 , 但是如果考試的時候乙個網路流題目建模困難 , 而你會單純形法 , 那麼……(自由想象)

單純形求解線性規劃 BZOJ1061

推薦一篇 我們設xi為第i個志願者的招募次數,以樣例為例,則不難列出如下的線性規劃方程 minx1 0 0 2 x1 x2 0 3 0 x2 x3 4 那麼,根據 這個方程等價於 maxx1 x2 0 2 0 x2 x3 5 0 0 x3 2 我們發現,這是乙個線性規劃方程的基本形式,基本解為 然後...

單純形法簡介

考慮目標函式,ma xz 3 x1 4 x2增加x1 和x2 的值都將改進 z 的值,單純形法的設計要求每次都選擇使 z值有最大改善的那個變數。意味著在上述目標函式中,首先選擇增加x2 的值。通過對問題約束施加以下兩項要求來方便單純形法的計算 1.所有的約束都是等式,並且具有非負右端項 2.所有變數...

單純形法中大m法 單純形法(大M法)

function x,fval,flag,iteration original m c,a,b 原始單純形法 大m法,無需給出初始基變數 programmed by liyang faruto s studio bnu math last modified 2008.4.27 求解標準型線性規劃 m...