我试图r
通过r
一些约束来枚举所有可能的大小矩阵。
- 行和列的总和必须按非升序排列。
- 从主对角线下方的左上角元素开始,该条目的每个行和列子集都必须由从 0 到该左上角条目(包括)中的值的替换组合组成。
- 行和列的总和必须都小于或等于预定的 n 值。
- 主对角线必须按非升序排列。
重要说明是,我需要将每个组合存储在某个地方,或者如果用 c++ 编写,则在找到它们后通过另外几个函数运行
r
并且n
是范围从 2 到 100 的值。
我尝试了一种递归方式以及迭代方式来执行此操作,但一直忙于跟踪列和行的总和,以及可管理的所有数据。
我附上了我最近的尝试(远未完成),但可能会让您了解正在发生的事情。
该函数first_section():
正确构建零行和零列,但除此之外我没有任何成功。
我需要的不仅仅是推动这件事,逻辑是一个痛苦的屁股,正在吞噬我。我需要用 python 或 C++ 编写这个。
import numpy as np
from itertools import combinations_with_replacement
global r
global n
r = 4
n = 8
global myarray
myarray = np.zeros((r,r))
global arraysums
arraysums = np.zeros((r,2))
def first_section():
bigData = []
myarray = np.zeros((r,r))
arraysums = np.zeros((r,2))
for i in reversed(range(1,n+1)):
myarray[0,0] = i
stuff = []
stuff = list(combinations_with_replacement(range(i),r-1))
for j in range(len(stuff)):
myarray[0,1:] = list(reversed(stuff[j]))
arraysums[0,0] = sum(myarray[0,:])
for k in range(len(stuff)):
myarray[1:,0] = list(reversed(stuff[k]))
arraysums[0,1] = sum(myarray[:,0])
if arraysums.max() > n:
break
bigData.append(np.hstack((myarray[0,:],myarray[1:,0])))
if printing: print 'myarray \n%s' %(myarray)
return bigData
def one_more_section(bigData,index):
newData = []
for item in bigData:
if printing: print 'item = %s' %(item)
upperbound = int(item[index-1]) # will need to have logic worked out
if printing: print 'upperbound = %s' % (upperbound)
for i in reversed(range(1,upperbound+1)):
myarray[index,index] = i
stuff = []
stuff = list(combinations_with_replacement(range(i),r-1))
for j in range(len(stuff)):
myarray[index,index+1:] = list(reversed(stuff[j]))
arraysums[index,0] = sum(myarray[index,:])
for k in range(len(stuff)):
myarray[index+1:,index] = list(reversed(stuff[k]))
arraysums[index,1] = sum(myarray[:,index])
if arraysums.max() > n:
break
if printing: print 'index = %s' %(index)
newData.append(np.hstack((myarray[index,index:],myarray[index+1:,index])))
if printing: print 'myarray \n%s' %(myarray)
return newData
bigData = first_section()
bigData = one_more_section(bigData,1)
一个可能的矩阵可能如下所示:r = 4, n >= 6
|3 2 0 0| = 5
|3 2 0 0| = 5
|0 0 2 1| = 3
|0 0 0 1| = 1
6 4 2 2