我需要算法来有效生成唯一的排序排列。它适用于新型神经网络。假设我们有N种类型的神经元(例如让它为3),它们是连接起来的。我们需要生成并测试所有可能但独特(不花时间)的网络。那是因为重复订单不会改变网络。我们只对独特的神经元类型指纹感兴趣。
例如,如果我们有3个神经元的网络(有3种类型) 在133之后(第一类的第一个neoron,-3d的第二个和-3d的第三个),然后331将是无效的,因为它是多余的,我们已经与第一类型的一个神经元和三种类型的两个神经元进行网络整合。 / p>
因此,3种可能类型的3个neorons网络的所有有效变体将是: 111 112 113 221 222 223 331 332 333 123
如何生成这样的排列? (不要存储序列的所有中间值,而是根据需要生成它们)
答案 0 :(得分:1)
您可以使用N
整数数组来完成此操作,其中值为1到M
,其中N
是神经元的数量,M
是神经元的数量类型。
将每个数组元素初始化为1
虽然没有终止:
2a上。增加第一个数组元素 - 如果新值小于或等于M,则返回数组状态,否则
2B。如果第一个数组元素现在大于M,则递增第二个数组元素并重新初始化第一个数组元素等于第二个数组元素 - 如果新值小于或等于M则返回数组状态,否则
2c中。如果第二个数组元素现在大于M,则递增第3个数组元素并重新初始化第1个和第2个数组元素,使其等于第3个数组元素 - 如果新值小于或等于M,则返回数组状态,否则
2X。等等。如果第N个数组元素增加到大于M,则算法终止。
关键是重新初始化(i-1)'元素,使其等于刚刚增加的 i'th 元素 - 这样可以避免重复。即,保持(i-1)'元素永远不会小于 i'th 元素的不变量。
例如,给定3种类型的3个神经元,这将产生排列(第一个索引在右边,第三个索引在左边)
111 112 113 122 123 133 222 223 233 333
int N = 3;
int M = 3;
int[] state = new int[N];
// initialize state so that incrementing it once generates the first legal value
state[0] = 0;
state[1] = 1;
state[2] = 1;
int[] getState() {
for(int i = 0; i < 3; i++) {
state[i]++;
if(state[i] <= M) {
for(int j = 0; j < i; j++) {
state[j] = state[i];
}
return state;
}
}
// no more legal values
state = null;
return state;
}