正交实验正交表的创建
来源:互联网 发布:阿里云nodejs环境部署 编辑:程序博客网 时间:2024/04/29 17:51
#include<iostream>
#include<stdio.h>
#include<vector>
#include<fstream>
#include<stdlib.h>
using namespace std;
typedef struct{
long int *col_length;//
int length;//产生的个体数量
int dimension;//维数
}Pop;//正交表
int my_pow(const int q, int j)
{
int temp = 1;
for (int i = 1; i <= j; i++)
temp = q*temp;
return temp;
}
int Select_j(const int q, const int f){//提取J
int j = 0;
int temp = 1;
for (j = 1; j <20; j++)
{
temp *= q;
if ((temp - 1) / (q - 1) >= f)
{
break;
}
}
return j;
}
void Initial_arry(const int &q,const int &f, vector<Pop> &pop)//水平数,因素数
{
int J = Select_j(q, f);//计算J的取值
const int pop_num = my_pow(q, J);//生成种群数
for (int j = 1; j <= pop_num; j++)//清空操作
{
pop[j].col_length = new long int[pop_num + 1];//种群数组
for (int i = 1; i <= pop_num; i++)
{
pop[j].col_length[i] = 0;
}
}
}
//删除动态申请的数组
void Delete(vector<Pop> &pop){
for (vector<Pop>::iterator pop_iter = pop.begin(); pop_iter != pop.end(); pop_iter++)
{
delete[]pop_iter->col_length;
}
}
//创建正交矩阵
void Construct_Orthogonal(const int q, const int Orthogonal_f, vector<Pop> &pop)
{
Initial_arry(q, Orthogonal_f,pop);
int J = Select_j(q, Orthogonal_f);//计算J的取值
int F_n;
int Q_j = my_pow(q, J);
if (((Q_j - 1) / (q - 1)) == Orthogonal_f)
{
F_n = Orthogonal_f;
}
else
{
F_n = (Q_j - 1) / (q - 1);
}
for (int k = 1; k <= J; k++)
{
int j = (my_pow(q, k - 1) - 1) / (q - 1) + 1;
//cout << "j=" << j << ",";
for (int i = 1; i <= my_pow(q, J); i++)
{
pop[j].col_length[i] = int(((i - 1) / my_pow(q, J - k)) % q);
}
}
for (int k = 2; k <= J; k++)
{
int j = (my_pow(q, k - 1) - 1) / (q - 1) + 1;
for (int s = 1; s <= j - 1; s++)
{
for (int t = 1; t <= q - 1; t++)
{
for (int i = 1; i <= my_pow(q, J); i++)
{
pop[j + (s - 1)*(q - 1) + t].col_length[i] = (pop[s].col_length[i] * t + pop[j].col_length[i]) % q;
}
}
}
}
for (int j = 1; j <= Orthogonal_f; j++)
{
for (int i = 1; i <= my_pow(q, J); i++)
{
pop[j].col_length[i] += 1;
}
}
//测试输出操作
ofstream Orthogonal_Table("Orthogonal_Table.csv", ios::app);
if (!Orthogonal_Table)
{
cout << "打开 Orthogonal_Table.csv 失败" << endl;
return;
}
cout << "——————————输出正交矩阵——————————" << endl;
for (int i = 1; i <= Q_j; i++)
{
for (int j = 1; j <= Orthogonal_f; j++)//清空操作
{
cout << pop[j].col_length[i] << ",";
Orthogonal_Table << pop[j].col_length[i] << ",";
}
cout << endl;
Orthogonal_Table << endl;
}
Orthogonal_Table.close();
Delete(pop);
}
int main(){
int q = 5;
int f = 30;
int J = Select_j(q,f);
const int pop_num = my_pow(q, J);
vector<Pop> pop(pop_num + 1);
Construct_Orthogonal(q, f, pop);
system("pause");
return 0;
}
#include<stdio.h>
#include<vector>
#include<fstream>
#include<stdlib.h>
using namespace std;
typedef struct{
long int *col_length;//
int length;//产生的个体数量
int dimension;//维数
}Pop;//正交表
int my_pow(const int q, int j)
{
int temp = 1;
for (int i = 1; i <= j; i++)
temp = q*temp;
return temp;
}
int Select_j(const int q, const int f){//提取J
int j = 0;
int temp = 1;
for (j = 1; j <20; j++)
{
temp *= q;
if ((temp - 1) / (q - 1) >= f)
{
break;
}
}
return j;
}
void Initial_arry(const int &q,const int &f, vector<Pop> &pop)//水平数,因素数
{
int J = Select_j(q, f);//计算J的取值
const int pop_num = my_pow(q, J);//生成种群数
for (int j = 1; j <= pop_num; j++)//清空操作
{
pop[j].col_length = new long int[pop_num + 1];//种群数组
for (int i = 1; i <= pop_num; i++)
{
pop[j].col_length[i] = 0;
}
}
}
//删除动态申请的数组
void Delete(vector<Pop> &pop){
for (vector<Pop>::iterator pop_iter = pop.begin(); pop_iter != pop.end(); pop_iter++)
{
delete[]pop_iter->col_length;
}
}
//创建正交矩阵
void Construct_Orthogonal(const int q, const int Orthogonal_f, vector<Pop> &pop)
{
Initial_arry(q, Orthogonal_f,pop);
int J = Select_j(q, Orthogonal_f);//计算J的取值
int F_n;
int Q_j = my_pow(q, J);
if (((Q_j - 1) / (q - 1)) == Orthogonal_f)
{
F_n = Orthogonal_f;
}
else
{
F_n = (Q_j - 1) / (q - 1);
}
for (int k = 1; k <= J; k++)
{
int j = (my_pow(q, k - 1) - 1) / (q - 1) + 1;
//cout << "j=" << j << ",";
for (int i = 1; i <= my_pow(q, J); i++)
{
pop[j].col_length[i] = int(((i - 1) / my_pow(q, J - k)) % q);
}
}
for (int k = 2; k <= J; k++)
{
int j = (my_pow(q, k - 1) - 1) / (q - 1) + 1;
for (int s = 1; s <= j - 1; s++)
{
for (int t = 1; t <= q - 1; t++)
{
for (int i = 1; i <= my_pow(q, J); i++)
{
pop[j + (s - 1)*(q - 1) + t].col_length[i] = (pop[s].col_length[i] * t + pop[j].col_length[i]) % q;
}
}
}
}
for (int j = 1; j <= Orthogonal_f; j++)
{
for (int i = 1; i <= my_pow(q, J); i++)
{
pop[j].col_length[i] += 1;
}
}
//测试输出操作
ofstream Orthogonal_Table("Orthogonal_Table.csv", ios::app);
if (!Orthogonal_Table)
{
cout << "打开 Orthogonal_Table.csv 失败" << endl;
return;
}
cout << "——————————输出正交矩阵——————————" << endl;
for (int i = 1; i <= Q_j; i++)
{
for (int j = 1; j <= Orthogonal_f; j++)//清空操作
{
cout << pop[j].col_length[i] << ",";
Orthogonal_Table << pop[j].col_length[i] << ",";
}
cout << endl;
Orthogonal_Table << endl;
}
Orthogonal_Table.close();
Delete(pop);
}
int main(){
int q = 5;
int f = 30;
int J = Select_j(q,f);
const int pop_num = my_pow(q, J);
vector<Pop> pop(pop_num + 1);
Construct_Orthogonal(q, f, pop);
system("pause");
return 0;
}
0 0
- 正交实验正交表的创建
- 正交的概念以及正交实验
- 实验常用正交表
- 实验常用正交表
- 实验常用正交表
- 正交表的性质
- 正交
- 正交表
- C#中三维正交数组的创建
- 函数的正交与向量正交
- 谁会正交设计实验的 请进 求求了……
- 正交表的查询地址汇总
- 正交实验法的由来
- 正交的 (orthogonal)
- 特别的正交测试
- 正交信号的理解
- 正交表学习笔记
- 常用正交表
- More Effective C++学习笔记(3)-异常
- xor看重复问题
- 简单的C编译器
- 针对简历做一些知识点的总结与归纳
- <<UNIX环境高级编程>>之第三章理解
- 正交实验正交表的创建
- 聊聊高并发系统之HTTP缓存
- 回文字符串
- 如何解决input,inline-block元素间的空隙
- js异常
- exVim安装
- WindowManager addView
- 问题二:用C++输出第一张图片
- 【典型例题】TreeSet排序