, 덕분에 너무 느린 :시뮬레이션 어닐링 : 시뮬레이션 어닐링 방법, 다음과 같은 문제에 가난한 내가 해결하기 위해 노력하고있어 결과
나는 이미 C_I, J있어, F 값이 저장 1 차원 배열되므로
c_i,j,f <=> c[i + j * n + f * n * n]
내 담금질 기법 기능이 같다고 :
int annealing(int n, int k_max, int c[]){
// Initial point (verifying the constraints)
int x[n * n * n];
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
for (int f = 0; f < n; f++){
if (i == j && j == f && f == i){
x[i + j * n + f * n * n] = 1;
}else{
x[i + j * n + f * n * n] = 0;
}
}
}
}
// Drawing y in the local neighbourhood of x : random permutation by keeping the constraints verified
int k = 0;
double T = 0.01; // initial temperature
double beta = 0.9999999999; // cooling factor
int y[n * n * n];
int permutation_i[n];
int permutation_j[n];
while (k <= k_max){ // k_max = maximum number of iterations allowed
Permutation(permutation_i, n);
Permutation(permutation_j, n);
for (int f = 0; f < n; f++){
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
y[i + j * n + f * n * n] = x[permutation_i[i] + permutation_j[j] * n + f * n * n];
}
}
}
if (f(y, c, n) < f(x, c, n) || rand()/(double)(RAND_MAX) <= pow(M_E, -(f(y, c, n)-f(x, c, n))/T)){
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
for (int f = 0; f < n; f++){
x[i + j * n + f * n * n] = y[i + j * n + f * n * n];
}
}
}
}
T *= beta;
++k;
}
return f(x, c, n);
}
순열 (int permutation [], n)은 [[0, n-1]]의 임의 순열을 사용하여 배열 순열을 채 웁니다 (예 : [0,1,2,3,4] [3,0,4,2,1]로).
문제는 1000000 회 반복에 너무 많은 시간이 걸리고 목표 함수의 값이 78-79 사이에서 진동하는 반면 해결책으로 0을 얻어야한다는 것입니다.
복잡성과 관련하여 더 잘할 수 있다고 생각했습니다. 누군가 제발 나를 도와 줄 수 있습니까?
미리 감사드립니다.
누군가 나를 도와주십시오. –
구현을 작성하는 특별한 이유가 있습니까? 여기에는 수학 함수에 대한 방대한 지원이 있습니다. https://www.gnu.org/software/gsl/doc/html/index.html 그리고 특히 https://www.gnu.org/software/gsl/doc/html /siman.html?highlight=annealing –
냉각 계수가 1.0에 너무 가깝지 않습니까? 0.999 같은 것이 어떻게됩니까? –