?? 算法.txt
字號:
else {
if(indexg!=0) JustArtificial(); /* 判斷人工變量 */
PrintResult(); /* 打印最后結果 */
return;
}
if(Check(in)){ /* 判斷無界情況 */
printf("No Delimition\n");
return;
}
out=SearchOut(&temp,in); /* 求換出基 */
Mto(in,temp); /* 主元化1 */
Be(temp,in); /* 初等變換 */
Achange(in,out); /* 改變a[]的值 */
}
}
void main()
{
int code[100]; /* 輸入符號標記 */
float b[100]; /* 方程右值 */
Input(b,code); /* 初始化 */
Sstart(b,code); /* 化標準型 */
Simplix(); /* 單純型算法 */
}
實驗報告:
***************************************************************************************
*********************************運籌學單純形法解線性規劃問題(C++實現,VC6.0中通過)**********************************
函數列表:
Jckxj
Rj
Min
JustArtificial
Check
SearchOut
Mto
Be
Achange
Print
InitPrint
Result
PrintResult
Merge
ProcessA
Input
Xartificial
Process
Sstart
Simplix
while
main
變量:
float matrix[100][100],x[100] 記錄總方程的數組,解的數組
int a[100] 記錄基礎,非基礎的解的情況,0:非基礎,1:基礎
int m,n,type 方程變量,約束數,求最大最小值的類型,0:最小 1:最大
int indexe,indexl,indexg 剩余變量,松弛變量,人工變量
輸入提示:
equator Variable 變量個數;
Restrictor 約束條件個數;(注:這里程序默認X(i)>0;否則對每個X(i)我們均要添加一個約束條件X(i)>0)
b[] 約束條件右端項;
Restrictor code 約束條件不等式符號編碼;(0表示<=;1表示=;2表示>=)
The XiShu 各約束條件中X(i)對應的系數
The Type Z的最優方向(0表示MIN;1表示MAX)
The Z 目標函數的系數
輸入例子:
MAX Z=4X(1)+3X(2)
S.T. 2X(1)+3X(2)<=24
3X(1)+2X(2)<=26
X(1),X(2)>=0
運行1000432.exe
The equator Variable and Restrictor:
2 2
Input b[] and Restrictor code 0:<= 1:= 2:>=
24 0
The XiShu
2 3
Input b[] and Restrictor code 0:<= 1:= 2:>=
26 0
The XiShu
3 2
The Type 0:Min 1:Max
1
The Z
4 3
結果輸出:
X a0 a1 a2 a3 b
X2 2.00 3.00 1.00 0.00 24.00
X3 3.00 2.00 0.00 1.00 26.00
Rj -4.00 -3.00 0.00 0.00 0.00
X2 2.00 3.00 1.00 0.00 24.00
X3 3.00 2.00 0.00 1.00 26.00
Rj -4.00 -3.00 0.00 0.00 0.00
( 0.00 0.00 24.00 26.00 ) Zmax=0.000000
X0 0.00 1.67 1.00 -0.67 6.67
X2 1.00 0.67 0.00 0.33 8.67
Rj 0.00 -0.33 0.00 1.33 34.67
( 8.67 0.00 6.67 0.00 ) Zmax=34.666668
X0 0.00 1.00 0.60 -0.40 4.00
X1 1.00 0.00 -0.40 0.60 6.00
Rj 0.00 0.00 0.20 1.20 36.00
( 6.00 4.00 0.00 0.00 ) Zmax=36.000000
The Maximum :36.000000
從而可知:MAX Z=36,此時X(1)=6,X(2)=4.
實驗成功。
wo 的程序有bug,約束條件右端不能出現負值,否則得不到結果。
試驗證該例:
min w=2x1+7x2
s.t. -x1+x2<=14
5x1+2x2<=50
-x1-2x2<=18
第二個 第一部分:
#include <iostream.h>
#include <conio.h>
#include <math.h>
typedef int BOOL;
#define TRUE 1
#define FALSE 0
typedef double REAL;
#define ZERO 1e-10
//矩陣求逆
BOOL Inv( REAL ** a, int n );
BOOL Inv(REAL * a,int n);
//矩陣相乘
void Damul(REAL * a,REAL * b,size_t m,size_t n,size_t k,REAL * c);
//線形規劃--修正的單純形法,返回真表示計算成功,返回假表示計算失敗
BOOL Line_Optimize(REAL * A, REAL * B, REAL * C, int m, int n,
REAL * Result, REAL * X, int * Is);
//A-----------等式約束的系數矩陣
//B-----------等式約束右端常數
//C-----------所求最小值表達式的各項系數
//m-----------系數矩陣行數
//n-----------系數矩陣列
//Result------返回最小值
//X-----------返回計算結果
//Is----------作為基底的X索引,計算結束后返回各X值所在索引
template <class T>
inline void ExChange( T& a, T& b )
{
T temp=a;
a = b;
b = temp;
}
BOOL Inv( REAL ** a, int n )
{
REAL d;
int i,j,k;
int success = FALSE;
int * is=new int [n];
int * js=new int [n];
for (k=0;k<n;k++){
d=0.0;
for(i=k;i<n;i++){
for(j=k;j<n;j++){
if (fabs(a[i][j])>d){
d=fabs(a[i][j]);
is[k]=i;
js[k]=j;
}
}
}
if( d<ZERO ) goto Clear;
for( j=0; j<n; j++ )ExChange( a[k][j], a[is[k]][j] );
for( i=0; i<n; i++ )ExChange( a[i][k], a[i][js[k]] );
a[k][k]=1/a[k][k];
for( j=0; j<n; j++ ){
if( j!=k )a[k][j]*=a[k][k];
}
for( i=0; i<n; i++){
if ( i!=k ){
for( j=0; j<n; j++ )
if( j!=k )a[i][j]-=a[i][k]*a[k][j];
}
}
for( i=0; i<n; i++ ){
if ( i!=k ){
a[i][k]*=((-1.0)*a[k][k]);
}
}
} //end for
for( k=n-1; k>=0; k-- ){
for( j=0; j<n; j++ )ExChange( a[k][j], a[js[k]][j] );
for( i=0; i<n; i++ )ExChange( a[i][k], a[i][is[k]] );
}
success = TRUE;
Clear:
delete [] is;
delete [] js;
return success;
}
BOOL Inv(REAL * a,int n)
{
REAL **kma = new REAL*[n];
for(int i=0;i<n;i++){
kma[i]=a+i*n;
}
BOOL ret=Inv( kma,n);
delete [] kma;
return ret;
}
void Damul(REAL * a,REAL * b,size_t m,size_t n,size_t k,REAL * c)
{
int i,j,l,u;
for (i=0; i<=m-1; i++){
for (j=0; j<=k-1; j++){
u=i*k+j;
c[u]=0.0;
for (l=0; l<=n-1; l++){
c[u] += a[i*n+l]*b[l*k+j];
}
}
}
return;
}
BOOL Line_Optimize(REAL * A, REAL * B, REAL * C, int m, int n,
REAL * Result, REAL * X, int * Is)
{
REAL r;
int i,j,k;
int Success = FALSE;
REAL* b = new REAL [m*m];
REAL* MatTmp = new REAL [m*m];
REAL* Mat1 = new REAL [m];
REAL* Mat2 = new REAL [m];
REAL* E = new REAL [m*m];
for (i=0; i<m; i++){
for (j=0; j<m; j++){
b[i*m+j] = A[i*n+Is[j]];
}
}
if (!Inv(b,m)){
goto Release;
}
Damul(b,B,m,m,1,X);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -