Python 函数,该函数应使用定义为输入列表的行/列之和生成矩阵
我有一个任务,使函数从范围(0-8)内的非负整数生成矩阵Python 函数,该函数应使用定义为输入列表的行/列之和生成矩阵,python,matrix,random,Python,Matrix,Random,我有一个任务,使函数从范围(0-8)内的非负整数生成矩阵 该函数的输入有两个列表: sumForEveryCol sumForEveryRow 每个列表包含每个行/列的值的总和 示例:sumForEveryRow应按其索引包含每行的总和(sumForEveryRow[0]=第一行的总和…等等) sumForEveryColumn[0]=第一列的总和。。sumForEveryColumn[1]-第二列。。) 每行或每列之和为40的常数值 任何单元格的值都应在0到8之间 我有一些奇怪的想法(
- 该函数的输入有两个列表:
- sumForEveryCol
- sumForEveryRow
- 每个列表包含每个行/列的值的总和
- 示例:sumForEveryRow应按其索引包含每行的总和(sumForEveryRow[0]=第一行的总和…等等)
- sumForEveryColumn[0]=第一列的总和。。sumForEveryColumn[1]-第二列。。)
- 每行或每列之和为40的常数值
- 任何单元格的值都应在0到8之间
sumsForEveryRow = [4,20,8,8] = constant 40
sumsForEveryCol = [8,8,8,8,8] = constant 40
gen_matrix(sumForEveryRow, sumForEveryCol) should produce random matrix like:
[ 0 , 2 , 0 , 0 , 2 ], - sum of row 1 should be 4
[ 1 , 2 , 8 , 5 , 4 ], - sum of row 2 should be 20
[ 3 , 2 , 0 , 3 , 0 ], - sum of row 3 should be 8
[ 4 , 2 , 0 , 0 , 2 ], - sum of row 4 should be 8
sum for every column should be
8 8 8 8 8
import random
import numpy
sumsForEveryCol = [8,8,8,8,8]
sumsForEveryRow = [4,20,8,8]
def gen_matrix(sumForEveryCol, sumForEveryRow):
sum = 40
max_value_cell = 8
num_of_rows = len(sumsForEveryRow)
num_of_cols = len(sumsForEveryCol)
matrix = numpy.zeros((num_of_rows, num_of_cols), dtype=numpy.int)
for i in range(0, num_of_rows - 1):
cur_row_sum = sumsForEveryRow[i]
for j in range(0, num_of_cols - 1):
if max_value_cell >= cur_row_sum:
if cur_row_sum == 0:
matrix[i][j] = 0
else:
# Dont generate 0 values ????
rand_digit = random.randint(1, cur_row_sum)
cur_row_sum = cur_row_sum - rand_digit
matrix[i][j] = rand_digit
else:
rand_digit = random.randint(0, max_value_cell)
matrix[i][j] = rand_digit
cur_row_sum = cur_row_sum - rand_digit
return matrix
你说的“随机”到底是什么意思?如果说“non-random”是一条红鲱鱼,那么每个non-random函数都只是随机函数()的一个特例,这很简单。如果“随机”的意思是分布在所有可能解的集合上应该是一致的,那么实现起来可能会有点复杂。指定您心目中的“随机性”类型。我根本不需要所有可能的解决方案。我需要一个满足任务条件的答案…如上所述:如果您需要一个答案,并且不关心解决方案,那么实现找到第一个解决方案的确定性算法。但是,您应该从
gen\u random\u matrix
的名称中删除“random”。否则,您必须指定“随机”是什么意思。“算法是什么”——为什么要用“the”这个词?有许多方法,例如回溯。我很懒,所以我个人的偏好是写一个快速进化算法(这让我想起了一些幻方,我在进化幻方方面取得了很好的成功)。这可以被认为是一种具有虚拟目标函数的算法。列可以被视为源,行可以被视为汇。目标列编号可以视为供给,行目标编号可以视为需求。位于(i,j)
位置的数字x
对应于从源i
流向接收器j
的x
单元。可以将x
上的限制视为边缘上的容量。单纯形算法可以解决这个问题,尽管可能有些过分。