[计蒜客] Country Meow(2018ICPC南京站D题) 模拟退火(Python语言实现)

题目链接:Country Meow

 

代码:

import math
import random

#温度变化率
K=0.99
#结束温度,控制降温时间
EPS=1E-14

#计算自变量的增量
def get(T):
    return T*random.randint(-5000000,5000000)


def calc(x,y,z,nowx,nowy,nowz):
    ans=float('-inf')
    for i in range(len(x)):
        ans=max(ans,(abs(nowx-x[i])**2+abs(nowy-y[i])**2+abs(nowz-z[i])**2)**0.5)
    return ans

def solve():
    n=eval(input())
    x,y,z=[0]*n,[0]*n,[0]*n
    for i in range(n):
        x[i],y[i],z[i]=map(eval,input().split())
    x0,y0,z0=sum(x)/n,sum(y)/n,sum(z)/n
    ans=calc(x,y,z,x0,y0,z0)
    cnt=3
    while cnt>0:
        cnt-=1
        cur=ans
        x1,y1,z1=x0,y0,z0
        T=100000
        #初始温度
        while T>EPS:
            x2,y2,z2=x1+get(T),y1+get(T),z1+get(T)
            temp=calc(x,y,z,x2,y2,z2)
            if temp<ans:
                ans=temp
                x0,y0,z0=x2,y2,z2
            if cur>temp or math.exp((cur-temp)/T)>random.random():
                cur=temp
                x1,y1,z1=x2,y2,z2
            T*=K
    print("{:.15f}".format(ans))


solve()


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值