uoj 179 線性規劃 單純形法 模板

2021-07-28 16:42:11 字數 2362 閱讀 9707

題目大意:

這是一道模板題。

本題中你需要求解乙個標準型線性規劃:

有n個實數變數x1,x2,⋯,xn和m條約束,其中第i條約束形如aij*xj≤bi ,j∈(1,n),i∈(1,m)

此外這n個變數需要滿足非負性限制,即xj≥0。

在滿足上述所有條件的情況下,你需要指定每個變數xj的取值,使得目標函式f=cj*xj ,j∈(1,n)的值最大。

輸入格式

第一行三個正整數 n,m,t。其中t∈。

第二行有n個整數c1,c2,⋯,cn,整數間均用乙個空格分隔。

接下來m行,每行代表一條約束,其中第i行有n+1個整數ai1,ai2,⋯,ain,bi,整數間均用乙個空格分隔。

輸出格式

如果不存在滿足所有約束的解,僅輸出一行」infeasible」。

如果對於任意的m,都存在一組解使得目標函式的值大於m,僅輸出一行」unbounded」。

否則,第一行輸出乙個實數,表示目標函式的最大值f。當第一行與標準答案的相對誤差或絕對誤差不超過10−6,你的答案被判為正確。

如果t=1,那麼你還需要輸出第二行,用空格隔開的n個非負實數,表示此時x1,x2,⋯,xn的取值,如有多組方案請任意輸出其中乙個。

判斷第二行是否合法時,我們首先檢驗f−cjxj,j∈(1,n)是否為0,再對於所有ii,檢驗min是否為0。檢驗時我們會將其中大於0的項和不大於0的項的絕對值分別相加得到s+和s−,如果s+和s−的相對誤差或絕對誤差不超過10−6,則判為正確。

如果t=0,或者出現infeasible或unbounded時,不需要輸出第二行。

題解:

單純形法

這個人講得很清楚。

-update 2017/3/20

對了,對於是否有初始可行解的話,initialize這個函式是一種方法,但是可能會有點慢。大多時候都利用對偶原理來轉化模型。額奧爺爺說當c都是負的時候才用對偶(?)

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define maxn 25

const

double eps=0.00000001,inf=1e15;

int n,m,id[maxn*2];

double a[maxn][maxn];//a[i][j]:i表第幾條約束 j表第幾個元素

double myabs(double x)

//a[0][i] -> ci 目標函式中第i個元素係數

//a[i][0] -> bi 第i條約束中的常數

//a[i][j] -> aij 第i條約束中第j個元素的係數

//最大化 sigma(ci*xi),i∈n

//約束 xj=bj-sigma(aji*xi) ,j∈b

//轉軸

void pivot(int l,int e)

//替入變數xe∈非基本變數(1~n) 替出變數xl∈基本變數(n+1~n+m)

}//初始化

//方法一:引入乙個輔助線性規劃 要求最大化-x0

//約束為 xj=bj-sigma(aji*xi)+x0 ,j∈b然後用x0替換bj為負的約束

//下面的是方法二:

bool initialize()

pivot(l,e);

//在bi為負的時候,把所有基變數設為0不是一組合法的初始解

//所以選擇乙個bi為負的基變數x[i+n]

//然後在該約束右邊找乙個係數為正(即原係數為負)的非基變數進行轉軸操作

//如果沒有係數為正顯然就無解了

}return1;}

//最優化

bool ******x()

if (!e) break;

//如果目標變數ci都小於0 那麼最優解就是非基變數都為0

for (i=1;i<=m;i++)

if (a[i][e]>eps && a[i][0]/a[i][e]0]/a[i][e],l=i;

//在所有的式子中找出包含當前選中項(係數不為0)且最緊的一項

if (!l)

//如果所有的a[i][e]都小於0,說明最優值正無窮

pivot(l,e);

}return1;}

double ans[maxn];

int main()

for (i=1;i<=n;i++) id[i]=i;

if (initialize() && ******x())

}return

0;}

UOJ 179 線性規劃(單純形)

傳送門 題解 雖然標程掛了,不過還是勉強能用的。初始條件 max jc jaj jai,jxj bjxi 0max j cjaj jai jxj bjx i 0最優化過程 假設一開始滿足所有bj 0b j 0。1.找到ci c i為正數的xi x i。2.找到bj xj,i b jx j,i最小的j...

線性規劃 單純形法

線性規劃是求乙個線性多項式的最值。線性規劃有兩種形式 1.標準型 不等式型 2.鬆弛型 除了非負約束,其他都是等式變數名稱 在res x y z中。1.基本變數,基本變數是res。2.非基本變數,如x,y,z。單純形法 適用於鬆弛型。單純形法是不斷通過迭代來增大最大值。達到無法更新時,就是最大值。這...

線性規劃 單純形法

單純形法 x method 單純形法的思路總結 其它情況 參考文獻 目標函式是線性的,約束條件是線性等式或不等式,每個變數都取實數值.minimize ct xsubject to ax bx 0 begin text c x text a x b x geq 0 end minimize subj...