📄 算法源程序.txt
字号:
#include <stdio.h>
#define M 42
#define N 20
int CalcheckinValue(double CB[],double **matrix,double checkin[],double Z[],int m,int Row)
{
int i,j,n=-1;
double Min=0;
double var;
double sum=0;
for(i=0;i<m;i++)
{ for(j=0;j<Row;j++)
// sum[i]+=CB[j]*matrix[j][i];
{
var=*((double*)matrix + m*j+ i);
sum+=CB[j]*var;
}
checkin[i]=Z[i]-sum;
sum=0;
}
for(i=0;i<m;i++)
if(Min>checkin[i])
{
Min = checkin[i];
n=i;
}
return n;
}
int CalcheckoutValue(double b[],double **matrix,double checkout[],int n,int Row,int col)
{
int i,m;
double var;
double Min=1000000;
for(i=0;i<Row;i++)
if(*((double*)matrix + col*i + n)==0)
checkout[i] =1000000;
else
{ var=*((double*)matrix +col*i + n);
checkout[i]=b[i]/var;
}
for(i=0;i<Row;i++)
if(Min>checkout[i]&&checkout[i]>0)
{
Min = checkout[i];
m=i;
}
return m;
}
void Alg(double Z[],double **matrix, double CB[], double **BMatrix, double checkout[], double checkin[], int x[],double b[],int m,int n)//自变量的序号
{
int RowIndex,ColumnIndex;//换出变量的行 换入变量的列
double s=0;
double RotatePoint=0;//旋转主元
double MultiNumber=0;// 化简标准型
int i,j;
double var ;
for(i=0;i<n;i++)
for(j=0;j<m-n;j++)
{
var= *((double*)matrix + m*i + j)*0.3;
b[i]-= var;
}
while(CalcheckinValue( CB,matrix,checkin,Z,m,n)!=-1)
{
ColumnIndex =CalcheckinValue( CB,matrix,checkin,Z,m,n);
RowIndex=CalcheckoutValue(b,matrix,checkout, ColumnIndex,n,m);
x[RowIndex]= ColumnIndex;
for(i=0;i<n;i++)
*((double*)BMatrix+i*(m+1)+0)=b[i];
for(i=0;i<n;i++)
for(j=1;j<m+1;j++)
{
*((double*)BMatrix+i*(m+1)+j)=*((double*)matrix + m*i+ j-1);
}
RotatePoint=*((double*)BMatrix+RowIndex*(m+1)+ColumnIndex+1);
for(i=0;i<m+1;i++)
*((double*)BMatrix+RowIndex*(m+1)+i)=*((double*)BMatrix+RowIndex*(m+1)+i)/RotatePoint;
for(i=0;i<n;i++)
{
if(i!=RowIndex)
{
MultiNumber=*((double*)BMatrix+i*(m+1)+ColumnIndex+1);
for(j=0;j<m+1;j++)
{ var=*((double*)BMatrix+RowIndex*(m+1)+j);
*((double*)BMatrix+i*(m+1)+j)=*((double*)BMatrix+i*(m+1)+j)-MultiNumber*var;
}
}
}
for(i=0;i<n;i++)
b[i]=*((double*)BMatrix+i*(m+1)+0);
for(i=0;i<n;i++)
for(j=1;j<m+1;j++)
*((double*)matrix + m*i + j-1)= *((double*)BMatrix+i*(m+1)+j);
CB[RowIndex]=Z[ColumnIndex];
}
}
int main()
{
//int RowIndex,ColumnIndex;//换出变量的行 换入变量的列
//double Z[30]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1};//目标函数的系数
//double b[2]={2,10};//约束方程的等式的右值
//double matrix[2][5]={-2,1,3,1,0,2,3,4,0,1};//约束方程的系数
//double matrix[8][30]={144,15,17,29,21,144,167,113,87.8,98.6,89.4,28,81,15,150,167,67.4,19,76,69,44.6,17,-1,0,0,0,0,0,0,0,
// 144,15,17,29,21,144,167,113,87.8,98.6,89.4,28,81,15,150,167,67.4,19,76,69,44.6,17,0,1,0,0,0,0,0,0,
// 144,15,17,29,21,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,
// 144,15,17,29,21,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,0,0,0,0,
// 0,0,0,0,0,0,167,113,87.8,98.6,89.4,28,81,15,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,
// 0,0,0,0,0,0,167,113,87.8,98.6,89.4,28,81,15,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0.0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,150,167,67.4,19,76,69,44.6,17,0,0,0,0,0,0,-1,0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,150,167,67.4,19,76,69,44.6,17,0,0,0,0,0,0,0,1
// };
//double b[8]={100000,110000,25000,27000,44000,45500,36000,38000};
//
//double CB[8]={1,1,1,1,1,1,1,1};//基变量的系数
//double BMatrix[8][31]={0};//扩转矩阵
//double checkout[8]={0};
//double checkin[30]={0};
//int x[8]={22,23,24,25,26,27,28,29};//自变量的序号
//double matrix[8][30]={144,15,17,29,21,144,167,113,87.8,98.6,89.4,28,81,15,150,167,67.4,19,76,69,44.6,17,-1,0,0,0,0,0,0,0,
// 144,15,17,29,21,144,167,113,87.8,98.6,89.4,28,81,15,150,167,67.4,19,76,69,44.6,17,0,1,0,0,0,0,0,0,
// 144,15,17,29,21,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,
// 144,15,17,29,21,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,0,0,0,0,
// 0,0,0,0,0,0,167,113,87.8,98.6,89.4,28,81,15,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,
// 0,0,0,0,0,0,167,113,87.8,98.6,89.4,28,81,15,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0.0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,150,167,67.4,19,76,69,44.6,17,0,0,0,0,0,0,-1,0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,150,167,67.4,19,76,69,44.6,17,0,0,0,0,0,0,0,1
// };
//DisheAmount dishesamount[M-N];
double Z[M]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
double matrix[N][M]={126.72,13.8,14.79,28.8,29.45,126.72,110.22,115.2,63,143,85.752,26.88,81,12.15,88.5,168.96,56.73,14.82,160.664,61.746,28.592,17.22,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
126.72,13.8,14.79,28.8,29.45,126.72,110.22,115.2,63,143,85.752,26.88,81,12.15,88.5,168.96,56.73,14.82,160.664,61.746,28.592,17.22,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
126.72,13.8,14.79,28.8,29.45,126.72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
126.72,13.8,14.79,28.8,29.45,126.72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,110.22,115.2,63,143,85.752,26.88,81,12.15,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,110.22,115.2,63,143,85.752,26.88,81,12.15,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,88.5,168.96,56.73,14.82,160.664,61.746,28.592,17.22,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,88.5,168.96,56.73,14.82,160.664,61.746,28.592,17.22,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
514.8,0,0,0,0,514.8,69.96,34.3,30.456,81,0,0,0,0,21.24,109.56,117.73,0,109.6,205.92,11.6,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,
514.8,0,0,0,0,514.8,69.96,34.3,30.456,81,0,0,0,0,21.24,109.56,117.73,0,109.6,205.92,11.6,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
205.92,13.8,17.4,31.68,9.5,205.92,31.68,0,20.844,44,12.56,33.6,0,48.6,6.49,91.74,9.15,448.5,15.176,135.912,6.48,206.64,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,
205.92,13.8,17.4,31.68,9.5,205.92,31.68,0,20.844,44,12.56,33.6,0,48.6,6.49,91.74,9.15,448.5,15.176,135.912,6.48,206.64,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
0,8.28,26.97,17.28,13.3,0,0,0,20.832,0,20.304,5.76,0,16.2,0,0,0,59.28,10.416,11.058,6.336,14.76,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,
0,8.28,26.97,17.28,13.3,0,0,0,20.832,0,20.304,5.76,0,16.2,0,0,0,59.28,10.416,11.058,6.336,14.76,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
1.6192,0.4508,0.6612,2.1504,0.209,1.6192,0.4422,2.90325,0.7356,0.34,0.32368,1.1904,2.71,0,0,0.8844,0.3782,0.7488,0.54784,0.97942,1.23688,0.7544,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,
1.6192,0.4508,0.6612,2.1504,0.209,1.6192,0.4422,2.90325,0.7356,0.34,0.32368,1.1904,2.71,0,0,0.8844,0.3782,0.7488,0.54784,0.97942,1.23688,0.7544,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
1,0,0,0,0,1,1,0.7,0.6,1,0.2,0,0,0,1,1,1,0,0.8,0.4,0.2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,
1,0,0,0,0,1,1,0.7,0.6,1,0.2,0,0,0,1,1,1,0,0.8,0.4,0.2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
0,1,1,1,1,0,0,0,0.4,0,0.8,1,0,1,0,0,0,1,0.2,0.6,0.8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,
0,1,1,1,1,0,0,0,0.4,0,0.8,1,0,1,0,0,0,1,0.2,0.6,0.8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
double b[N]={90000,93000,10000,12000,40000,43000,34000,37000,80000,90000,10000,12000,16000,18000,1200,1500,500,600,700,800};
double CB[N]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};//基变量的系数
double BMatrix[N][M+1]={0};//扩转矩阵
double checkout[N]={0};
double checkin[M]={0};
double dishesamount[M-N]={0};
//double OptiValuble=0;//目标函数最终的最优解
int m=M,n=N;//m表示目标函数自变量的个数 n 约束方程的个数
int i;
int x[N]={22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41};//自变量的序号
Alg(Z,matrix,&CB,BMatrix,checkout,checkin,&x,&b,m,n);
//double s=0;
//double RotatePoint=0;//旋转主元
//double MultiNumber=0;// 化简标准型
//double OptiValuble=0;//目标函数最终的最优解
//int m=42,n=20;//m表示目标函数自变量的个数 n 约束方程的个数
//int i,j;
//for(i=0;i<n;i++)
// for(j=0;j<m-n;j++)
// {
// b[i]-=matrix[i][j]*0.3;
// }
//while(CalcheckinValue( CB,matrix,checkin,Z,m,n)!=-1)
//{
// ColumnIndex =CalcheckinValue( CB,matrix,checkin,Z,m,n);
// RowIndex=CalcheckoutValue(b,matrix,checkout, ColumnIndex,n);
// x[RowIndex]= ColumnIndex;
// for(i=0;i<n;i++)
// BMatrix[i][0]=b[i];
// for(i=0;i<n;i++)
// for(j=1;j<m+1;j++)
// {
// BMatrix[i][j]=matrix[i][j-1];
// }
// RotatePoint=BMatrix[RowIndex][ColumnIndex+1];
// for(i=0;i<m+1;i++)
// BMatrix[RowIndex][i]=BMatrix[RowIndex][i]/RotatePoint;
// for(i=0;i<n;i++)
// {
// if(i!=RowIndex)
// {
// MultiNumber=BMatrix[ i][ColumnIndex+1];
// for(j=0;j<m+1;j++)
// BMatrix[i][j]=BMatrix[i][j]-MultiNumber*BMatrix[RowIndex][j];
// }
// }
// for(i=0;i<n;i++)
// b[i]=BMatrix[i][0];
// for(i=0;i<n;i++)
// for(j=1;j<m+1;j++)
// {
// matrix[i][j-1]=BMatrix[i][j];
// }
// CB[RowIndex]=Z[ColumnIndex];
//}
//for(i=0;i<n;i++)
// OptiValuble+=CB[i]*b[i];
//printf("\n最优化的解为:%f\n",OptiValuble);
for(i=0;i<n;i++)
if(x[i]+1<m-n)
dishesamount[x[i]+1]=b[i]+0.3;
for(i=0;i<M-N;i++)
if(dishesamount[i]==0)
dishesamount[i]=0.3;
printf("\n%d道菜的合理含量如下:\n",M-N);
for(i=0;i<M-N;i++)
printf("菜号%d的含量为%f克\n",i+1,dishesamount[i]);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -