AI大模型教程
一起来学习

测试大模型八皇后求解ChatGPT、文心一言和ChatGLM3

八皇后问题介绍

八皇后问题是一个古老而著名的数学问题,最早由国际西洋棋棋手马克斯·贝瑟尔于1848年提出。问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。

这个问题不仅是一个有趣的谜题,而且是计算机科学中回溯算法的一个经典案例。回溯算法通过逐步构建解决方案,并在发现冲突时回溯到之前的步骤,从而找到所有可能的解决方案。

在八皇后问题中,一种常见的解决方法是使用一个长度为8的数组来表示皇后的位置。数组的每个元素代表一列,其值表示该列上的皇后所在的行号。通过全排列的方式生成所有可能的列排列,并检查每种排列是否满足皇后不互相攻击的条件。

除了全排列解法外,还有其他一些优化方法可以提高求解八皇后问题的效率。例如,可以使用位运算来快速判断两个皇后是否在同一对角线上,或者使用递归和迭代的方法来减少循环次数。

八皇后问题不仅在数学和计算机科学领域具有重要地位,还经常被用作教学和测试算法复杂度的示例。此外,该问题还可以推广为更一般的n皇后摆放问题,即在n×n的棋盘上摆放n个皇后,使其不互相攻击。这个问题也有许多有趣的解法和应用。

大模型介绍

当前常见的大模型有文心一言、ChatGPT,以及开源的ChatGLM等,今天我们就以八皇后问题来考一下这三个大模型。让我们看看它们的表现吧!

我认为c语言对它们可能有点难,就先用lisp试试。

hy lisp代码

请用hy语言写八皇后问题解决的代码

(import itertools *)  
(import toolz.itertoolz [first])
  
(defn solve-n-queens [n]  
  (defn is-valid [board row col]  
    (setv queens (map second board))  
    (and (not (in col queens))  
         (notany (fn [i] (= 0 (- col (nth queens i)) (- row i))))  
         (notany (fn [i] (= 0 (+ col (nth queens i)) (- row i))))))  
  
  (defn solve [board row]  
    (if (= row n)  
      (list board)  
      (let [cols (range n)]  
        (filter  
          (fn [col]  
            (is-valid board row col))  
          (map  
            (fn [col]  
              (solve (assoc board row col) (+ row 1)))  
            cols)))))  
  
  (first (solve {} 0)))  
  
(print (solve-n-queens 8))

这个(import [itertools *])  直接有报错,改写成(import itertools *)

报错:NameError: name ‘first’ is not defined ,发现可以先导入first:(import toolz.itertoolz [first])

报错:    (solve (assoc board row col) (+ row 1)))
NameError: name ‘assoc’ is not defined 先搁置。

本来以为lisp代码是最简单的,但是问题多多,先搁置,看来要调整下阶段工作重心了。

chatgpt的c语言代码

chatgpt的这个c语言的pass

#include 
#include 

#define N 8

bool isSafe(int board[N][N], int row, int col) {
    int i, j;

    for (i = 0; i = 0 && j >= 0; i--, j--)
        if (board[i][j])
            return false;

    for (i = row, j = col; j >= 0 && i = N)
        return true;

    for (int i = 0; i 

文心一言3.5的c代码

文心一言的刚开始缺失了int j 声明而报错,加上之后,发现结果错误:

#include   
#include   
  
#define N 8  
  
bool is_safe(int board[], int row, int col) {  
    int i;  
    int j;  
    // 检查列上是否有冲突  
    for (i = 0; i = 0 && j >= 0; i--, j--) {  
        if (board[i] == j)  
            return false;  
    }  
  
    // 检查右上方是否有冲突  
    for (i = row - 1, j = col + 1; i >= 0 && j = N) {  
        // 输出棋盘状态  
        for (int i = 0; i 

运算结果:

./a.out 
.  .  .  .  .  .  .  Q  
Q  .  .  .  .  .  .  .  
Q  .  .  .  .  .  .  .  
Q  .  .  .  .  .  .  .  
Q  .  .  .  .  .  .  .  
Q  .  .  .  .  .  .  .  
Q  .  .  .  .  .  .  .  
Q  .  .  .  .  .  .  .  

简单调了下,没有调通。先搁置。

ChatGLM3的c语言代码
 

刚开始给的代码: 

#include 

void print_board(int board[9][9]) {
   for (int i = 0; i {0, 0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0, 0}};
   int n = 8;
   solve(board, 0, n);
   return 0;
}

不明白为什么这里用了9。文心一言说:这段代码的目标是解决九宫数独(Sudoku)问题,但实际上它试图解决的是8皇后问题(N Queens Problem),只是棋盘大小和变量命名有些混淆。数独和8皇后是两个不同的问题,但它们都涉及到在棋盘上放置一些“皇后”或“数字”以避免冲突。

重新问了它问题“再写一个八皇后的实现程序,用c ,注意,不是数独”,这回至少棋盘是对的了

改变了问题策略之后的c代码 

#include 

void print_board(int board[8][8]) {
   for (int i = 0; i {0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0}};
   int n = 8;
   solve(board, 0, n);
   return 0;
}

拿着这段代码去问文心一言,它说:

这段八皇后问题的代码已经基本正确,但is_safe函数缺少了斜线方向的冲突检查。在八皇后问题中,我们需要确保新的皇后在放置时不会与任何其他皇后处于同一行、同一列或同一对角线上。

下面是修改后的is_safe函数,它现在包含了斜线方向的冲突检查:

int is_safe(int board[8][8], int row, int col) {  
   for (int i = 0; i = 0 && col - i >= 0 && board[row - i][col - i] == 1) {  
           return 0;  
       }  
       // 检查次对角线上是否有冲突  
       if (row - i >= 0 && col + i 

将主次对角线的代码修改成文心这段代码,整个程序终于运行成功了!

经过文心一言修改后的完成代码

#include 

void print_board(int board[8][8]) {
   for (int i = 0; i = 0 && col - i >= 0 && board[row - i][col - i] == 1) {  
           return 0;  
       }  
       // 检查次对角线上是否有冲突  
       if (row - i >= 0 && col + i {0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 0, 0, 0}};
   int n = 8;
   solve(board, 0, n);
   return 0;
}

输出显示:

gcc eightqueen_glm3.c 
./a.out
 1  0  0  0  0  0  0  0 
 0  0  0  0  1  0  0  0 
 0  0  0  0  0  0  0  1 
 0  0  0  0  0  1  0  0 
 0  0  1  0  0  0  0  0 
 0  0  0  0  0  0  1  0 
 0  1  0  0  0  0  0  0 
 0  0  0  1  0  0  0  0 

 1  0  0  0  0  0  0  0 
 0  0  0  0  0  1  0  0 
 0  0  0  0  0  0  0  1 
 0  0  1  0  0  0  0  0 
 0  0  0  0  0  0  1  0 
 0  0  0  1  0  0  0  0 
 0  1  0  0  0  0  0  0 
 0  0  0  0  1  0  0  0 

 1  0  0  0  0  0  0  0 
 0  0  0  0  0  0  1  0 
 0  0  0  1  0  0  0  0 
 0  0  0  0  0  1  0  0 
 0  0  0  0  0  0  0  1 
 0  1  0  0  0  0  0  0 
 0  0  0  0  1  0  0  0 
 0  0  1  0  0  0  0  0 

 1  0  0  0  0  0  0  0 
 0  0  0  0  0  0  1  0 
 0  0  0  0  1  0  0  0 
 0  0  0  0  0  0  0  1 
 0  1  0  0  0  0  0  0 
 0  0  0  1  0  0  0  0 
 0  0  0  0  0  1  0  0 
 0  0  1  0  0  0  0  0 

 0  1  0  0  0  0  0  0 
 0  0  0  1  0  0  0  0 
 0  0  0  0  0  1  0  0 
 0  0  0  0  0  0  0  1 
 0  0  1  0  0  0  0  0 
 1  0  0  0  0  0  0  0 
 0  0  0  0  0  0  1  0 
 0  0  0  0  1  0  0  0 

 0  1  0  0  0  0  0  0 
 0  0  0  0  1  0  0  0 
 0  0  0  0  0  0  1  0 
 1  0  0  0  0  0  0  0 
 0  0  1  0  0  0  0  0 
 0  0  0  0  0  0  0  1 
 0  0  0  0  0  1  0  0 
 0  0  0  1  0  0  0  0 

 0  1  0  0  0  0  0  0 
 0  0  0  0  1  0  0  0 
 0  0  0  0  0  0  1  0 
 0  0  0  1  0  0  0  0 
 1  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  1 
 0  0  0  0  0  1  0  0 
 0  0  1  0  0  0  0  0 

 0  1  0  0  0  0  0  0 
 0  0  0  0  0  1  0  0 
 1  0  0  0  0  0  0  0 
 0  0  0  0  0  0  1  0 
 0  0  0  1  0  0  0  0 
 0  0  0  0  0  0  0  1 
 0  0  1  0  0  0  0  0 
 0  0  0  0  1  0  0  0 

总结

虽然很多代码生成并不能一次性成功,但是在多个大模型交叉调试的情况下,还是能满足我们的日常编程需求的。

调试

hy (import [itertools *])  直接有报错

(import [itertools *])  
Traceback (most recent call last):
  File “stdin-0bab587d83cb82a8d732b16c55398dcca4b8b02b”, line 1
    (import [itertools *])  
            ^
hy.errors.HySyntaxError: parse error for pattern macro ‘import’: got unexpected token: hy.models.List([
  hy.models.Symbol(‘itertools’),
  hy.models.Symbol(‘*’)]), expected: end of input

直接写成(import itertools *)

hy报错:NameError: name ‘first’ is not defined

发现可以先导入first:(import toolz.itertoolz [first])

hy报错:NameError: name ‘assoc’ is not defined

    (solve (assoc board row col) (+ row 1)))
NameError: name ‘assoc’ is not defined
先搁置。

文章来源于互联网:测试大模型八皇后求解ChatGPT、文心一言和ChatGLM3

相关推荐: 国内外大模型汇总(包括科大星火、文心一言、通义千问、智普清言、华为大模型)

国内外大模型汇总 1. 科大讯飞星火认知大模型 主要特点: 多语言能力:以中文为核心,同时支持多语言处理,能够进行跨语种的语言理解和生成。 广泛的任务能力:具备内容生成、语言理解、知识问答、推理、数学计算、代码理解与生成等多种能力,能够处理复杂的自然语言任务。…

赞(0)
未经允许不得转载:5bei.cn大模型教程网 » 测试大模型八皇后求解ChatGPT、文心一言和ChatGLM3
分享到: 更多 (0)

AI大模型,我们的未来

小欢软考联系我们