可以基于变量的特定总和的结果来计算变量值的算法

时间:2019-03-28 15:50:12

标签: algorithm math solver minesweeper

这可能是一个重复的问题,但是我在堆栈溢出时找不到。

带一些变量,这些变量都代表某种机会。这意味着所有变量的值都介于零到一之间(包括两者之间)。这些值未知。但是,我有一些方程,其中一些或所有这些变量的结果是已知的。

例如,使用变量abcxy。它们的值都是0到1(含两者)之间的未知数。我有以下等式:

1: a + b + c = 1
2: a + b + x = 2
3: b + c + y = 2
4: a + x <= 1    ->    0 <= a + x <= 1
5: c + y <= 1    ->    0 <= c + y <= 1

解决此问题可获得以下结果:

2: a + x + b = 2
   (something between 0 and 1) + b = 2
   b = 2 - (something between 0 and 1)
   1 <= b <= 2
   b = 1 (since 0 <= b <= 1 applies too)

1: a + b + c = 1
   a + 1 + c = 1
   a + c = 0
   a = -c
   a = 0  (since 0 <= a <= 1 and 0 <= c <= 1 apply)
   c = 0

2: a + b + x = 2   |   3: b + c + y = 2
   0 + 1 + x = 2   |      1 + 0 + y = 2
   x = 1           |      y = 1

-> a = 0, b = 1, c = 0, x = 1 and y = 1

我在纸上解决了这个问题,我的实际目的是通过给每个未公开的单元分别分配一个变量x a b c y来证明以下扫雷情况。由于xyb成为一个,因此可以对其进行标记:

Minesweeper 2

我的一般目的是使用这种技术来解决扫雷板,但是它可以在其他软件中使用。但是,如果我想让计算机使用此技术来解决扫雷板,那么计算机必须使用一种算法来解决这种情况,其中包括任意数量的变量和任意数量的方程式。是否有通用的算法可以做到这一点?如果有的话,我应该如何实现该算法?

  

使事情变得显而易见

     
      
  • 方程式是一个变量或某些变量的总和,结果有限或恒定,始终为正。
  •   
  • 变量是介于0到1(包括两者)之间的未知值。
  •   
  • 该算法吸收具有相应变量名称的变量数量,以及定义一些变量的方程式。
  •   
  • 该算法尝试计算尽可能多的值。无法确定的值仍然不确定。
  •   

1 个答案:

答案 0 :(得分:3)

通常,您有一个N维向量空间,N个独立变量可以在该向量空间上变化。您的每个约束都定义了向量空间的一个区域,所有这些区域的交集就是您要确定的区域。实际上,您正在寻找该区域的最简单(最少复杂)描述,因为该区域已经由约束集合进行了描述。存在三种可能性:第一,该地区没有解决方案;第二,该地区没有解决方案。第二,该地区有有限数量的解决方案;第三,该地区有无数种解决方案。

您的第一步可能是将方程式(如果有的话)视为方程式系统,并使用一种求解方程式的算法来仅从方程式中解决尽可能多的问题。如果没有其他问题,则消除一些变量将有助于下一步。

1: a + b + c = 1
2: a + b + x = 2
3: b + c + y = 2

1: a = 1 - b - c
2: 1 - b - c + b + x = 2
3: b + c + y = 2

1: a = 1 - b - c
2: c = x - 1
3: b + x - 1 + y = 2

1: a = 1 - b - c
2: c = x - 1
3: b = 3 - x - y

1: a = y - 1
2: c = x - 1
3: b = 3 - x - y

这是我们所能做到的。接下来,我们将其替换为完整的不平等系统:

A: 0 <= a <= 1
B: 0 <= b <= 1
C: 0 <= c <= 1
D: 0 <= x <= 1
E: 0 <= y <= 1
F: 0 <= a + x <= 1
G: 0 <= c + y <= 1

A: 0 <= y - 1 <= 1
B: 0 <= 3 - x - y <= 1
C: 0 <= x - 1 <= 1
D: 0 <= x <= 1
E: 0 <= y <= 1
F: 0 <= y - 1 + x <= 1
G: 0 <= x - 1 + y <= 1

A: 1 <= y <= 2
B: 3 >= x + y >= 2
C: 1 <= x <= 2
D: 0 <= x <= 1
E: 0 <= y <= 1
F: 1 <= y + x <= 2
G: 1 <= x + y <= 2

这时,您需要孤立地查找每个变量的约束(如果有),并找到这些约束的交集。

A: 1 <= y <= 2 \
                > taken together, the only solution is y = 1
E: 0 <= y <= 1 /  this is the intersection of intervals [0,1] and [1,2]

C: 1 <= x <= 2 \
                > taken together, the only solution is x = 1
D: 0 <= x <= 1 /  this is the intersection of intervals [0,1] and [1,2]

B: 3 >= x + y >= 2 \  taken together, this means x + y = 2
F: 1 <= y + x <= 2  > this is the intersection of [1,2] and [2,3]
G: 1 <= x + y <= 2 /  note that G turns out to be redundant after subbing

解x = 1,y = 1与我们的不等式系统一致。这是唯一的解决方案。我们可以在方程组中代入替代以获得其他变量的值:

1: a = y - 1
     = 1 - 1
     = 0
2: c = x - 1
     = 1 - 1
     = 0
3: b = 3 - x - y
     = 3 - 1 - 1
     = 1

因此,解决方案a = 0,b = 1,c = 0,x = 1,y = 1有效,并且是唯一的解决方案。这些步骤几乎都应该是可以自动化的。