线性规划求助
  • 板块学术版
  • 楼主HAuCl4
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/6/29 22:10
  • 上次更新2023/11/3 12:06:52
查看原帖
线性规划求助
289304
HAuCl4楼主2023/6/29 22:10

RT,网上贺来的板子,但是不知道为什么有时求出的解并不符合限制。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
const int m=20;//不等式组个数
const int n=20;//变元个数
db M=1e99;
db A[m][n];//记录方程组的数目和系数
db C[n];//存储目标函数中各个变量的系数
db b[m];//存储约数条件中的常数

db CB[m],seta[m],dt[n],x[n];
int num[m];
db ZB=0;
int solve1()
{
	int k=0;
	bool flag=0;
	db mx=0;
	for(int i=0;i<n;i++)
		if(dt[i]<=0) flag=1;
		else {flag=0; break;}
	if(flag==1) return -1;
	for(int i=0;i<n;i++)
		if(mx<dt[i])
		{
			mx=dt[i];
			k=i;
		}
	return k;
}
int solve2(int a)
{
	bool flag=0;
	db mn;
	int k=a,j=0;
	for(int i=0;i<m;i++)
		if(A[i][k]<=0) flag=1;
		else{flag=0; break;}
	if(flag==1)
	{
		printf("\n该线性规划无最优解\n");
		return -1;
	}
	for(int i=0;i<m;i++)
	{
		if(A[i][k]>0) seta[i]=b[i]/A[i][k];
		else seta[i]=M;
	}
	mn=M;
	for(int i=0;i<m;i++)
		if(mn>=seta[i])
		{
			mn=seta[i];
			j=i;
		}
	num[j]=k+1;
	CB[j]=C[k];
	return j;
}
void solve3(int p,int q)
{
	int c=p,l=q;//行、列号
	db t1,t2,t3;
	t1=A[c][l];
	b[c]=b[c]/t1;
	for(int j=0;j<n;j++) A[c][j]=A[c][j]/t1;
	for(int i=0;i<m;i++)
	{
		if(i!=c)
			if(A[i][l]!=0)
			{
				t2=A[i][l];
				b[i]=b[i]-b[c]*t2;
				for(int j=0;j<n;j++)
					A[i][j]=A[i][j]-A[c][j]*t2;
			}
	}
	t3=dt[l];
	for(int i=0;i<n;i++) dt[i]=dt[i]-A[c][i]*t3;
}
void print()
{
	printf("\n__________________________________\n");
	for(int i=0;i<m;i++)
	{
		printf("%8.2f\tX(%d) %8.2f ",CB[i],num[i],b[i]);
		for(int j=0;j<n;j++) printf("%8.2f",A[i][j]); printf("\n");
	}
	printf("\n__________________________________\n");
	printf("\t\t\t");
	for(int i=0;i<n;i++) printf(" %8.2f",dt[i]);
	printf("\n__________________________________\n");
}
void input()
{
	int k;
	printf("请输入方程组的系数矩阵 A(%d 行 %d 列):\n",m,n);
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
			scanf("%lf",&A[i][j]);
	printf("\n请输入初始基变量的数字代码num矩阵:\n");
	for(int i=0;i<m;i++) scanf("%d",&num[i]);
	printf("\n请输入方程组右边的值矩阵 b:\n");
	for(int i=0;i<m;i++) scanf("%lf",&b[i]);
	printf("\n请输入目标函数各个变量的系数所构成的系数阵 C:\n");
	for(int i=0;i<n;i++) scanf("%lf",&C[i]);
	for(int i=0;i<n;i++) dt[i]=C[i];
	for(int i=0;i<m;i++)
	{
		k=num[i]-1;
		CB[i]=C[k];
	}
}
int main()
{
//	freopen("orz.txt","r",stdin);
	int p,q;
	input();
//	printf("\n__________________________________\n");
//	printf("\tCB\tXB\tb\t");
//	for(int i=0;i<n;i++) printf(" X(%d)\t",i+1);
	for(int i=0;i<n;i++) x[i]=0;
	printf("\n");
	while(1)
	{
		q=solve1();
		if(q==-1)
		{
//			print();
			printf("\n所得解已经是最优解\n");
			printf("\n最优解为:\n");
			for(int j=0;j<m;j++) x[num[j]-1]=b[j];
			for(int i=0;i<n;i++)
			{
				printf("x%d=%.2lf\n",i+1,x[i]);
				ZB=ZB+x[i]*C[i];
			}
			printf("\n\nZB=%.2lf\n",ZB);
			break;
		}
		print();
		p=solve2(q);
//		printf("\np=%d, q=%d",p,q);
		if(q==-1) break;
		solve3(p,q);
	}
	return 0;
}

2023/6/29 22:10
加载中...