Я пытаюсь перечислить все возможные матрицы размером 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