gpt4 book ai didi

wolfram-mathematica - Mathematica减少/解决: Best way to ask for non-repeating values

转载 作者:行者123 更新时间:2023-12-04 03:16:59 27 4
gpt4 key购买 nike

几次我发现我有一个系统,我需要指定所有变量都获得不同的值(即非重复)。

我通常会做这样的事情:

k = {a, b, c, d, e, f, g}; 
Reduce[
a != 2 && f == a + b && g == c - d && f == (d + e)/2 && f == e + g &&
First[And @@@ {0 < # < 8 & /@ k}] &&
Times@(Sequence @@ (Subsets[k, {2}] /. {x_, y_} -> (x - y))) != 0,
k, Integers]

约简方程的最后一部分
Times@(Sequence @@ (Subsets[k, {2}] /. {x_, y_} -> (x - y))) != 0

要求不同的值。

有更好的方法可以做到这一点吗? (我的意思是,不是乘积等于零,而是指定 I need all variables different)

最佳答案

对于较小的问题,最好进行后期处理以除去不需要的解决方案。对于较大的问题,至少有两种有用的方法。

(1)如果允许值是连续的或接近连续的,则可以为每个原始变量和可能值的网格创建0-1变量。例如,如果您的变量旨在填充标准Sudoku数组,则可以使用x [i,j,k] = 1来指示第i行col j的值是k。约束例如第1行中没有重复的值将是

Sum[x[1,j,1]==1, {j,9}]

...
Sum [x [1,j,9] == 1,{j,9}]

如果不是所有位置(例如行)都需要使用所有值,则可以将这些值设为不等式。

(2)另一种方法是,如果需要区分不同的值,则对每对使用0-1变量。我们假设在值范围上至少存在一个已知的上限和下限。称它为m。因此,对于任何一对变量x和y,我们都知道-m和m之间的差异(可以在其中添加/减去变量,但不是必需的)。

对于需要区分的x [i]和x [j]对,添加新变量0-1 k [i,j]。这个想法是,如果x [i]> x [j]为1,而x [j]> x [i]为0。

对于这对,我们添加两个方程。我将以非展开形式显示它们,因为这可能会更容易理解。
x[i]-x[j] >= k[i,j] + m*(k[i,j]-1)
x[j]-x[i] >= (1-k[i,j]) + m*(-k[i,j])

如果x [i]> x [j],则仅在k [i,j] == 1时才满足两个条件。反之亦然,x [j]> x [i]和k [i.j] == 0。

当变量可以覆盖的范围内的值远大于变量的数量时,或者当所有对被约束为不同值的情况要少得多时,这可能是首选方法。

丹尼尔·里奇布劳

*这是星期六晚上深夜,所以把我倒退的东西都倒过来。另外,请修正所有错别字。

关于wolfram-mathematica - Mathematica减少/解决: Best way to ask for non-repeating values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6158815/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com