单纯形法

jys posted @ Mar 01, 2014 02:19:09 PM in 未分类 , 892 阅读

 

namespace simplex
{
	int n,m,next[1011];
	//n:varibel m:equation
	double a[11010][1011];
	#define START_POS 1010
	#define INF 210000000000000.0;
	void pivot(int l,int e)
	{
		int t=START_POS;
		double tmp;
		for(int i=0;i<=n;i++)
			if(a[l][i]!=0){next[t]=i;t=i;}
		next[t]=-1;
		tmp=-a[l][e];
		a[l][e]=-1;
		for(int i=next[START_POS];i!=-1;i=next[i])
			a[l][i]/=tmp;
		for(int i=0;i<=m;i++)
		{
			if(a[i][e]==0)continue;
			if(i==l)continue;
			tmp=a[i][e];a[i][e]=0;
			for(int j=next[START_POS];j!=-1;j=next[j])
				a[i][j]+=a[l][j]*tmp;
		}
	}
	double solve()
	{
		while(1)
		{
			long double min=INF;int l=0,e=0;
			for(int i=1;i<=n;i++)
				if(a[0][i]>0){e=i;break;}
			if(e==0)return a[0][0];
			for(int i=1;i<=m;i++)
				if(a[i][e]<0&&a[i][0]<(-a[i][e])*min)
				{min=a[i][0]/(-a[i][e]);l=i;}
			pivot(l,e);
		}
	}
	#undef INF
	#undef START_POS
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter