⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dcxf.cpp

📁 单纯型法
💻 CPP
字号:
/*p248习题2
	单纯形法*/


#include "iostream.h"
#define m 4	
#define  n 6

void main()
{
	int i,j,k;
//	float a[m+1][n]={{1,1,1,0,0,0},{1,2,0,1,0,0},{1,0,0,0,1,0},{1,0,0,0,0,1},{-2,-3,0,0,0,0}};
	float b[m+1]={6,8,5,3,0};
	float a[m+1][n+1]={{1,1,1,0,0,0,6},{1,2,0,1,0,0,8},{1,0,0,0,1,0,5},{0,1,0,0,0,1,3},{-2,-3,0,0,0,0,0}};
	float x[n]={0};			//结果置于x[n]中
	int num[m]={2,3,4,5};	//记录基底向量
//	float a[m+1][n+1];
//	a=a;
	/*
	min1=-2x1-3x2
	x1+x2<=6;
	x1+2x2<=8
	x1<=5
	x2<=3
	x1>=0
	x2>=0

    x1+x2+ x3       = 6
	x1+2*x2+  x4    = 8
	x1+         x5  = 5
	   x2+        x6= 3

	1 1 | 1 0 0 0 | 6			初始形式
	1 2 | 0 1 0 0 | 8
	1 0 | 0 0 1 0 | 5
	1 0 | 0 0 0 1 | 3
-----------------------
	-2 -3|0 0 0 0 | 0
	*/
	//确定k,l------------------------------
l1:	float d=1000;
	int l=-1;
	for (j=0;j<n;j++)
	{
		if(a[m][j]<d)
		{
			d=a[m][j];
			l=j;
		}
	}
	if(a[m][l]<0)
	{
		d=1000;
		k=-1;
		for(i=0;i<m;i++)
		{
			if(a[i][l]>0)
			{
				if(a[i][n]/a[i][l]<d)
				{
					d=a[i][n]/a[i][l];
					k=i;
				}
			}
		}

		num[k]=l;
		if(k==-1)
		{
		cout<<"该线形规划有无界解"<<endl;	//无界
		goto l3;	//结束
		}
		else		//消元,用高斯消去法
		{
			float s;
			int p,k1;
			
				if(a[k][l]<0)
				{
					for (k1=0;k1<=n;k1++)
						a[k][k1]=-a[k][k1];
				}

				for (k1=0;(k1<=n)&&(k1!=l);k1++)
					a[k][k1]=a[k][k1]/a[k][l];

					a[k][l]=1;

				for (p=0;p<=m;p++)
				{
				
					if(p==k) continue;
					s=-a[p][l];
					for (k1=0;k1<n+1;k1++)
						a[p][k1]=a[p][k1]+a[k][k1]*s;
				}
			goto l1;
		}
	}
	else
	{
		for (i=0;i<m;i++)
			x[num[i]]=a[i][n];
		for (i=0;i<n;i++)
			cout<<"x"<<i+1<<"="<<x[i]<<endl;//打印结果//结束
	
	}

l3:;
}

	
/*-------------------------------------------------------

x1=4
x2=2
x3=0
x4=0
x5=1
x6=1

---------------------------------------------------------*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -