首页 > 其他分享 >codes for 模拟退火

codes for 模拟退火

时间:2022-11-30 00:34:37浏览次数:41  
标签:codes 次数 long 生成 新解 模拟退火 aw

伪代码:

#include<bits/stdc++.h>
using namespace std;

signed main()
{
	ios::sync_with_stdio(0);

	cin >> 初始解;
	
	认为当前为最优解;
	
	for (由前解扰动生成新解)
	{
		if (是否为最优解)
		{
			接收新解;
			
			增加生成次数;
		}
		else
		{
			按照Metropolis接收新解;
			
			增加生成次数;
		}
		
		if (生成次数达到迭代次数)
		{
			if (是否可以输出)
			{
				cout << 结果 << endl;
				
				return 0;
			}
			
			else
			{
				缓慢降低温度,重置迭代次数;
			}
		}
	}
}

P2210 参考代码:

#include<bits/stdc++.h>
using namespace std;

long long n,a[15][5],aw[15],nowans=1e18;

const double B=10000,E=1e-12,W=0.999;

long long getans()
{
	long long ans=0;
	
	for (long long i=1;i<=n;i++)
		for (long long j=1;j<=3;j++)
			ans+=abs(aw[i]-aw[a[i][j]]);
			
	return ans;
}

void sa()
{
	long long t=clock();
	
	while (clock()-t<0.99*CLOCKS_PER_SEC)
	{
		for (double j=B; j>=E; j*=W)
		{
			long long x,y;
			
			do
			{
				x=1+rand()%n;
				y=1+rand()%n;
			}while (x==y);
			
			swap(aw[x],aw[y]);
			
			long long tmp=getans()/2;
			
			if (tmp<=nowans)
				nowans=tmp;
				
			else if (exp((nowans-tmp)*1.0/j)<rand()*1.0/RAND_MAX)
				swap(aw[x],aw[y]);
		}
	}
}

signed main()
{
	ios::sync_with_stdio(0);
	
	cin >> n;
	
	for (long long i=1; i<=n; i++)
	{
		for (long long j=1; j<=3; j++)
			cin >> a[i][j];
			
		aw[i]=i;
	}
	
	sa();
	
	cout << nowans << endl;
	
	return 0;
}

标签:codes,次数,long,生成,新解,模拟退火,aw
From: https://www.cnblogs.com/yangzdQwQ/p/16937178.html

相关文章

  • CodeStar第八周周赛普及进阶组
    T1:垃圾游戏3本题难度中等,一道稍有变化的01背包题。一般的01背包是考虑每个物品取和不取,本题是考虑每个物品带走(相当于取)还是分解(相当于不取),如果分解,也会贡献相应价值记d......
  • 模拟退火(退役前怒学骗分)
    代码是\([这题](https://www.luogu.com.cn/problem/P3878)\)的。模拟一个退火的过程,最开始温度为\(100\)不断降低,常数可以自己设计这里为\(99\)。每次随机一个转移,如......
  • Could not find method compile() for arguments [{name=barcodescanner-release-2.1.
     异常: 解决方法:找到路径下的文件node_modules\phonegap-plugin-barcodescanner\src\android的barcodescanner.gradle将依赖中compile方式引入改成implementation......
  • 【模板】模拟退火 Simulated Annealing
    postedon2021-05-0418:16:24|under学术|source模拟退火适用于:你不会正解能写出估价函数,而且最优解的估价最大/小估价函数不单调,不能二分人品好由于是个带......
  • CodeStar第七周周赛普及进阶组
    T1:四次方的和给出\(n\)个正整数\(a_1,~a_2,~\cdots,~a_n\)。选择其中总和不超过\(m\)的若干数,每个数只能选\(1\)次,选出的数的\(4\)次方之和最大是多少?限制:\(1......
  • CodeStar第六周周赛普及进阶组
    T1:倍数序列3本题难度中等,思路和LIS类似,用dp[i]表示以\(a_i\)结尾的倍数序列的个数。如果\(a_i\)是\(a_j\)的倍数,倍数序列个数就是\(dp[j]\),枚举所有\(j\)求......
  • 模拟退火
    模拟退火(SimulateAnneal)是一种通用概率演算法,在大的搜索空间内寻找最优解,若新的状态优于当前状态,则将新的状态作为最优解,否则以一定概率接受新的状态。模拟退火有三个因......
  • 基于粒子群优化和模拟退火算法增强传统聚类研究(Matlab代码实现)
    ......
  • github codespaces 可以使用了
    最近github的codespaces可以使用了,很方便,实际上就是web版的vscode,内部应该使用了一个轻量的虚拟机,里边部署了不少工具比如docker,kubectl说明githubcodespaces值得体......
  • CodeStar第五周周赛
    T1:复合逻辑表达式本题难度中等,线性\(dp\)问题。根据最后一个运算递推:如果是AND,需要两边都是true;如果是OR,只需任意一个是true当S[i]='AND'y[i-1]=T且x[i]=T:......