?? 算法.txt
字號:
求 偶數(shù)階魔方和的算法。
1)、當n為奇數(shù)時:采用連續(xù)斜行賦值法。首先把數(shù)1定在正中的下一格,數(shù)2定在1的斜行右下格,依此類推。即一般數(shù)i定在數(shù)i-1的斜行右下格(行數(shù)x列數(shù)y均增1)。直至當數(shù)i為n的倍數(shù)時,定在上一個數(shù)i-1格正下方的第2格(行數(shù)x增2,列數(shù)y不變)。按上述操作,格的位置(x,y)若超出n行n列的范圍,按模n定位。即若出現(xiàn)x>n,則定在第x-n行;出現(xiàn)y>n,則定在第y-n列。
2)、當n為4的倍數(shù)時:采用對稱元素交換法。首先把數(shù)n×n-1按行從上至下,奇數(shù)行從左至右,偶數(shù)行從右至左順序填人方陣的n×n格。然后,把方陣的所有4×4子方陣中的兩對角線上位置(即(i-j) mod 4=0||(i+j-1) mod 4=0,其中i為行號,j為列號)上的數(shù)固定下來不動;所有其它位置上的數(shù)關于方陣中心作對稱交換,也就是把元素a(i,j)與元素a(n+1-i,n+1-j)的值交換。
3)、當n為非4倍數(shù)的偶數(shù)(即4m+2形)時:首先把大方陣分解為4個奇數(shù)(2m+1階)子方陣。上述奇數(shù)階魔方給分解的4個子方陣對應賦值,上左子方最小(i),下右子次小(i+v),下左子方最大(i+3v),上右子方次大(i+2v),即4個子方陣對應元素相差v,其中v=n*n/4,然后作相應的元素交換:
a(i,j)與a(i+u,j)在同一列做對應交換(j<t或j>n-t+2)
a(t,1)與a(t+u,1);a(t,t)與a(t+u,t)兩對元素交換
其中u=n/2,t=(n+2)/4
上述交換使每行每列與兩對角線上元素之和相等。
線性規(guī)劃單純形法VC源碼
第一個,第一部分:
#include<stdio.h>
#include<math.h>
#include<iostream.h>
float matrix[100][100],x[100]; /* 記錄總方程的數(shù)組,解的數(shù)組 */
int a[100]; /* 記錄基礎,非基礎的解的情況,0:非基礎,1:基礎 */
int m,n,s,type; /* 方程變量,約束數(shù),求最大最小值的類型,0:最小 1:最大 */
int indexe,indexl,indexg; /* 剩余變量,松弛變量,人工變量 */
void Jckxj()
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<s;j++)
if(matrix[i][j]==1&&a[j]==1){
x[j]=matrix[i][s];
j=s;
}
for(i=0;i<s;i++)
if(a[i]==0) x[i]=0;
}
int Rj()
{
int i;
for(i=0;i<s;i++)
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=1;i<s;i++)
if(min>matrix[n][i]){
min=matrix[n][i];
temp=i;
}
return temp;
}
void JustArtificial()
{
int i;
for(i=m+indexe+indexl;i<s;i++)
if(fabs(x[i])>=0.000001){
printf("No Answer\n");
return;
}
}
int Check(int in)
{
int i;
float max1=-1;
for(i=0;i<n;i++)
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=0;i<n;i++)
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=0;i<s;i++)
if(a[i]==1&&matrix[*temp][i]==1) return i;
}
void Mto(int in,int temp)
{
int i;
for(i=0;i<=s;i++)
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=0;i<=n;i++){
c=matrix[i][in]/matrix[temp][in];
if(i!=temp)
for(j=0;j<=s;j++)
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=0;i<n;i++){
for(k=temp;k<s;k++)
if(a[k]==1){
printf("X%d ",k);
temp=k+1;
k=s;
}
for(j=0;j<=s;j++)
printf("%8.2f",matrix[i][j]);
printf("\n");
}
printf("Rj ");
for(j=0;j<=s;j++)
printf("%8.2f",matrix[n][j]);
printf("\n");
}
void InitPrint()
{
int i;
printf("X");
for(i=0;i<s;i++)
printf(" a%d",i);
printf(" b\n");
Print();
printf("\n");
}
void Result()
{
int i;
printf(" (");
for(i=0;i<s;i++)
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=0;i<n;i++){
for(j=m;j<m+indexe;j++)
if(nget[i][j-m]!=-1) matrix[i][j]=0;
else matrix[i][j]=-1;
for(j=m+indexe;j<m+indexe+indexl;j++)
if(nlet[i][j-m-indexe]!=1) matrix[i][j]=0;
else matrix[i][j]=1;
for(j=m+indexe+indexl;j<s;j++)
if(net[i][j-m-indexe-indexl]!=1) matrix[i][j]=0;
else matrix[i][j]=1;
matrix[i][s]=b[i];
}
for(i=m;i<m+indexe+indexl;i++)
matrix[n][i]=0;
for(i=m+indexe+indexl;i<s;i++)
matrix[n][i]=100;
matrix[n][s]=0;
}
void ProcessA()
{
int i;
for(i=0;i<m+indexe;i++)
a[i]=0;
for(i=m+indexe;i<s;i++)
a[i]=1;
}
第一個 第二部分
void Input(float b[],int code[])
{
int i=0,j=0;
printf("The equator Variable and Restrictor\n"); /* 輸入方程變量和約束數(shù) */
cin>>m>>n;
for(i=0;i<n;i++){
printf("Input b[] and Restrictor code 0:<= 1:= 2:>=\n"); /* 輸入方程右邊的值,code的值 */
cin>>b[i]>>code[i];
printf("The XiShu\n");
for(j=0;j<m;j++)
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"); /* 輸入z */
for(i=0;i<m;i++)
cin>>matrix[n][i];
if(type==1)
for(i=0;i<m;i++)
matrix[n][i]=-matrix[n][i];
}
void Xartificial()
{
int i,j,k;
if(indexg!=0){
for(i=m+indexe+indexl;i<s;i++){
for(j=0;j<n;j++)
if(matrix[j][i]==1){
for(k=0;k<=s;k++)
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=0;i<n;i++)
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]; /* 剩余變量數(shù)組,松弛變量數(shù)組,人工變量數(shù)組 */
indexe=indexl=indexg=0;
for(i=0;i<n;i++){
if(code[i]==0){nlet[i][indexl++]=1; Process(nlet,i,indexl-1);}
if(code[i]==1){ net[i][indexg++]=1; Process(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(); /* 初始化a[] */
InitPrint(); /* 初始化打印 */
Xartificial(); /* 消去人工變量 */
}
void Simplix() /* 單純型算法 */
{
int in,out,temp=0;
while(1){
Jckxj(); /* 基礎可行解 */
Print(); /* 打印 */
Result(); /* 打印結(jié)果 */
if(!Rj()) in=Min(); /* 求換入基 */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -