Я пытаюсь понять концепцию имитации отжига, поэтому я попытался реализовать ее для сортировки чисел. Я не уверен, является ли это концептуально правильной реализацией имитации отжига. Кто-нибудь может подсказать мне, как правильно реализовать это в этом случае?
Как я могу улучшить функцию оценки в этом случае? Кроме того, я не смог реализовать концепцию температуры здесь. Пожалуйста, имейте в виду, я новичок в программировании.
#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;
}
Это не имеет ничего общего с моделируемым отжигом, это просто случайная сортировка по альпинизму. Важное свойство имитируемого отжига заключается в том, что он иногда принимает худший ответ при поиске, чего никогда не делает ваш код.
Других решений пока нет …