⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 算法.txt

📁 偶数阶魔方和的算法 线性规划单纯形法VC源码
💻 TXT
📖 第 1 页 / 共 2 页
字号:

求 偶数阶魔方和的算法。

1)、当n为奇数时:采用连续斜行赋值法。首先把数1定在正中的下一格,数2定在1的斜行右下格,依此类推。即一般数i定在数i-1的斜行右下格(行数x列数y均增1)。直至当数i为n的倍数时,定在上一个数i-1格正下方的第2格(行数x增2,列数y不变)。按上述操作,格的位置(x,y)若超出n行n列的范围,按模n定位。即若出现x>n,则定在第x-n行;出现y>n,则定在第y-n列。
  2)、当n为4的倍数时:采用对称元素交换法。首先把数n×n-1按行从上至下,奇数行从左至右,偶数行从右至左顺序填人方阵的n×n格。然后,把方阵的所有4×4子方阵中的两对角线上位置(即(i-j) mod 4=0||(i+j-1) mod 4=0,其中i为行号,j为列号)上的数固定下来不动;所有其它位置上的数关于方阵中心作对称交换,也就是把元素a(i,j)与元素a(n+1-i,n+1-j)的值交换。
    3)、当n为非4倍数的偶数(即4m+2形)时:首先把大方阵分解为4个奇数(2m+1阶)子方阵。上述奇数阶魔方给分解的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
  上述交换使每行每列与两对角线上元素之和相等。

线性规划单纯形法VC源码

第一个,第一部分:
#include<stdio.h>
 #include<math.h>
 #include<iostream.h>
 float matrix[100][100],x[100]; /* 记录总方程的数组,解的数组 */
 int a[100]; /* 记录基础,非基础的解的情况,0:非基础,1:基础 */
 int m,n,s,type; /* 方程变量,约束数,求最大最小值的类型,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"); /* 输入方程变量和约束数 */
 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]; /* 剩余变量数组,松弛变量数组,人工变量数组 */
 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(); /* 打印结果 */
 if(!Rj()) in=Min(); /* 求换入基 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -