uva 1336 - Fixing the Great Wall

本文探讨了解决修复长城问题的算法优化方法,通过排序和动态规划技术,提出了一个有效的解决方案来最小化修复总费用。
//
//  main.cpp
//  uva 1336 - Fixing the Great Wall

/*
 我们先按位置大小排序。
 首先我们注意到:
 对于 i ....x.....j,x表示现在的机器人的位置。
 如果x现在在修复了i,那么位于x和i之间的所有位置都是已经修复好的了,因为我们当前已经到了i,那么我们就可以顺便修复了x和i之间的位置,这绝对不会增加最终的总费用。所以得出了一个结论。
 最优的修复顺序满足,1---x之间的位置在最优解中的相对位置是相反的。而x---n之间的位置的相对位置是不变的。
 
 有了这个结论我们可以想到解法了.
 对于当前的位置我们有两个选择 1.修复当前位置右边的位置。
                         2.修复当前位置左边的位置。
 
 设d[i][j][t]表示当前所在的位置为t,(t等于i或者j),且只考虑前i个,和第j个以及后面的位置,修理后面被破坏的区域需要的最少的钱。
 这里t只为1或者0.0表示在左边,1表示字右边的节点上。
 则有
 d[i][j][0] = min(d[i][j][0] , d[i-1][j][0]+t[i-1][i] * c_all[i-1][j],d[i-1][j+1][1] + t[j][j+1]* c_all[i-1][j+1]);t[i][j]表示从i到j的时间。
 同理可得出在t==1时的情况。
 */

#include <iostream>
#include <queue>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<vector>
#include <string.h>
#include <algorithm>
#include <set>
#include <map>
#include <cstdio>
#define ll long long
using namespace std ;
double d[1010][1010][2];
double v ;
double INF = 1000000000 ;
int c_all[1010][1010] ;
struct sec{
    int pos , c,d  ;
    bool operator < (const sec &temp ) const{
        return  pos < temp.pos ;
    } ;
};
sec wall[1010] ;
int n ;
double min(double  a,double b)
{
    return  a >b ? b :a ;
}
double dp(int l , int r , int t)
{
    if (d[l][r][t] >= 0  ) {
        return d[l][r][t] ;
    }
    else{
        double time  ;
        double& ans = d[l][r][t] ;
        ans = INF ;
        if (t == 0 ) {
            if (l <= 1&& r == n + 1) {
                return ans = 0 ;
            }
            if(l >1) {
                time =((double )(wall[l].pos - wall[l-1].pos))/v  ;
                ans = min(ans , dp(l-1,r , 0) + time * c_all[l-1][r]) ;
            }
            if(r <=n  ) {
                time = ((double) (wall[r].pos -  wall[l].pos))/v ;  ;
                ans = min(ans  , dp(l-1, r, 1) + time * c_all[l-1][r]) ;
            }
        }
        else{
            if (l == 0 && r == n ) {
                return ans = 0 ;
            }
            if(l >=1){
                time =((double )(wall[r].pos - wall[l].pos))/v  ;
                ans = min(ans , dp(l,r+1 , 0) + time * c_all[l][r+1]) ;
            }
            if(r <n  ){
                time = ((double) (wall[r+1].pos -  wall[r].pos))/v ;  ;
                ans = min(ans  , dp(l, r+1, 1) + time * c_all[l][r+1]) ;
            }
        }
        return ans ;
    }
}
int sum[1010] ;
int main() {
    int x,_v;
    double ans ;
    int cost ;
    while (scanf("%d%d%d" ,&n,&_v,&x)==3 &&  n + _v + x != 0 ) {
        cost = 0 ;
        for (int i = 0; i <  n ; i++) {
            scanf("%d%d%d" ,&wall[i+1].pos,&wall[i+1].c,&wall[i+1].d) ;
            cost += wall[i+1].c ;
        }
        sort(wall+1, wall+n+1) ;
        for (int i = 0; i <=n+5; i++) {
            for (int j = 0 ; j <= n +5; j++) {
                d[i][j][0] = d[i][j][1] = -1 ;
            }
        }
        sum[0] = 0 ;
        for (int i = 1; i <= n ; i++) {
            sum[i] = sum[i-1] + wall[i].d ;
        }
        for (int i  = 0; i <= n ; i++) {
            for (int j = i+1 ; j <=n; j++) {
                c_all[i][j] = sum[i] + sum[n] - sum[j-1] ;
            }
            c_all[i][n+1] = sum[i] ;
        }
        int s = 1 ;
        while (s <= n && wall[s].pos < x) {
            s++ ;
        }
        v = _v ;
        if (s == 1) {
            ans = dp(1, 2, 0) +(double(wall[1].pos - x) )/v*sum[n] ;
        }
        else if (s  ==n +1 )
        {
            ans = dp(n, n+1,0) +  (double(x- wall[n].pos) )/v*sum[n];
        }
        else{
            ans = min(dp(s-1, s , 0 ) +(double(x- wall[s-1].pos) )/v*sum[n] ,
                      dp(s-1, s , 1 ) +(double( wall[s].pos-x) )/v*sum[n]);
        }
        printf("%d\n" ,(int)(ans + 1e-8 +cost)) ;
    }
    return 0;
}

