正交实验正交表的创建

来源:互联网 发布:阿里云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;
}
0 0