• 1344 线型网络


    1344 线型网络

    链接

    分析

      先写了个爬山,一直不过,然后调整变量的初始范围,不断调整,终于终于终于A了9个点,然后在调了一下,最后过了。。。爬山求的要次数尽量多一些。

      然后又写了模拟退火,调整了初始范围。模拟退火,求的次数可以不用太多,它会有一定的几率跳到不优的点。

    爬山

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<iostream>
     6 #include<cctype>
     7 
     8 using namespace std;
     9 
    10 const int N = 25;
    11 
    12 struct Node{
    13     double x,y;
    14 }d[N];
    15 int p[N],n;
    16 double dis[N][N];
    17 
    18 double calcc() {
    19     double ret = 0;
    20     for (int i=1; i<n; ++i) 
    21         ret += dis[p[i]][p[i+1]];
    22     return ret;
    23 }
    24 double solve() {
    25     double T = 1000000;
    26     for (int i=1; i<=n; ++i) p[i] = i;
    27     double ans = calcc();
    28     while (T >= 0.001) {
    29         int x = rand() % n + 1,y = rand() % n + 1;
    30         swap(p[x],p[y]);
    31         double tmp = calcc();
    32         if (tmp < ans) ans = tmp;
    33         else swap(p[x],p[y]);
    34         T *= 0.96;
    35     }
    36     return ans;
    37 }
    38 int main() {
    39 
    40     srand(19970815);
    41     scanf("%d",&n);
    42     for (int i=1; i<=n; ++i) 
    43         scanf("%lf%lf",&d[i].x,&d[i].y);
    44     for (int i=1; i<=n; ++i) 
    45         for (int j=i+1; j<=n; ++j) 
    46             dis[i][j] = dis[j][i] = sqrt((d[i].x-d[j].x)*(d[i].x-d[j].x)+(d[i].y-d[j].y)*(d[i].y-d[j].y));
    47     solve();
    48     double ans = 1e18;
    49     for (int i=1; i<=20000; ++i) ans = min(ans,solve());
    50     printf("%.2lf",ans);
    51     return 0;
    52 }
    View Code

    模拟退火

    还没过。。

     

     

     
  • 相关阅读:
    Python自动截图html页面
    filebeat+kafka+logstash+Elasticsearch+Kibana日志收集系统搭建
    k8s重要概念
    1721. 使括号有效的最少添加
    167. 链表求和
    272. 爬楼梯 II
    1609. 链表的中间结点
    SQL server查看触发器是否被禁用
    C#窗体内控件大小随窗体等比例变化
    微信接口返回码参考表
  • 原文地址:https://www.cnblogs.com/mjtcn/p/9126222.html
Copyright © 2020-2023  润新知