Num.1:递推算法

递推算法

算法思路

递推算法使用“步步为营”的方法,不断利用已有的信息推导出新的东西

- 顺推法:是指从已知条件出发,逐步推算出要解决问题的方法。例如斐波拉契数列。

- 逆推法:是指从已知的结果出发,用迭代表达式逐步推算出问题开始的条件。

顺推实例

这里写图片描述

#include <stdio.h>
#define NUM 13

int main()
{
    int i;
    long rabbit[NUM] = {1,1};
    for(i=2;i<NUM;i++)
    {
        rabbit[i] = rabbit[i-1]+rabbit[i-2];
    }
    for(i=0;i<NUM;i++)
    {
        printf("%d month rabbits total: %d\n",i,rabbit[i]);
    }
    getchar(); //getchar()没有参数,返回来自输入设备的下一个字符。停住界面观察结果
    return 0;
}

逆推实例

A上4年大学,假设银行的年利率为0.018,A每月从银行卡中取出1000元作为生活费,那么求解最开始存入银行卡的钱为多少?
求解过程:若在第48个月A毕业时来本带息取出100元,则要先求出第47个月时银行存款的钱数。
47月末存款 = 1000/(1+0.018/12);
46月末存款 = (47月末存款+1000)/(1+0.018/12)
依次类推
1月末存款 = (2月末存款+1000)/(1+0.018/12)
#include <stdio.h>
#define RATE 0.018/12
#define FETCH 1000
#define MONTH 48

