🍏🍐🍊🍑🍒🍓🫐🥑🍋🍉🥝
**我让AI帮忙生成算法,Auto-GPT对比ChatGPT、文心一言,结果出人意料…**
文章目录
🍐前言
🍐**最近在和同学完成计算机设计大赛的项目,需要用到一些算法,其中模拟退火算法是比较难写的,所以我想到了最近
火
得一塌糊涂的
AI
们,它们分别是
ChatGPT、Auto-GPT、文心一言以及镜像网站
。那对于算法类的问题,
它们都着有什么样的表现呢?
一起来看看吧。**
🍊 **我们的问题是:
请用Java帮我写出模拟退火算法实现KMP算法。
**
🥑ChatGPT
🍒 **ChatGPT表现良好,能够实现出代码,并且做出了相关解释。**
Me:请用Java帮我写出模拟退火算法实现KMP算法
ChatGPT:以下是使用模拟退火算法实现KMP算法的Java代码:
importjava.util.Random;publicclassSimulatedAnnealingKMP{// KMP算法实现publicstaticintkmp(String s,String p){int[] next =getNext(p);int i =0, j =0;while(i < s.length()&& j < p.length()){if(j ==-1|| s.charAt(i)== p.charAt(j)){
i++;
j++;}else{
j = next[j];}}if(j == p.length()){return i - j;}return-1;}// 获取next数组publicstaticint[]getNext(String p){int[] next =newint[p.length()];int i =0, j =-1;
next[0]=-1;while(i < p.length()-1){if(j ==-1|| p.charAt(i)== p.charAt(j)){
i++;
j++;
next[i]= j;}else{
j = next[j];}}return next;}// 模拟退火算法实现publicstaticintsimulatedAnnealingKMP(String s,String p){int[] next =getNext(p);int current =kmp(s, p);// 当前最优解int temperature =1000;// 初始温度double delta =0.99;// 降温系数Random random =newRandom();while(temperature >1){int i = random.nextInt(s.length());int j = random.nextInt(p.length());char c =(char)(random.nextInt(26)+'a');// 随机生成一个小写字母String newP = p.substring(0, j)+ c + p.substring(j +1);int newResult =kmp(s, newP);if(newResult ==-1){// 如果新解不可行,则不接受continue;}double prob =acceptanceProbability(current, newResult, temperature);if(prob > random.nextDouble()){// 根据概率接受新解
p = newP;
current = newResult;}
temperature *= delta;// 降温}return current;}// 计算接受概率publicstaticdoubleacceptanceProbability(int current,int newResult,int temperature){if(newResult > current){return1.0;}returnMath.exp((newResult - current)/ temperature);}publicstaticvoidmain(String[] args){String s ="ababcabcacbab";String p ="abc";int result =simulatedAnnealingKMP(s, p);System.out.println(result);}}
在simulatedAnnealingKMP函数中,我们采用模拟退火算法来寻找KMP算法的最优解。每次随机生成一个小写字母,将其替换模式串中的一个字符,然后使用KMP算法计算匹配结果。如果新的匹配结果更优,则以一定概率接受新解;否则,不接…
🥑文心一言
🍒 **略逊一筹,只能够写出一些基本的kmp算法,相关解释较少。**
以下是使用Java实现模拟退火算法来优化KMP算法的示例代码:
importjava.util.Arrays;publicclassKMPSolver{publicstaticint[]getPrefix(String pattern){int n = pattern.length();int[] prefix =newint[n];int j =0;for(int i =1; i < n; i++){while(j >0&& pattern.charAt(i)!= pattern.charAt(j)){
j = prefix[j -1];}if(pattern.charAt(i)== pattern.charAt(j)){
j++;}
prefix[i]= j;}return prefix;}publicstaticint[]getNext(int[] pattern,int[] text){int m = pattern.length();int[] next =newint[m];int j =0;for(int i =0; i < m; i++){while(j >0&& pattern.charAt(i)!= text[j]){
j = next[j -1];}if(pattern.charAt(i)== text[j]){
j++;}
next[i]= j;}return next;}publicstaticintgetPosition(String pattern,String text){int m = pattern.length();int n = text.length();int[] prefix =getPrefix(pattern);int[] next =getNext(pattern, t`getPrefix()`方法用于计算模式串的前缀表,`getNext()`方法用于计算模式串的next数组,`getPosition()`方法用于在文本串中查找模式串出现的位置。
在`getPosition()`方法中,我们使用了模拟退火算法来优化KMP算法。我们首先计算出模式串的前缀表,然后在文本串中查找模式串出现的位置。如果在文本串中没有找到模式串,则返回-1;否则,返回在文本串中模式串的起始位置。
在`main()`方法中,我们定义了一个模式串和一个文本串,并调用了`getPrefix()`、`getNext()`和`getPosition()`方法来查找模式串在文本串中的位置。
请注意,这个示例中的KMP算法还未优化,实际
🥑AI文本工具站
🍒 **镜像表现良好,能够实现出代码,并且能够做出相关解释。**
以下是Java代码实现模拟退火算法解决KMP算法的示例:
importjava.util.Random;publicclassSimulatedAnnealingKMP{privatestaticfinaldouble INITIAL_TEMPERATURE =100.0;privatestaticfinaldouble COOLING_RATE =0.99;privatestaticfinalint STEPS_PER_TEMPERATURE =100;publicstaticintsearch(String text,String pattern){int n = text.length();int m = pattern.length();int[] next =getNext(pattern);double temperature = INITIAL_TEMPERATURE;int[] current =newint[m];int[] best =newint[m];generateRandomArray(current);while(temperature >1.0){for(int i =0; i < STEPS_PER_TEMPERATURE; i++){int[] nextArray =getNextArray(current);int currentCost =getCost(text, pattern, current, next);int nextCost =getCost(text, pattern, nextArray, next);if(nextCost < currentCost ||Math.exp((currentCost - nextCost)/ temperature)>Math.random()){
current = nextArray;if(nextCost <getCost(text, pattern, best, next)){
best = nextArray;}}}
temperature *= COOLING_RATE;}int index =-1;for(int i =0; i < n; i++){int j =0;while(j < m && i + j < n && text.charAt(i + j)== pattern.charAt(best[j])){
j++;}if(j == m){
index = i;break;}}return index;}privatestaticint[]getNext(String pattern){int m = pattern.length();int[] next =newint[m];
next[0]=-1;int i =0, j =-1;while(i < m -1){if(j ==-1|| pattern.charAt(i)== pattern.charAt(j)){
i++;
j++;
next[i]= j;}else{
j = next[j];}}return next;}privatestaticvoidgenerateRandomArray(int[] array){Random random =newRandom();for(int i =0; i < array.length; i++){
array[i]= random.nextInt(2);}}privatestaticint[]getNextArray(int[] array){int[] nextArray =newint[array.length];System.arraycopy(array,0, nextArray,0, array.length);Random random =newRandom();int index = random.nextInt(array.length);
nextArray[index]=1- nextArray[index];return nextArray;}privatestaticintgetCost(String text,String pattern,int[] array,int[] next){int m = pattern.length();int cost =0;for(int i =0, j =0; i < text.length(); i++){while(j >0&& text.charAt(i)!= pattern.charAt(j)){
j = next[j];}if(text.charAt(i)== pattern.charAt(j)){
j++;}if(j == m){
cost += array[j -1];
j = next[j];}}return cost;}}
在这个实现中,我们使用了一个长度为模式串长度的01数组来表示匹配过程中的每个字符是否匹配成功。
初始时,我们随机生成一个01数组作为初始解。然后,我们使用模拟退火算法来不断优化这个数组,
使得匹配成功的字符数最大。在每个温度下,我们进行一定次数的随机变化,
然后根据Metropolis准则来决定是否接受这个变化。
最终,我们得到的最优解就是匹配成功的字符数最多的01数组。
最后,我们使用这个数组来进行实际的匹配操作,找到模式串在文本串中的位置。
🛑Auto-GPT
可能是我第一次使用,不太熟,Auto-GPT并没有达到我想要的结果。
🍒**启动Auto-GPT,设定好名称、角色、任务。**
🍒我定义
LXR-GPT
的身份为
算法工程师
;
🍒任务一:“Please use Java to help me write simulated annealing algorithm to achieve KMP algorithm” – 请用Java帮我写出模拟退火算法实现KMP算法。
🍒任务二:“ Generate a java file” – 将其生成为java文件。
**紧接着,
LXR-GPT
就开始了它的思考:**
🎈大意为:
想法:我认为第一步是克隆一个用Java实现了KMP算法的存储库。然后我可以分析代码并使用模拟退火来改进它。一旦我改进了代码,我就可以编写测试来确保它正确工作。最后,我可以执行Java文件来查看结果。
理由:克隆一个库与现有的实现KMP算法将节省时间和精力。分析代码将帮助我了解算法是如何工作的,并确定需要改进的地方。编写测试将确保改进后的代码能够正确工作。最后,执行Java文件将允许我看到算法的结果。
计划:
-克隆库与KMP算法实现
分析代码并找出需要改进的地方-使用模拟退火来改进代码
编写测试以确保改进后的代码能够正常工作—执行Java文件查看结果
批评:我需要确保我正在使用KMP算法的正确实现,并且我编写的代码是高效的。我还需要确保我编写的测试是全面的,并涵盖所有可能的场景。
🎈他给了我一个去克隆仓库的理由:“为了节省时间和精力”。行叭,我们让它先试试:
🎈大意为:
系统:命令clone_repository返回:错误:试图访问工作空间“F:\git\AutoGPT\Auto-GPT\auto_gpt_workspace”之外的路径“F:\home\LXR-GPT\kmp_algorithm”。
思考:现在我将用Java克隆带有KMP算法实现的存储库。
理由:克隆存储库将允许我访问代码并分析它,以确定需要改进的地方。
计划:
-克隆库与KMP算法实现
批评:我需要确保我克隆的存储库具有正确的KMP算法实现,并且我编写的代码是高效的。
🎈好像遇到了点小错误,让它自己处理看看:
-=-=-=-=-=-=-= 命令由用户授权 -=-=-=-=-=-=-=
系统:命令clone_repository返回:错误:试图访问工作空间“F:\git\AutoGPT\Auto-GPT\auto_gpt_workspace”之外的路径“F:\home\LXR-GPT\kmp_algorithm”。
思考:现在我将用Java克隆带有KMP算法实现的存储库。
理由:克隆存储库将允许我访问代码并分析它,以确定需要改进的地方。
计划:
-克隆库与KMP算法实现
批评:我需要确保我克隆的存储库具有正确的KMP算法实现,并且我编写的代码是高效的。
系统:命令clone_repository返回:错误:试图访问工作空间“F:\git\AutoGPT\Auto-GPT\auto_gpt_workspace”之外的路径“F:\home\LXR-GPT\kmp_algorithm”。
思想:现在我将在b谷歌上搜索KMP算法的Java实现。
推理:搜索KMP算法的Java实现将使我能够找到一个可靠且高效的实现,我可以将其用作参考。
计划:
—在谷歌上搜索KMP算法的Java实现
批评:我需要确保我找到的实现是可靠和高效的。
**🎈咱也不知道哪儿错了,
LXR-GPT
打算不克隆了,它要去谷歌搜索相关算法。紧接着,它给我写了一段小作文:**
SYSTEM:命令谷歌返回:[{"title":"Java Program for KMP Algorithm for Pattern Searching", "href":"https://www.geeksforgeeks.org/java-program-for-kmp-algorithm-for-pattern-searching-2/", "body":"Pattern Searching是计算机科学中的一个重要问题。当我们在记事本/word文件或浏览器或数据库中搜索字符串时,模式搜索算法用于显示搜索结果。Java。类KMP_String_Matching{。void KMPSearch(字符串部分,字符串文本)}, {"title": "模式搜索的KMP算法-GeeksforGeeks", "href": "https://www.geeksforgeeks.org/kmp-algorithm-for-pattern-searching/", "body": "模式搜索是计算机科学中的一个重要问题。当我们在记事本/word文件或浏览器或数据库中搜索字符串时,模式搜索算法用于显示搜索结果。我们在前一篇文章中讨论过朴素模式搜索算法。朴素算法的最坏情况复杂度为O(m(n-m+1))。}, {"title":" KMP算法的实现- C, c++, Java和Python", "href":"https://www.techiedelight.com/implementation-kmp-algorithm-c-cpp-java/", "body": " KMP算法的实现-C, c++, Java和Python这篇文章将用C, c++, Java和Python编程语言实现KMP算法。我们已经看到,模式匹配的朴素算法在O(n.m)时间内运行,其中n
是文本的长度,m是模式的长度。}, {"title":"模式搜索的KMP算法(c++和Java代码)","href":"https://favtutor.com/blogs/kmp-algorithm", "body":" c++代码实现。下面是实现KMP算法的c++代码:#include <bits/stdc++.h> void LPSArray(char * pattern, int M,…)下面是实现KMP算法的Java代码:class Solution {void KMP(String pattern, String txt)…"}, {"title":"实现Knuth Morris Pratt算法的Java程序","href":"https://www.sanfoundry.com/java-program-knuth-morris-pratt-algorithm/", "body": "这是一个实现KnuthMorrisPratt算法的Java程序。Knuth-Morris-Pratt字符串搜索算法(或KMP算法)通过观察到当出现不匹配时,单词本身包含足够的信息,来搜索主“文本字符串”S中出现的单词W
决定下一场比赛从哪里开始,从而绕过re……”}, {"title":"java - KMP字符串匹配算法实现- Code Review Stack…","href":"https://codereview.stackexchange.com/questions/155476/kmp-string-matching-algorithm-implementation", "body":"这是Knuth-Morris-Prat算法实现,用于检查模式是否存在于较大的文本中,如果存在,则算法返回该模式的开始索引,否则-1。该算法从计算最长公共前缀数组(LCP数组)入手,有效地避免了冗余模式匹配。}, {"title": "Java: KMP匹配器算法-堆栈溢出","href": "https://stackoverflow.com/questions/35459142/java-kmp-matcher-algorithm", "body": "编辑:我已经用piyush实现更新了下面的代码,纠正了我的一些问题。然而,还有另一个问题。我测试了KMPMatcher使用这些:1)…
java;算法;knuth-morris-pratt;或者问你自己的问题。设置监控时,数据越少越好(第563章)
你的顾客……”}, {"title":"java -这种模式查找方法比KMP或Z-Algorithm更好吗…","href":"https://stackoverflow.com/questions/42174279/is-this-pattern-finding-method-better-than-kmp-or-z-algorithm-implementation", "body": "KMP实现运行复杂度为O(n + m),其中n =Str.length()和m = pattern。长度()。你的算法也以复杂度O(n + m)运行,但它可能跳过正确匹配并产生错误答案。考虑这个测试用例:字符串str = \"apple-orange-apple-apple-apple-orange-apple\";字符串模式= \"apple\";你的代码产生了4个事件。”})
想法:现在我将把KMP算法的Java实现从GeeksforGeeks网站克隆到我的本地机器上。
理由:克隆实现将允许我分析代码并理解它是如何工作的。这将有助于我在编写模拟退火算法时实现KMP算法。
计划:
从GeeksforGeeks网站上克隆KMP算法的Java实现到我的本地机器上
批评:我需要确保我克隆的实现是正确的,并且是可靠的。
🎈我并没有看得特别懂,但是我依然决定相信它,继续y:
系统:命令clone_repository返回:错误:试图访问工作空间“F:\git\AutoGPT\Auto-GPT\auto_gpt_workspace”之外的路径“F:\home\user\kmp_algorithm”。
思想:现在我将在b谷歌上搜索KMP算法的Java实现。
推理:搜索KMP算法的Java实现将使我能够找到一个可靠且高效的实现,我可以将其用作参考。
计划:
—在谷歌上搜索KMP算法的Java实现
批评:我需要确保我找到的实现是可靠和高效的。
🎈好吧,它又回到上一步了,于是我对它按下了 “n”,故事结束…
🎈可以看到:Auto-GPT 会先思考如何最省力来完成这项任务,它会尝试克隆、搜索,但是在遇到一些问题之后,它可能会循环执行之前的步骤,在“恶劣的环境下”,Auto-GPT在我的五次“y”之后,并没有完成指定的任务。后续再给它些别的任务试试吧~
🐳结语
🦄**总体来说,
基于ChatGPT的AI表现都比较良好
,能够快速解决我们所提出的问题,而文心一言稍显逊色,其他它们后续的表现。**
🦄AI如此强大,我们应该学会如何使用它们!
🐟文章粗浅,希望对大家有帮助!
版权归原作者 微风撞见云 所有, 如有侵权,请联系我们删除。