VBA 脚本优化,用于解决不确定系统的难题

问题描述 投票:0回答:1

我刚进入大学时收到一个难题,由于当时缺乏数学知识,我无法解决它。多年来,我回到了这个难题,并能够确定至少一个解决方案,并且在我目前仍然缺乏数学知识的情况下,我能够确定这个难题包含一个由 10 个公式和 12 个未知数组成的待定系统。至少存在一种解决方案。我解决这个问题的最新尝试是通过暴力破解所有解决方案,利用 vba 的基本编程技能完成的。我的脚本能够找到我已有的解决方案,但确定任何其他解决方案的速度很慢(在脚本运行完成之前我的耐心就耗尽了)。

谜题: (https://i.stack.imgur.com/xnXvZ.jpg).

我尝试通过循环变量来求解多个方程,如果找到方程的解,则继续下一个循环。虽然这在思想上工作得很好,但实际上它需要每个变量都有一个循环,在本例中是 12 个变量,这使得过程非常缓慢。我尝试通过在循环中移动一些 if 语句来使其更快,但这并没有真正产生影响。我知道在彼此内部添加多个循环并不能产生好的代码,但我想不出更好的东西。

由于我缺乏编程和数学技能,我想不出比循环遍历每个变量更快的解决方案来解决这个难题。我希望能得到一些帮助。

我的代码:

For a = 1 To 100
    For b = 1 To 100
        If 10 - a + 38 + b * 42 = 114 Then
            For c = 1 To 100
                For d = 1 To 100
                    For e = 1 To 100
                        If c - 2 + d + 6 * e = 37 Then
                            For f = 1 To 100
                                For g = 1 To 100
                                    If 50 - f * 3 - g / 5 = -4 Then
                                        For h = 1 To 100
                                            For j = 1 To 100
                                                For k = 1 To 100
                                                    If h + 15 - j * 3 - k = 2 Then
                                                        For l = 1 To 1000
                                                            For m = 1 To 100
                                                                If 20 * l + 12 / m + 8 = 171 Then
                                                                    If 10 + c * 50 + h + 20 = 186 Then
                                                                        If a * 2 - f + 15 - l = 111 Then
                                                                            If 38 - d * 3 - j + 12 = -28 Then
                                                                                If b + 6 + g - 3 * m = 27 Then
                                                                                    If 42 * e - 5 - k - 8 = 70 Then
                                                                                        r = r + 1
                                                                                        With Worksheets("Sheet1")
                                                                                            .Cells(r, 5).Value = a
                                                                                            .Cells(r, 6).Value = b
                                                                                            .Cells(r, 7).Value = c
                                                                                            .Cells(r, 8).Value = d
                                                                                            .Cells(r, 9).Value = e
                                                                                            .Cells(r, 10).Value = f
                                                                                            .Cells(r, 11).Value = g
                                                                                            .Cells(r, 12).Value = h
                                                                                            .Cells(r, 13).Value = j
                                                                                            .Cells(r, 14).Value = k
                                                                                            .Cells(r, 15).Value = l
                                                                                            .Cells(r, 16).Value = m
                                                                                            .Cells(r, 4).Value = Format(Timer - t, "hh:mm:ss")
                                                                                        End With
                                                                                    End If
                                                                                End If
                                                                            End If
                                                                        End If
                                                                    End If
                                                                End If
                                                            Next m
                                                        Next l
                                                    End If
                                                Next k
                                            Next j
                                        Next h
                                    End If
                                Next g
                            Next f
                        End If
                    Next e
                Next d
            Next c
        End If
    Next b
Next a

在此示例代码中,我仅在 1 到 100 的范围内运行它,这在大约 15 分钟后给了我一个解决方案。产生所有解决方案的范围可能会花费太长时间。所以我在没有帮助的情况下陷入了困境。

excel vba puzzle
1个回答
0
投票

简化某些方程是否被视为作弊?您可以根据其他变量定义 7 个变量,因此不必循环 12 个变量,而只需循环 5 个变量。

我尝试了你原来的方式,跑了3分钟就放弃了。我尝试使用简化的变量,只花了 4 秒。我也尝试了1到200和-1到100,但仍然只有1个解决方案。这些运行花费了不到一分钟的时间,因此如果您愿意等待,您可能会找到更多解决方案。

我还将您的 1 到 100 更改为变量,以便更轻松地扩展范围并测试负解。

Sub solve_problem()

intMIN = 1
intMAX = 150

Start = Now

For a = intMIN To intMAX
'    For B = intMIN To intMAX
    b = (a + 66) / 42
        If 10 - a + 38 + b * 42 = 114 Then
            For c = intMIN To intMAX
                For d = intMIN To intMAX
                    For e = intMIN To intMAX
                        If c - 2 + d + 6 * e = 37 Then
                            For f = intMIN To intMAX
'                                For g = intMIN To intMAX
                                g = 270 - 15 * f
                                    If 50 - f * 3 - g / 5 = -4 Then
'                                        For h = intMIN To intMAX
                                        h = 156 - (50 * c)
'                                            For j = intMIN To intMAX
                                            j = 78 - 3 * d
'                                                For k = intMIN To intMAX
                                                k = 42 * e - 83
                                                    If h + 15 - j * 3 - k = 2 Then
'                                                        For L = intMIN To intMAX
                                                        l = 84 * b - f - 228
'                                                            For m = intMIN To intMAX
                                                            m = 12 / (163 - 20 * l)
                                                                If 20 * l + 12 / m + 8 = 171 Then
                                                                    If 10 + c * 50 + h + 20 = 186 Then
                                                                        If a * 2 - f + 15 - l = 111 Then
                                                                            If 38 - d * 3 - j + 12 = -28 Then
                                                                                If b + 6 + g - 3 * m = 27 Then
                                                                                    If 42 * e - 5 - k - 8 = 70 Then
                                                                                        r = r + 1
                                                                                        With Worksheets("Sheet1")
                                                                                            .Cells(r, 5).Value = a
                                                                                            .Cells(r, 6).Value = b
                                                                                            .Cells(r, 7).Value = c
                                                                                            .Cells(r, 8).Value = d
                                                                                            .Cells(r, 9).Value = e
                                                                                            .Cells(r, 10).Value = f
                                                                                            .Cells(r, 11).Value = g
                                                                                            .Cells(r, 12).Value = h
                                                                                            .Cells(r, 13).Value = j
                                                                                            .Cells(r, 14).Value = k
                                                                                            .Cells(r, 15).Value = l
                                                                                            .Cells(r, 16).Value = m
                                                                                            .Cells(r, 4).Value = Format(Now - Start, "hh:mm:ss")
                                                                                        End With
                                                                                    End If
                                                                                End If
                                                                            End If
                                                                        End If
                                                                    End If
                                                                End If
'                                                            Next m
'                                                        Next L
                                                    End If
'                                                Next k
'                                            Next j
'                                        Next h
                                    End If
'                                Next g
                            Next f
                        End If
                    Next e
                Next d
            Next c
        End If
'    Next B
Next a

r = r + 1
Worksheets("Sheet1").Cells(r, 4).Value = Format(Now - Start, "hh:mm:ss")

End Sub

这是隔离变量的工作

© www.soinside.com 2019 - 2024. All rights reserved.