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

2023-08-05 08:59:23 +08:00
 Eyon

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

2134 次点击
所在节点    问与答
8 条回复
haimall
2023-08-05 09:01:18 +08:00
好像很多网友说过,,,他是语言模型,不是数学模型
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
2023-08-05 09:31:32 +08:00
你可以试试 code interpreter 让他写 python 代码来解决你的问题
yangjirun
2023-08-05 09:31:46 +08:00
有没有可能是中文兼容没有那么完美呢。 上面是 用英文提问,给的示例代码(没有测试)。
lkk
2023-08-05 09:38:19 +08:00
用中文说,是 1 至 11 而不是 1 减 11 。至少给问题的时候描述的精确一些。
bolin
2023-08-05 10:48:20 +08:00
大语言模型是关于文本的统计模型,它的训练方法是浏览文本并预测下一个单词的出现概率,是基于线性代数的。
swulling
2023-08-05 11:02:26 +08:00
不是大模型不行,是他没理解你这个奇怪的比喻。这个题你可以转换为:

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

GPT-4 with Code Interpreter 的响应:


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

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

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

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

在满足任意两个相邻元素间的差大于 1 的条件下,从 1 到 11 的正整数共有 4,860,432 种排列组合。
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
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/962561

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX