用c语言编写单纯形法的程序怎么写

Python018

用c语言编写单纯形法的程序怎么写,第1张

用c语言编写单纯形法的程序怎么写

#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()

}

还满意吗,佳逼!!!!!!!!