V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Eyon
V2EX  ›  问与答

这个问题很复杂吗? GPT-4 完全懵逼

  •  
  •   Eyon · 2023-08-05 08:59:23 +08:00 · 2108 次点击
    这是一个创建于 481 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有编号为 1-11 共 11 个小朋友,他们目前按照顺序手拉手站在一起,也就是 1 号小朋友拉着二号小朋友的手,2 号小朋友的另一只手又拉着三号小朋友的手,3 号小朋友的另一只手又拉着 4 号小朋友的手,请帮我设计一种乱序算法,要求是所有拉过手的小朋友,都不能再次拉手,我想要了解有哪些排序组合?

    8 条回复    2023-08-05 11:03:19 +08:00
    haimall
        1
    haimall  
       2023-08-05 09:01:18 +08:00   ❤️ 1
    好像很多网友说过,,,他是语言模型,不是数学模型
    yangjirun
        2
    yangjirun  
       2023-08-05 09:31:01 +08:00
    import itertools

    def generate_sorting_combinations(children):
    all_combinations = list(itertools.permutations(children))
    valid_combinations = []

    for combination in all_combinations:
    valid = True
    for i in range(len(combination) - 1):
    if abs(combination[i] - combination[i+1]) == 1:
    valid = False
    break
    if valid:
    valid_combinations.append(combination)

    return valid_combinations

    if __name__ == "__main__":
    children = list(range(1, 12))
    sorting_combinations = generate_sorting_combinations(children)

    print("Number of valid sorting combinations:", len(sorting_combinations))
    for combination in sorting_combinations:
    print(combination)
    qiayue
        3
    qiayue  
       2023-08-05 09:31:32 +08:00
    你可以试试 code interpreter 让他写 python 代码来解决你的问题
    yangjirun
        4
    yangjirun  
       2023-08-05 09:31:46 +08:00
    有没有可能是中文兼容没有那么完美呢。 上面是 用英文提问,给的示例代码(没有测试)。
    lkk
        5
    lkk  
       2023-08-05 09:38:19 +08:00
    用中文说,是 1 至 11 而不是 1 减 11 。至少给问题的时候描述的精确一些。
    bolin
        6
    bolin  
       2023-08-05 10:48:20 +08:00
    大语言模型是关于文本的统计模型,它的训练方法是浏览文本并预测下一个单词的出现概率,是基于线性代数的。
    swulling
        7
    swulling  
       2023-08-05 11:02:26 +08:00   ❤️ 1
    不是大模型不行,是他没理解你这个奇怪的比喻。这个题你可以转换为:

    「给定 1 到 11 的正整数,请计算出全部的排列组合,需要满足任意两个相邻元素间的差大于 1 。」

    GPT-4 with Code Interpreter 的响应:


    这个问题是一个例子的遍历搜索问题,我们可以使用深度优先搜索 (DFS) 来解决。基本的思路是从 1 到 11 的整数中任选一个开始,然后对剩下的数字再进行选择,每次选择的数字需要满足与已选择的数字之间的差大于 1 。我们可以使用一个标记数组来记录哪些数字已经被选择,从而避免重复选择。这个过程可以递归地进行,直到所有的数字都被选择为止。

    让我们编写一段代码来解决这个问题。由于这个问题的搜索空间相对较大,我们可以使用一种剪枝策略来加速搜索过程,即如果当前选择的数字与前一个选择的数字的差不大于 1 ,我们就可以跳过这个选择,因为它不会导致一个有效的解。

    此外,由于 Python 的 GIL (全局解释器锁) 限制,纯 Python 代码无法有效地利用多核 CPU 进行并行计算,所以这里我们选择使用单线程的深度优先搜索。

    由于这个问题的复杂度比较高,如果直接计算所有的排列可能会耗费大量的时间。因此,我们可以先只计算排列的数量,而不是列出所有的排列。如果你需要列出所有的排列,我们可以稍作修改。让我们先尝试计算排列的数量。

    在满足任意两个相邻元素间的差大于 1 的条件下,从 1 到 11 的正整数共有 4,860,432 种排列组合。
    swulling
        8
    swulling  
       2023-08-05 11:03:19 +08:00
    产出的代码是:

    ```python
    def dfs(pos, last, vis):
    if pos == 12: # base case: all numbers have been used
    return 1
    res = 0
    for i in range(1, 12):
    if not vis[i] and abs(i - last) > 1:
    vis[i] = True
    res += dfs(pos + 1, i, vis)
    vis[i] = False # backtrack
    return res

    # Initialize
    vis = [False] * 12
    # Start DFS
    total = dfs(1, 0, vis)
    total
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3094 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:44 · PVG 22:44 · LAX 06:44 · JFK 09:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.