内容概要:本文介绍了基于贝叶斯优化的CNN-LSTM混合神经网络在时间序列预测中的应用,并提供了完整的Matlab代码实现。该模型结合了卷积神经网络(CNN)在特征提取方面的优势与长短期记忆网络(LSTM)在处理时序依赖问题上的强大能力,形成一种高效的混合预测架构。通过贝叶斯优化算法自动调参,提升了模型的预测精度与泛化能力,适用于风电、光伏、负荷、交通流等多种复杂非线性系统的预测任务。文中还展示了模型训练流程、参数优化机制及实际预测效果分析,突出其在科研与工程应用中的实用性。; 适合人群:具备一定机器学习基基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)础和Matlab编程经验的高校研究生、科研人员及从事预测建模的工程技术人员,尤其适合关注深度学习与智能优化算法结合应用的研究者。; 使用场景及目标:①解决各类时间序列预测问题,如能源出力预测、电力负荷预测、环境数据预测等;②学习如何将CNN-LSTM模型与贝叶斯优化相结合,提升模型性能;③掌握Matlab环境下深度学习模型搭建与超参数自动优化的技术路线。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注贝叶斯优化模块与混合神经网络结构的设计逻辑,通过调整数据集和参数加深对模型工作机制的理解,同时可将其框架迁移至其他预测场景中验证效果。
### 未指定的速率转换问题分析 在Simulink中,未指定的速率转换(Unspecified Rate Transition)通常发生在不同采样时间或速率的模块之间进行数据传递时。如果这些模块之间的采样时间不匹配且没有明确处理速率转换,则会出现警告或错误[^1]。 对于问题中提到的输入端口 `'SVG2PIspwm10kV11L/dq0 to abc/dq0 to Alpha-Beta-Zero/Subsystem - pi//2 delay/Fcn1'` 的速率转换问题,可以通过以下方式解决: #### 1. **检查采样时间设置** 确保所有相关模块的采样时间一致。如果某些模块使用不同的采样时间,可以通过显式地添加 `Rate Transition` 模块来处理速率转换。例如,在模块间插入 `Rate Transition` 模块,并根据需求选择是否允许数据丢失或保持最后一个值[^2]。 #### 2. **明确指定速率转换** 如果无法直接统一采样时间,可以在模型配置参数中启用自动速率转换功能。具体操作如下: - 打开模型配置参数(`Ctrl+E`)。 - 转到 `Solver` 部分。 - 在 `Type of fixed-step solver` 下拉菜单中选择合适的求解器类型。 - 启用 `Automatic rate transition` 选项以让Simulink自动处理速率转换问题[^3]。 #### 3. **代码示例:Rate Transition 模块** 以下是将 `Rate Transition` 模块插入模型中的简单示例: ```matlab % 创建一个新的 Simulink 模型 new_system('RateTransitionExample'); % 添加必要的模块 add_block('simulink/Sources/Step', 'RateTransitionExample/Step'); add_block('simulink/Sinks/Scope', 'RateTransitionExample/Scope'); add_block('simulink/Signal Routing/Rate Transition', 'RateTransitionExample/Rate Transition'); % 连接模块 line = ['RateTransitionExample/Step', 'RateTransitionExample/Rate Transition']; add_line('RateTransitionExample', line); line = ['RateTransitionExample/Rate Transition', 'RateTransitionExample/Scope']; add_line('RateTransitionExample', line); % 设置采样时间 set_param('RateTransitionExample/Step', 'SampleTime', '0.01'); set_param('RateTransitionExample/Scope', 'SampleTime', '0.02'); ``` 在上述代码中,`Step` 模块和 `Scope` 模块具有不同的采样时间,`Rate Transition` 模块用于平滑速率转换。 #### 4. **验证模型行为** 在完成速率转换设置后,运行仿真并观察是否有任何警告或错误消息。如果没有问题,则说明速率转换已正确处理。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值