Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 为具有已知行/列和和和最大单元格值的矩阵找到可能的解_Arrays_Algorithm_Linear Programming_Subset Sum - Fatal编程技术网

Arrays 为具有已知行/列和和和最大单元格值的矩阵找到可能的解

Arrays 为具有已知行/列和和和最大单元格值的矩阵找到可能的解,arrays,algorithm,linear-programming,subset-sum,Arrays,Algorithm,Linear Programming,Subset Sum,我试图找到一个矩阵的解,在这个矩阵中,我知道行和列的和以及一个单元格可以拥有的最大值。我想找到在约束范围内的可能解决方案。我已经尝试过各种各样的方法,比如构建一个包含所有单元格值的数组,然后按顺序从每个单元格中选取,但是无论我尝试什么,我总是会遇到一个问题,即单元格的值用完了。 我还尝试了一个递归算法,但是我只得到了第一个结果,或者没有得到任何解决方案。我想我必须用回溯算法来做这个?不确定 任何帮助或指点都将不胜感激 行和A、B、C、列和X、Y、Z以及每个列的最大值?大家都知道。所有值都是正整数

我试图找到一个矩阵的解,在这个矩阵中,我知道行和列的和以及一个单元格可以拥有的最大值。我想找到在约束范围内的可能解决方案。我已经尝试过各种各样的方法,比如构建一个包含所有单元格值的数组,然后按顺序从每个单元格中选取,但是无论我尝试什么,我总是会遇到一个问题,即单元格的值用完了。 我还尝试了一个递归算法,但是我只得到了第一个结果,或者没有得到任何解决方案。我想我必须用回溯算法来做这个?不确定

任何帮助或指点都将不胜感激

行和A、B、C、列和X、Y、Z以及每个列的最大值?大家都知道。所有值都是正整数

    C1 | C2 | C3 
-----------------
R1 | ? | ?  | ? | A
-----------------
R2 | ? | ?  | ? | B
-----------------
R3 | ? | ?  | ? | C
-----------------
     X | Y | Z
如果您听说过(LP)及其“近亲”(ILP,MILP),这可能是帮助您高效解决问题的好方法。
线性规划由一组变量(矩阵未知数)、约束(最大值、行和列之和)和一个最小化或最大化的目标函数(此处无)组成

让我们调用x[i][j]您正在寻找的值。 使用以下数据:

NxM
矩阵的尺寸
max_val[i][j]
变量的最大值
x[i][j]

行值[i]
行值的总和
i

col_val[j]
j

那么,一个可能解决您问题的线性规划是:

// declare variables
int x[N][M] // or eventually float x[N][M] 
// declare constaints
for all i in 1 .. N, j in 1 .. M, x[i][j] <= max_val[i][j]
for all i in 1 .. N, sum[j in 1 .. M](x[i][j]) == row_val[i]
for all j in 1 .. M, sum[i in 1 .. N](x[i][j]) == col_val[j]
// here the objective function is useless, but you still will need one
// for instance, let's minimize the sum of all variables (which is constant, but as I said, the objective function does not have to be useful)
minimize sum[i in 1 .. N](sum[j in 1 .. M](x[i][j]))
// you could also be more explicit about the uselessness of the objective function
// minimize 0
//声明变量
int x[N][M]//或最终浮点x[N][M]
//宣布停战

就我所知1。。N、 j在1。。M、 x[i][j]正如您在评论中所写,您希望提出自己的解决方案,这里有一些指导原则:

使用一个解决方案。您的值空间由3*3=9个独立值组成,每个值介于
1
maxval[i][j]
之间。您的约束将是行和列的总和(所有这些都必须匹配)

使用所有
1
s初始化您的空间,然后增加它们,直到它们达到
maxval
。仅在每个值涵盖该条件后才计算条件(特别是,在3个值之后,可以计算第一行、第二行、第7列第一列、第8列第二列以及第9列第三列和第三列)

如果你到达第九个,在所有条件都满足的情况下,你就有了一个解决方案。否则,尝试从
1
maxval
的值,如果两者都不匹配,请后退。如果对第一个值进行迭代,则没有解决方案

就这些


更高级的回溯:

移动值仅为左上角的2*2=4个值。计算第三列,条件是该特定元素的值必须介于
1
maxval
之间。 定义
[1][1]
元素后,需要使用列和计算
[2][2]
索引,并通过行和验证其值(反之亦然)。应用与上述相同的处理规则:迭代所有可能的值,如果不匹配则后退,并且仅在可以应用规则时检查规则

这是一种更快的方法,因为您有5个绑定变量(底部和右侧行),而只有4个未绑定变量。这些是根据您的特定规则进行的优化。不过,实现起来有点复杂


PS:
1
之所以使用,是因为您有正整数。如果你有非负整数,你需要从
0

开始,答案应该是整数还是实数?我只寻找整数如果整数可以是负的,那么如果一个实例有任何答案,那么它有无限多的答案:选择任意2行a、b和任意2列c、d,以及任意整数x,并将x添加到位置(a、c)和(b,d),并从位置(a,d)和(b,c)中减去x,得到的行和列总和不变。对不起,应该提到:只有正整数值感谢响应。我不确定我是否正确理解了代码。第一步是通过遍历矩阵中的所有行/列并填充max_val数组来声明约束。在下一步中,我将遍历矩阵I中的所有元素,并构建所有元素j的总和?或者求和是另一个数组?哦,好的,这描述了解算器的问题,然后解算器给出了问题的解决方案。我很想用php或js或其他语言来解决这个问题,但这看起来像是一个更难的问题,我认为它是…特别是,如果行和的和与列和的和不匹配,那么就没有解决方案。你可以提前检查一下。如果该条件通过,则需要在回溯中迭代时检查其中一个条件。这适用于我上面写的两种变体。@哪种回溯:解决方案1、解决方案2还是一般的回溯?解决方案1通常会设置两个for循环,但这不起作用here@Permian回溯是一个while循环。在这个特定的示例中,您可以使用9来表示循环,而不是回溯
// declare your problem input
int row_val[1..3] = [7, 11, 8];
int col_val[1..3] = [14, 6, 6];
int max_val[1..3][1..3] = [[10, 10, 10], [10, 10, 10], [10, 10, 10]];

// declare your decision variables
dvar int x[1..3][1..3];

// objective function
minimize 0;

// constraints
subject to {
    forall(i in 1..3, j in 1..3) x[i][j] <= max_val[i][j];
    forall(i in 1..3) sum(j in 1..3) x[i][j] == row_val[i];
    forall(j in 1..3) sum(i in 1..3) x[i][j] == col_val[j];
}