想學好久了,這幾天終於看懂了,來寫一發。
線性規劃是指具有以下形式的問題:
\[\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年提出的。幾十年的實踐證明,單純形方法的確是一種使用方便 行之有效的重要演算法。如今,它已經成為線性規劃的中心內容。單純形法的基本思路是有選擇地取 而不是列舉所有的 基本可行解,即是從可行域的乙個頂點出發,沿...