模拟退火 poj 2420

本文介绍了一个使用模拟退火算法求解旅行商问题(TSP)的C++程序实现。通过定义结构体存储二维平面上的点,并利用模拟退火算法不断更新温度参数来寻找所有点间距离之和最小的解。程序通过读取输入点集并迭代调整,最终输出最小路径长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

详见点击打开链接

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h> 
#define eps 1e-8
#define T 100
#define delta 0.98
using namespace std;
const int maxn=1e5+10;
const int inf=0x3fffffff;
int dir[4][2]={1,0,0,1,0,-1,-1,0};
struct point{
	double x;
	double y;
}pt[maxn];
int n;
double Sum(double x,double y)
{
	double sum=0.0;
	for (int i=1;i<=n;i++)
		sum+=(sqrt((x-pt[i].x)*(x-pt[i].x)+(y-pt[i].y)*(y-pt[i].y)));
	return sum;
}
int main()
{
	point pp;
	double minn;
	while (scanf("%d",&n)!=EOF)
	{
		for (int i=1;i<=n;i++)
			scanf("%lf%lf",&pt[i].x,&pt[i].y);	
		pp=pt[1];
		double t=T;
		minn=inf*1.0;
		while (t>eps)
		{
			int flag=1;
			while (flag)
			{
				flag=0;
				for (int i=0;i<4;i++)
				{
					double xx=pp.x+dir[i][0]*t;
					double yy=pp.y+dir[i][1]*t;
					double sum=Sum(xx,yy);
					if (sum<minn)
					{
						minn=sum;
						pp.x=xx;
						pp.y=yy;
						flag=1;
					}
				}
			}
			t*=delta;
		}
		printf("%.0f\n",minn);
	}	
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值