C++ 如何提高这段代码的效率,使用模拟退火的概念对数字进行排序?
我试图理解模拟退火的概念,因此我尝试实现它来对数字进行排序。我不确定这是否是模拟退火的概念正确实现。在这种情况下,有人能指导我如何正确地实施它吗? 在这种情况下,如何改进score函数?另外,我还不能在这里实现温度的概念。请容忍我,因为我是编程的初学者C++ 如何提高这段代码的效率,使用模拟退火的概念对数字进行排序?,c++,algorithm,sorting,simulated-annealing,C++,Algorithm,Sorting,Simulated Annealing,我试图理解模拟退火的概念,因此我尝试实现它来对数字进行排序。我不确定这是否是模拟退火的概念正确实现。在这种情况下,有人能指导我如何正确地实施它吗? 在这种情况下,如何改进score函数?另外,我还不能在这里实现温度的概念。请容忍我,因为我是编程的初学者 #include<iostream> #include<vector> #include<map> #include<cstdlib> #include<cmath> using nam
#include<iostream>
#include<vector>
#include<map>
#include<cstdlib>
#include<cmath>
using namespace std;
void print(vector<int> x)
{
for(int i=0;i<x.size();i++)
{
cout<<x[i]<<"->";
}
cout<<endl;
}
int score(vector<int> x)
{
int s=0;
for(int i=0;i<x.size()-1;i++)
{
for(int j=i+1;j<x.size();j++)
{
if(x[j]<x[i])
s++;
}
}
return s;
}
map<vector<int> ,int>h;
int main()
{
vector<int> x;
srand(time(0));
int N=20;// vector size
for(int i=0;i<N;i++)
{
x.push_back(rand()%10000);
}
int it=0;
while(it<5000)
{
if(score(x)==0) // score =0 stop;
{
print(x);
cout<<"done in iterations"<<it<<endl;
break;
}
int a=rand()%N;
int b=rand()%N;
swap(x[a],x[b]);
vector<int>y=x;
swap(x[a],x[b]);
if(h.find(y)!=h.end()) continue;
if(score(x)>score(y))
{
x=y;
}
//print(x);
it++;
}
return 0;
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
无效打印(矢量x)
{
对于(int i=0;i这与模拟退火无关,它只是一种爬山随机排序。模拟退火的关键特性是,它在搜索时偶尔会接受更糟糕的答案,而你的代码从来不会接受。这不是一个免费的站点。你做了什么努力?你在哪里卡住了?瓶颈在哪里关于你的代码?你预期的行为是什么?实际的行为是什么?@Shahbaz:谢谢你结束了这个问题,它确实帮助并鼓励了我作为一个初学者继续使用SO。@Shahbaz:也许你不清楚,但我一次也没有问我的代码看起来如何。我问的是我是否正确地实现了这个概念。我非常高兴被你在结束问题时的鲁莽所震惊。在你写下你的问题几分钟后,你已经有了两张结束投票。不仅仅是我认为这不是一个好问题。至少,我非常关心向你解释为什么你的问题会结束(正如你所看到的,我在5票中投了3票,所以在我之后还有两票)。首先,我们不是免费的调试器。我们是来帮助你的,我们希望看到你在提问之前做出努力。我知道提问并得到答案而不是研究是一种诱惑,但这是在虐待我们。第二,如果你想一想,这个问题,以目前的形式,如何帮助其他人?你认为有人会喜欢吗gle“如何使用模拟退火改进user1907531的数字排序算法”?从您的其他评论中,似乎您在理解如何实现温度方面存在更深层次的问题。您可能想问一个关于如何实现模拟退火中的温度的更好问题(在完成研究之后),这更有可能吸引和帮助其他人。它也应该在开始时做出重大改变,随着系统冷却,它应该做出越来越小的改变(但我想这就是说没有实现温度的意思)是的,我能够理解温度的概念,但是你能指导我如何在这种情况下实现温度吗。@KarolyHorvath:是的,我的意思正是你写的。谢谢