#include<stdio.h>
#include<math.h>
intm //记录约束条件方程组的个数
intn //记录未知量的个数
floatM=1000000.0
floatA[100][100] //用于记录方程组的数目和系数
floatC[100] //用于存储目标函数中各个变量的系数
floatb[100] //用于存储常约束条件中的常数
floatCB[100]//用于存储基变量的系数
floatseta[100] //存放出基与入基的变化情况
floatcn[100] //存储检验数矩阵
floatx[100]
intnum[100] //用于存放出基与进基变量的情况
floatZ=0 //记录目标函数值
voidshuru()
voidprint()
intmincz()
intfind_line(int a)
voidexchange(int a,int b)
intmain()
{
int i,j=0
int p,q,temp //q:换入,p:换出
shuru()
printf("\n--------------------------------------------------------------------------\n")
printf(" \tCB\tXB\tb\t")
for(i=0i<ni++)
printf(" X(%d)\t",i+1)
for(i=0i<ni++)
x[i]=0
printf("\n")
while(1) {
q=mincz()
if(q==-1) {
print()
printf("\n所得解已经是最优解!\n")
printf("\n最优解为:\n")
for(j=0j<mj++) {
temp=num[j]-1
x[temp]=b[j]
}
for(i=0i<ni++) {
printf("x%d=%.2f",i+1,x[i])
Z=Z+x[i]*C[i]
}
printf("Z=%.2f",Z)
break
}
print()
p=find_line(q)
printf("\np=%d,q=%d",p,q)
if(q==-1) break
exchange(p,q)
}
return 0
}
intmincz()
{
int i,k=0
int flag=0//检验数标记
float min=0
for(i=0i<ni++)
if(cn[i]>=0)
flag=1
else {
flag=0
break
}
if(flag==1)
return -1
//进行到此处,说明存在<0的检验数
//找到最小的检验数,作为换入变量
for(i=0i<ni++) {
if(min>cn[i]) {
min=cn[i]
k=i
}
}
return k
}
intfind_line(int a)
{
int i,k,j
int flag=0
float min
k=a
for(i=0i<mi++)
if(A[i][k]<=0)
flag=1
else {
flag=0
break
}
if(flag==1) {
printf("\n该线性规划无最优解!\n")
return -1
}
for(i=0i<mi++) {
if(A[i][k]>0)
seta[i]=b[i]/A[i][k]
else seta[i]=M
}
min=M
for(i=0i<mi++) {
if(min>=seta[i]) {
min=seta[i]
j=i
}
}
num[j]=k+1
CB[j]=C[k]
return j
}
voidexchange(int p,int q)
{
int i,j,c,l
float temp1,temp2,temp3
c=p//行号,换出
l=q//列号,换入
temp1=A[c][l] //A[c][l]主元
b[c]=b[c]/temp1
for(j=0j<nj++)
A[c][j]=A[c][j]/temp1 //主元化为1
for(i=0i<mi++) {
if(i!=c)
if(A[i][l]!=0) {
temp2=A[i][l]
b[i]=b[i]-b[c]*temp2
//主元所在列,其余元素化为0
for(j=0j<nj++)
A[i][j]=A[i][j]-A[c][j]*temp2
}
}
temp3=cn[l]
for(i=0i<ni++)
cn[i]=cn[i]-A[c][i]*temp3
}
voidprint()
{
int i,j=0
printf("\n--------------------------------------------------------------------------\n")
for(i=0i<mi++) {
printf("%8.2f\tX(%d) %8.2f",CB[i],num[i],b[i])
for(j=0j<nj++)
printf("%8.2f ",A[i][j])
printf("\n")
}
printf("\n--------------------------------------------------------------------------\n")
printf("\t\t\t")
for(i=0i<ni++)
printf(" %8.2f",cn[i])
printf("\n--------------------------------------------------------------------------\n")
}
voidshuru()
{
int i,j//循环变量
int k
printf("请输入线性规划问题的约束条件个数M:")
scanf("%d",&m)
printf("请输入线性规划问题的决策变量个数N:")
scanf("%d",&n)
printf("\n请输入方程组的系数矩阵A(%d行%d列):\n",m,n)
for(i=0i<mi++)
for(j=0j<nj++)
scanf("%f",&A[i][j])
printf("\n请输入初始基变量的数字代码矩阵:\n")
for(i=0i<mi++)
scanf("%d",&num[i])
printf("\n请输入方程组右边的值矩阵b:\n")
for(i=0i<mi++)
scanf("%f",&b[i])
printf("\n请输入目标函数各个变量的系数所构成的系数阵C:\n")
for(i=0i<ni++)
scanf("%f",&C[i])
for(i=0i<ni++)
cn[i]=-C[i]
for(i=0i<mi++) {
k=num[i]-1
CB[i]=C[k]
}
}
童鞋,你的代码不全initialTableau()
outsimplextableau()
standardize
utconstraint
outobj
以上这五个函数你只声明但是没有定义。所以麻烦你把全部的代码都贴上来。
其次,int checkoptimal(int &ii,int &jj)这种函数参数,叫做引用,是C++的语法,C语言中这样写是错误的,建议改为int checkoptimal(int *ii,int *jj),当然函数体里相应引用的地方也需要改一下。
希望对你有帮助,期待采纳,欢迎追问
#include<stdio.h>#include<math.h>
#include<iostream.h>
float matrix[100][100],x[100]
int a[100]
int m,n,s,type
int indexe,indexl,indexg
void Jckxj()
{
int i,j
for(i=0i<ni++)
for(j=0j<sj++)
if(matrix[i][j]==1&&a[j]==1){
x[j]=matrix[i][s]
j=s
}
for(i=0i<si++)
if(a[i]==0) x[i]=0
}
int Rj()
{
int i
for(i=0i<si++)
if(fabs(matrix[n][i])>=0.000001)
if(matrix[n][i]<0) return 0
return 1
}
int Min()
{
int i,temp=0
float min=matrix[n][0]
for(i=1i<si++)
if(min>matrix[n][i]){
min=matrix[n][i]
temp=i
}
return temp
}
void JustArtificial()
{
int i
for(i=m+indexe+indexli<si++)
if(fabs(x[i])>=0.000001){
printf("No Answer\n")
return
}
}
int Check(int in)
{
int i
float max1=-1
for(i=0i<ni++)
if(fabs(matrix[i][in])>=0.000001&&max1<matrix[i][s]/matrix[i][in])
max1=matrix[i][s]/matrix[i][in]
if(max1<0)
return 1
return 0
}
int SearchOut(int *temp,int in)
{
int i
float min=10000
for(i=0i<ni++)
if(fabs(matrix[i][in])>=0.000001&&(matrix[i][s]/matrix[i][in]>=0)&&min>matrix[i][s]/matrix[i][in]){
min=matrix[i][s]/matrix[i][in]
*temp=i
}
for(i=0i<si++)
if(a[i]==1&&matrix[*temp][i]==1) return i
}
void Mto(int in,int temp)
{
int i
for(i=0i<=si++)
if(i!=in)
matrix[temp][i]=matrix[temp][i]/matrix[temp][in]
matrix[temp][in]=1
}
void Be(int temp,int in)
{
int i,j
float c
for(i=0i<=ni++){
c=matrix[i][in]/matrix[temp][in]
if(i!=temp)
for(j=0j<=sj++)
matrix[i][j]=matrix[i][j]-matrix[temp][j]*c
}
}
void Achange(int in,int out)
{
int temp=a[in]
a[in]=a[out]
a[out]=temp
}
void Print()
{
int i,j,k,temp=0
for(i=0i<ni++){
for(k=tempk<sk++)
if(a[k]==1){
printf("X%d ",k)
temp=k+1
k=s
}
for(j=0j<=sj++)
printf("%8.2f",matrix[i][j])
printf("\n")
}
printf("Rj ")
for(j=0j<=sj++)
printf("%8.2f",matrix[n][j])
printf("\n")
}
void InitPrint()
{
int i
printf("X")
for(i=0i<si++)
printf(" a%d",i)
printf(" b\n")
Print()
printf("\n")
}
void Result()
{
int i
printf(" (")
for(i=0i<si++)
printf("%8.2f",x[i])
printf(" ) ")
if(type==1)
printf(" Zmax=%f\n\n",matrix[n][s])
else printf(" Zmin=%f\n\n",matrix[n][s])
}
void PrintResult()
{
if(type==0) printf("The Minimal :%f\n",-matrix[n][s])
else printf("The Maximum :%f\n",matrix[n][s])
}
void Merge(float nget[][100],float nlet[][100],float net[][100],float b[])
{
int i,j
for(i=0i<ni++){
for(j=mj<m+indexej++)
if(nget[i][j-m]!=-1) matrix[i][j]=0
else matrix[i][j]=-1
for(j=m+indexej<m+indexe+indexlj++)
if(nlet[i][j-m-indexe]!=1) matrix[i][j]=0
else matrix[i][j]=1
for(j=m+indexe+indexlj<sj++)
if(net[i][j-m-indexe-indexl]!=1) matrix[i][j]=0
else matrix[i][j]=1
matrix[i][s]=b[i]
}
for(i=mi<m+indexe+indexli++)
matrix[n][i]=0
for(i=m+indexe+indexli<si++)
matrix[n][i]=100
matrix[n][s]=0
}
void ProcessA()
{
int i
for(i=0i<m+indexei++)
a[i]=0
for(i=m+indexei<si++)
a[i]=1
}
void Input(float b[],int code[])
{
int i=0,j=0
printf("The equator Variable and Restrictor\n")
cin>>m>>n
for(i=0i<ni++){
printf("Input b[] and Restrictor code 0:<= 1:= 2:>=\n")
cin>>b[i]>>code[i]
printf("The XiShu\n")
for(j=0j<mj++)
cin>>matrix[i][j]
}
printf("The Type 0:Min 1:Max \n")
do{
cin>>type
if(type!=0&&type!=1) printf("Error,ReInput\n")
}while(type!=0&&type!=1)
printf("The Z\n")
for(i=0i<mi++)
cin>>matrix[n][i]
if(type==1)
for(i=0i<mi++)
matrix[n][i]=-matrix[n][i]
}
void Xartificial()
{
int i,j,k
if(indexg!=0){
for(i=m+indexe+indexli<si++){
for(j=0j<nj++)
if(matrix[j][i]==1){
for(k=0k<=sk++)
matrix[n][k]=matrix[n][k]-matrix[j][k]*100
j=n
}
}
}
}
void Process(float c[][100],int row,int vol)
{
int i
for(i=0i<ni++)
if(i!=row) c[i][vol]=0
}
void Sstart(float b[],int code[])
{
int i
float nget[100][100],nlet[100][100],net[100][100]
indexe=indexl=indexg=0
for(i=0i<ni++){
if(code[i]==0){nlet[i][indexl++]=1Process(nlet,i,indexl-1)}
if(code[i]==1){ net[i][indexg++]=1Process(net,i,indexg-1)}
if(code[i]==2){
net[i][indexg++]=1
nget[i][indexe++]=-1
Process(net,i,indexg-1)Process(nget,i,indexe-1)
}
}
s=indexe+indexl+indexg+m
Merge(nget,nlet,net,b)
ProcessA()
InitPrint()
Xartificial()
}
void Simplix()
{
int in,out,temp=0
while(1){
Jckxj()
Print()
Result()
if(!Rj()) in=Min()
else {
if(indexg!=0) JustArtificial()
PrintResult()
return
}
if(Check(in)){
printf("No Delimition\n")
return
}
out=SearchOut(&temp,in)
Mto(in,temp)
Be(temp,in)
Achange(in,out)
}
}
void main()
{
int code[100]
float b[100]
Input(b,code)
Sstart(b,code)
Simplix()
}
还满意吗,佳逼!!!!!!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)