-2

假设我有这个矩阵

米=

 3     1     2     4     6     5
 2     3     5     6     1     4
 3     4     6     1     2     5
 2     1     3     4     5     6
 3     2     5     6     1     4
 2     4     6     1     5     3

其中有 6 个 raw 和 6 列

我想从原始顺序中随机选择第一个选择将选择第一个

那个原始的元素

因此,如果在覆盖原始 5 中的所有元素后随机出现,我不希望程序出现

再次从中选择

例如,如果随机迭代 1 选择 raw1,它将转到 raw1 中的第一个元素,即

在第 1 列

如果在迭代 2 中随机选择相同的 raw1,它将选择第二个

第 2 列中的 raw1 中的元素

因此,如果我到达 raw1 中的第 6 列,然后迭代再次选择 raw1,但我的

矩阵是 6 列,所以我想随机选择另一个原始数据,直到

第六栏

假设每次选择原始数据时,我都会在该列中创建一个等于

所以如果我运行 20 次迭代

杰米=

 1     1     1     1     1     0
 1     1     0     0     0     0
 1     1     1     1     0     0
 1     1     0     0     0     0
 1     1     1     0     0     0
 1     1     1     1     0     0

幸运的是,我没有达到任何原始数据的第六列

但如果

杰米=

 1     1     1     1     1     0
 1     1     1     1     0     0
 1     1     0     0     0     0
 1     1     1     1     1     1
 1     0     0     0     0     0
 1     1     0     0     0     0

尝试访问 m(5,7);索引超出范围,因为 size(m)=[6,6]。

如何继续随机选择而不会进入已经充满的原始状态

那个 raw 4 已经满了

我希望它很容易理解

我使用这种方法来创建染色体

形式为

m raw colmun =机器作业操作

谢谢

我正在使用 matlab

4

2 回答 2

0

这是我用 C++ 写的东西。希望这就是你要找的。不要犹豫,如果你不明白的东西问

#include "stdafx.h"
#include<fstream>
#include<ctime>
#include<iostream>

using namespace std;

ifstream f("stack2.in");
ofstream g("stack2.out");
int a[10][10]; 
int solution[100],n,m,index =0; 

void build(int n,int m)//create a MxN matrix, and fill it with values
{
    int zz = 1;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {

            a[i][j]= zz;
            zz++;
        }

}

void solve()
{
    srand((unsigned)time(0));
    int i,j;//column and line
    while(index<m*n)
    {

        i = (rand()%10);//get random values for column and line
        j = (rand()%10);

        if(a[i][j]!=0) //if the value of matrix[i][j] is not 0, means that this value is new, so we add it to the solution list
        {
            solution[index]=a[i][j];
            index++; 
            a[i][j]=0; //set the value from matrix[i][j] to 0 so we don't 'visit' again
        }

        else if(i<=n) //if the value from the matrix[i][j] is equal to 0, we start searching on the line of of i for values that are not 0
        {
            while(j<m)
            {
                if(a[i][j+1]!=0) //if matrix[i][j+1] has not been visited before, we add it to the solution, set it to zero and exit the while
                {
                    solution[index]= a[i][j+1];
                    a[i][j+1]=0;
                    index++;
                    j=m; //exit the while


                }
                else
                    j++; //keep searching for a value on that line
            }
        }   
    }

    for(int i=1;i<=m*n;i++)//print the list with random values
        g<<solution[i]<<" ";

}


int main()
{
    n=10;//or read the values from stack2.in using f>>n>>m 
    m=10;//in the file should be written on the same line, number of lines and columens of the matrix eg.: 5 7
    build(n,m);
    solve();
    return 0;
}
于 2013-11-02T16:13:47.777 回答
0

我可以看到三种略有不同的方法来实现这一点。您应该创建一个整数数组来存储包含您已经从每个原始数据中获取的元素数量的信息。让我们假设您的矩阵是[n*n]这样的数组[n]。让我们称之为a[n]

第一种方法:

  1. 生成随机原始数rNumber
  2. 检查您是否可以从此原始 ( if(rNumber] < n)) 中获取元素。如果您不能获取元素,请转到 (1)。否则继续 (3)
  3. 取一个元素m[rNumber][a[rNumber]]并递增a[rNumber]

第二种方法:

  1. 生成随机原始数rNumber
  2. 检查您是否可以从此原始 ( if(rNumber] < n))中获取元素
  3. 如果你不能取一个元素,那么去增量rNumber并去(2)。否则继续 (4)
  4. 取一个元素m[rNumber][a[rNumber]]并递增a[rNumber]

最后一种方法还需要存储您获取所有元素的原始数量rawCount

  1. 在和rNumber之间生成随机原始数0n-rawCount-1
  2. 枚举所有原始 while currentRaw < rNumber。如果a[currentRaw] < n然后递增currentRaw
  3. 取一个元素m[currentRaw][a[currentRaw]]并递增a[currentRaw]
  4. 如果a[currentRaw] = n然后递增rawCount
于 2013-11-02T14:05:24.427 回答