int main()
{
    double money[MONTH+1]; //使下标和月份对应
    int i;
    money[MONTH] = (double)FETCH;
    for(i=MONTH-1;i>0;i--)
    {
        money[i] = (money[i+1]+FETCH)/(1+RATE);
    }
    for(i=MONTH;i>0;i--)
    {
        printf("At month %d total: %.2f\n",i,money[i]);
    }
    getchar();
    return 0;
}
按照上面所修的内容给我修改我的代码 import numpy as np # 时段数与入库流量匹配 num_stages = 5 # 5个时段 inflow_rates = np.array([1406, 9400, 6850, 6300, 2076]) dt = 10800 # 3小时 # 水位库容曲线 storage_curve = { 110: 60500, 110.80: 68900, 110.90: 69950, 111: 71000, 111.50: 76500, 111.80: 79800, 112: 82000, 112.60: 88600, 112.70: 89700, 113: 93000, 113.70: 102100, 113.80: 103400, 114: 106000, 114.25: 109370 } storage_levels = np.array(list(storage_curve.values())) last_stage_storage = 109370 # 最后时段末库容 initial_storage = 60500 # 初始库容 # 安全流量约束 safe_discharge_limit = 2010 # 安全流量上限,单位:m³/s # 初始化动态规划数组 min_discharge_square_sum = np.full((num_stages + 1, len(storage_levels)), np.inf) optimal_discharge = np.full((num_stages + 1, len(storage_levels)), -1) # 设置边界条件 last_stage_index = np.argmin(np.abs(storage_levels - last_stage_storage)) min_discharge_square_sum[num_stages, last_stage_index] = 0 # 逆序动态规划求解 for i in range(num_stages - 1, -1, -1): for j in range(len(storage_levels)): current_storage = storage_levels[j] # 计算下泄流量范围,同时考虑安全流量约束 max_possible_discharge = min(safe_discharge_limit, inflow_rates[i] * 2, 5000) discharge_range = np.arange(0, max_possible_discharge + 1, 10) for discharge in discharge_range: # 计算下一时段的库容 next_storage = current_storage + (inflow_rates[i] - discharge) * dt / 3600 # 找到最接近的库容状态 next_index = np.argmin(np.abs(storage_levels - next_storage)) min_diff = np.abs(storage_levels[next_index] - next_storage) # 只要差距不是太大,就认为可以接受 if min_diff < 1000: # 设置容差 current_discharge_square_sum = discharge ** 2 + min_discharge_square_sum[i + 1, next_index] if current_discharge_square_sum < min_discharge_square_sum[i, j]: min_discharge_square_sum[i, j] = current_discharge_square_sum optimal_discharge[i, j] = discharge # 提取最优调度计划 initial_index = np.argmin(np.abs(storage_levels - initial_storage)) optimal_discharge_plan = [] current_index = initial_index for i in range(num_stages): optimal_discharge_value = optimal_discharge[i, current_index] if optimal_discharge_value == -1: print(f"警告: 时段 {i + 1} 没有找到可行的下泄流量方案(可能受安全流量限制)") optimal_discharge_plan.append(optimal_discharge_value) # 计算下一时段库容索引 if optimal_discharge_value != -1: next_storage = storage_levels[current_index] + (inflow_rates[i] - optimal_discharge_value) * dt / 3600 current_index = np.argmin(np.abs(storage_levels - next_storage)) print("最优泄流量计划:", optimal_discharge_plan, "m³/s")
06-02
import numpy as np import matplotlib.pyplot as plt def interpolate_storage_to_level(storage, curve): """根据库容插值计算水位""" levels = np.array(list(curve.keys())) storages = np.array(list(curve.values())) if storage <= min(storages): return min(levels) elif storage >= max(storages): return max(levels) else: # 线性插值计算水位 idx = np.searchsorted(storages, storage) x0, x1 = storages[idx - 1], storages[idx] y0, y1 = levels[idx - 1], levels[idx] return y0 + (storage - x0) * (y1 - y0) / (x1 - x0) def optimize_reservoir_operation( num_stages, dt, inflow_rates, safe_discharge_limit, water_level_curve, initial_storage, final_storage ): """水库优化调度主函数""" # 离散化库容状态 storage_levels = np.array(sorted(water_level_curve.values())) storage_levels_count = len(storage_levels) # 检查初始和最终库容是否在范围内 if initial_storage not in storage_levels: raise ValueError(f"初始库容 {initial_storage} 不在离散化状态列表中") if final_storage not in storage_levels: raise ValueError(f"最终库容 {final_storage} 不在离散化状态列表中") # 初始化动态规划数组 dp_cost = np.full((num_stages + 1, storage_levels_count), np.inf) dp_policy = np.full((num_stages + 1, storage_levels_count), -1) # 设置边界条件 final_storage_idx = np.argmin(np.abs(storage_levels - final_storage)) dp_cost[num_stages, final_storage_idx] = 0 # 逆序动态规划求解 for t in range(num_stages - 1, -1, -1): for i in range(storage_levels_count): current_storage = storage_levels[i] # 计算可能的下泄流量范围 max_discharge = min(safe_discharge_limit, inflow_rates[t] * 2) discharge_range = np.arange(0, max_discharge + 1, 10) for discharge in discharge_range: # 计算下一状态的库容 next_storage = current_storage + (inflow_rates[t] - discharge) * dt # 查找最接近的离散化库容状态 next_idx = np.argmin(np.abs(storage_levels - next_storage)) next_actual_storage = storage_levels[next_idx] # 计算误差 storage_error = np.abs(next_actual_storage - next_storage) # 如果误差在可接受范围内,更新DP表 if storage_error < 1e6: # 1e6 m³的容差 cost = discharge ** 2 + dp_cost[t + 1, next_idx] if cost < dp_cost[t, i]: dp_cost[t, i] = cost dp_policy[t, i] = discharge # 回溯最优策略 optimal_discharges = [] optimal_storages = [initial_storage] current_storage_idx = np.argmin(np.abs(storage_levels - initial_storage)) # 修正:num_stages应该等于时段数,而不是时刻数 for t in range(num_stages): discharge = dp_policy[t, current_storage_idx] optimal_discharges.append(discharge) # 计算下一时刻的库容 next_storage = optimal_storages[-1] + (inflow_rates[t] - discharge) * dt optimal_storages.append(next_storage) next_storage_idx = np.argmin(np.abs(storage_levels - next_storage)) current_storage_idx = next_storage_idx # 计算对应的水位 water_levels = [interpolate_storage_to_level(s, water_level_curve) for s in optimal_storages] return { 'optimal_discharges': optimal_discharges, 'optimal_storages': optimal_storages[1:], 'water_levels': water_levels[1:], 'total_cost': dp_cost[0, np.argmin(np.abs(storage_levels - initial_storage))] } def plot_results(inflow_rates, optimal_discharges, optimal_storages, water_levels, dt): """可视化优化结果""" # 修正:时段数应该等于len(inflow_rates) num_stages = len(inflow_rates) time_hours = np.arange(num_stages + 1) * dt / 3600 # 转换为小时 plt.figure(figsize=(15, 10)) # 绘制入库流量和下泄流量 plt.subplot(3, 1, 1) plt.bar(time_hours[:-1], inflow_rates, width=dt / 3600 / 1.5, label='入库流量', color='blue') plt.bar(time_hours[:-1], optimal_discharges, width=dt / 3600 / 3, label='下泄流量', color='orange') plt.axhline(y=2010, color='r', linestyle='--', label='安全泄量限制') plt.xlabel('时间 (小时)') plt.ylabel('流量 (m³/s)') plt.title('水库调度流量过程') plt.legend() plt.grid(True) # 绘制库容变化 plt.subplot(3, 1, 2) plt.plot(time_hours, optimal_storages, 'o-', label='库容变化') plt.xlabel('时间 (小时)') plt.ylabel('库容 ()') plt.title('水库库容变化过程') plt.legend() plt.grid(True) # 绘制水位变化 plt.subplot(3, 1, 3) plt.plot(time_hours, water_levels, 'o-', label='水位变化', color='green') plt.xlabel('时间 (小时)') plt.ylabel('水位 (m)') plt.title('水库水位变化过程') plt.legend() plt.grid(True) plt.tight_layout() plt.show() def main(): """主函数,整合所有功能""" # 水库参数设置 # 修正:时段数应为4,5个时刻对应4个时段 num_stages = 4 dt = 10800 # 时段长度(秒) # 修正:将时段长度转换为小时,以便正确计算m³/s·h dt_hours = dt / 3600 # 5个时刻对应的4个时段平均入库流量(m³/s) inflow_rates = np.array([5403, 8125, 6575, 4188]) safe_discharge_limit = 2010 # 下游安全泄量限制(m³/s) # 水位-库容曲线 (水位(m) -> 库容()) water_level_curve = { 110.00: 60500, 110.80: 68900, 110.90: 69950, 111.00: 71000, 111.50: 76500, 111.80: 79800, 112.00: 82000, 112.60: 88600, 112.70: 89700, 113.00: 93000, 113.70: 102100, 113.80: 103400, 114.00: 106000, 114.25: 109370 } # 初始和最终条件 initial_storage = 60500 # 初始库容() final_storage = 109370 # 最终库容() try: # 执行优化计算 results = optimize_reservoir_operation( num_stages, dt, inflow_rates, safe_discharge_limit, water_level_curve, initial_storage, final_storage ) # 输出结果 print("最优下泄流量计划 (m³/s):", results['optimal_discharges']) print("各时段末库容 ():", results['optimal_storages']) print("各时段末水位 (m):", results['water_levels']) print("总目标函数值 (下泄流量平方和):", results['total_cost']) # 可视化结果 plot_results( inflow_rates, results['optimal_discharges'], [initial_storage] + results['optimal_storages'], [interpolate_storage_to_level(initial_storage, water_level_curve)] + results['water_levels'], dt ) except Exception as e: print(f"计算过程中发生错误: {e}") if __name__ == "__main__": main()
06-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值