起因是一道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...