單純形 學習筆記

2022-05-01 19:21:10 字數 2582 閱讀 4181

想學好久了,這幾天終於看懂了,來寫一發。

線性規劃是指具有以下形式的問題:

\[\max\^x_ia_i\}\\

\left\

\forall i,\sum_ a_x_i=b_i\\

\forall i,x_i\ge 0

\end\right.\]

不過對於 \(\le\) 的形式,我們可以通過鬆弛變數來實現,具體來說就是:

\[\max\^x_ia_i\}\\

\left\

a_=b_i-\sum_ a_x_i\\

\forall i,x_i\ge 0

\end\right.

\]總所周知,高中的線性規劃解法就是找到可行域,然後用函式逼近找最值。(似乎表述的有些不嚴謹

然後在oi中,似乎是可以說明這個可行域是個多維凸包,就可以用爬山演算法直接爆凸(艹皿艹 ),單純性演算法就是這個演算法的具體實現。

我們定義一種操作叫做轉軸,舉個例子:

假如我們現在的問題是求解以下問題:

\[\max \\\

\left\

x_4=30-x_1-x_2-3_x3\\

x_5=24-2x_1-2x_2-5x_3\\

x_6=36-4x_1-x_2-2x_3\\

\forall x_i,x_i\ge 0

\end\right.

\]我們把 \(x_1\) 用其他值來替換,我們發現限制最緊的是 \(x_6\),於是我們把 \(x_1\) 用 \(x_2,x_3,x_6\) 替換,可以得到:

\[\max\+\frac-\frac\}\\

\left\

x_4=21-\frac-\frac+\frac\\

x_5=6-\frac-4x_3+\frac\\

x_1=9-\frac-\frac-\frac\\

\forall x_i,x_i\ge 0

\end\right.

\]不難發現,我們再依次轉軸 \(x_3,x_2\) 可以得到:

\[\max\-\frac-\frac\}\\

\left\

x_4=18-\frac+\frac\\

x_2=4-\frac-\frac+\frac\\

x_1=8+\frac+\frac-\frac\\

\forall x_i,x_i\ge 0

\end\right.

\]你可以發現的是,這個時候需要最大化的式子裡面所有係數都是負數,也就是說,答案最大不可能比這更大了,這個時候只需要取 \(x_3,x_5,x_6\) 都取 \(0\) 即可。

不過我們可以發現的是,如果我們如果一開始的 \(b_i<0\) 的話,我們這樣取值是不可以的。但是我們可以直接通過轉軸把它轉正即可。 舉個例子。

\[x_1=-4+x_2-x_3

\]我們可以通過轉軸得到:

\[x_2=4+x_1+x_3

\]這樣就可以了。

不過轉軸操作由於你一直轉第一次發現的東西可能會卡入死迴圈,所以你隨機取點就可以了。

時間複雜度玄學,雖然是指數級的,但是你可以發現指數級的情況需要值域很大,所以在值域正常的情況下,還是跑地很快的。

但是我們可以發現要達到這個指數級的呼叫次數,邊權也必須是指數級的。所以在oi中往往跑得比誰都快。所以「能在1s內跑出範圍為幾百的資料」。 --- 神犇zzq

#include using namespace std;

#define int register int

#define inf 0x7f7f7f7f

#define eps 1e-7

#define maxn 55

template inline void read (t &t)while (c >= '0' && c <= '9') t *= f;}

template inline void read (t &t,args&... args)

template inline void write (t x)if (x > 9) write (x / 10);putchar (x % 10 + '0');}

int n,m,t,ind[maxn];

double a[maxn][maxn],ans[maxn];

int dcmp (double x)

void pivot (int r,int c)

}void solve ()

if (!y) return puts ("infeasible"),void ();

pivot (x,y);

} while (1)

printf ("%.9f\n",a[0][0]);

if (!t) return ;

for (int i = n + 1;i <= n + m;++ i) ans[ind[i]] = a[i - n][0];

for (int i = 1;i <= n;++ i) printf ("%.9f ",ans[i]);putchar ('\n');

}signed main()

solve ();

return 0;

}

線性規劃與單純形 學習筆記

就是用於解決線性規劃問題的一般演算法。時間複雜度比較玄學,不是多項式演算法,但是實際表現不錯。線性規劃 在給定有限資源和競爭約束的情況下,要最大化或最小化某個目標,如果可以把目標描述為某些目標的線性函式,且約束為某些變數的不等式或等式,那我們就可以得到乙個線性規劃問題,如網路流問題就是特殊的線性規劃...

單純形法與線性規劃 學習筆記

很早以前學過理論,3個月前又學了一遍寫了一點筆記,現在覺得以 已 前 經 寫 完 的 全 太 忘 醜 記 於是重寫一遍 1.演算法導論 2.2016國家集訓隊 maximize quad sum limits c jx j satisfy quad constraint sum limits a x...

三 單純形方法(原理)

目前,運用最廣的線性規劃方法就是著名的單純形方法。這種方法是g.b.dantzig在1947年提出的。幾十年的實踐證明,單純形方法的確是一種使用方便 行之有效的重要演算法。如今,它已經成為線性規劃的中心內容。單純形法的基本思路是有選擇地取 而不是列舉所有的 基本可行解,即是從可行域的乙個頂點出發,沿...