(论文复现,matlab代码分享,可运行)改进遗传算法求解农业水资源调度问题

问题简介

目前国内外现有的渠道优化配水模型都是在下级渠道配水流量相等这一假定条件的基础上建立的。这与
绝大多数渠系实际配水要求不相符合。针对这一问题,建立了下级渠道引水流量不等情况下的渠道优化配水模型,研究了模型的遗传算法的编码及适应度设计方法。结果表明,渠系优化配水过程较原配水过程斗渠配水时间搭配合理、支渠配水流量均匀‚符合优化配水原则,渠系渗透损失水量比原方案可减少。表明模型及其求解算法是可行的,可为下级引水渠道流量不等时的渠系优化配水决策提供理论和技术支持。
在这里插入图片描述
渠系分布示意图

目标函数:

模型以 N 条下级渠道在 T个时段的渠首配水流量为决策变量,将目标函数设置为下级用水户缺水量和渠道输水水量损失最小,即:
在这里插入图片描述

1)对农业水资源进行优化的目的是为农田补充水分以保证农作物对水的需求,以此获得较高的产量和较为理想的收益。由于本文研究的是实时来水量不满足该次灌溉需求时的水资源配置,因此,将水资源配置结果最能满足实时灌溉预报为目标建立模型如公式:
在这里插入图片描述
式中:Ws 为下级用水户各时段的缺水总量,m3; Qjtd 为下级渠道 Dj 渠首第 t
时段的输水流量,m3/s; Δtj 为为第j条下级渠道的配水时间,s; ,
t1jt2j分别为第j条下级渠道的配水开始、配水结束时间;Wjt 为第 j
条下级渠道第 t 时段的需水量, m3。

2)渠道渗漏是导致渠系水利用效率低下的主要因素之一,要使农业灌溉的水量损失最小,就必须考虑渠道渗漏的影响,因此,建立干渠及支渠灌溉损失最小模型如公式:
在这里插入图片描述
式中:Wl为上级渠道输水的水量损失,m3;qu为上级渠道输水水量损失,m3/s ;
qd为下级渠道输水水量损失,m3/s ;qitu 为上级渠道 Ui 第 t
时段的损失流量,m3/s;qitd 为下级渠道 Di 第 t 时段的损失流量,m3/s。
在这里插入图片描述
式中: AiuAjumiu 、 mju 分别为上、下级渠道 Ui
、Dj的渠床土壤透水系数和指数; Qitu 为上级渠道 Ui末端第
t时段的输水流量,m3/s; Liu 为上级渠道 Ui 的长度,km。

约束条件

  1. 渠道输水能力约束:为了保证渠道安全稳定运行,渠道输水流量不得超过设计流量。

式中: QiusQjds 分别为上级渠道 Ui 、下级渠道 Dj 的设计流量,m3/s。
在这里插入图片描述

  1. 水量约束:受来水限制,上级渠道渠首引水量不得超过该干渠分配水量
    在这里插入图片描述
    (轮期内上级渠道来水量不超过50万立方米)

    每条下级渠道的配水流量与引水时间的乘积等于该渠道的配水量。
    在这里插入图片描述

  2. 渠段水量平衡约束:

    上级渠道第i渠段末端流量应等于该渠段末端所连的各下级渠道渠首流量与上级渠道第
    i + 1渠段渠首流量之和。
    在这里插入图片描述

  3. 非负约束:

在这里插入图片描述

  1. 轮期约束:

    各下级渠道配水开始时间和结束时间应在轮期内,且开始时间大于零。(轮期为5天)

在这里插入图片描述

在这里插入图片描述
渠系分布图

所有数据展示

表1 西浚灌区西洞干渠下级渠道基本信息

序号渠道名称渠道类型长度/km控制灌溉面积/hm2渠道设计流量/(m3·s-1)子灌区需水量下级渠首到上级渠首(km)
1西洞干渠干渠10.2312592.5
2直属一斗斗渠1.80460.6190003.9
3直属二斗斗渠4.201461.0600004.4
4直属三斗斗渠5.802481.01000004.7
5直属四斗斗渠1.25650.6260005
6直属五斗斗渠1.20760.6320005.3
7直属六斗斗渠0.88550.5220005.7
8直属七斗斗渠1.03410.5170005.9
9直属八斗斗渠1.401170.6480006.2
10直属九斗斗渠0.902300.8950006.7
11西洞支渠支渠6.172331.59600010.23
11毛家湾支渠支渠1.80530.8220003

结合结合《农田水利学》,模型系数见表 2。

参数参数取值
防渗措施折减系数β0.5
渠床土壤透水系数 A3.4
渠床土壤透水指数 m0.5
上级渠道最小流量系数Jd0.4
上级渠道加大流量系数Ju1.3
下级渠道最小流量系数αd0.6
下级渠道加大流量系数αu1.3

遗传算法设计及代码实现

本次代码大大优化了执行效率,增加了完整注释,值得一读。使用结构数组封装种群,效率更高,可读性大大提升。(如需完整代码,私信留言邮箱)
在这里插入图片描述

在这里插入图片描述

运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

// 主程序入口
%% 清空环境
clc
clear
close all

%% 全局参数
global T Qmax Qmin
T = 3;
Qmax = [0.8,0.6,1,1,0.6,0.6,0.5,0.5,0.6,0.8,1.5];
Qmin = 0.6.*Qmax;

%% 遗传算法参数
maxgen=200;                         %进化代数
sizepop=300;                       %种群规模

%% 个体初始化
population = Init(sizepop);

trace_obj = zeros(1,maxgen);
trace_con = zeros(1,maxgen);

%% 进化开始
for i=1:maxgen
    % 交叉变异
    offspring = Mutate(population,i/maxgen);
    % 挑选新个体
    population = Select(population,offspring,sizepop);
    
    % 记录信息
    bestobj = population(1).obj;
    trace_obj(i) = bestobj;
    trace_con(i) = population(1).cons;
    
    if ~mod(i,10)
        cons = [population.cons];
        num = sum(cons==0);
        avgcons = mean(cons);
        disp(['第' num2str(i) '代,满足约束个体数量:' num2str(num), ',最佳个体:' num2str(bestobj)])
    end
end
%进化结束
bestsol = population(1);

DrawResult()

// 目标函数计算
function population = CalObj(population)
% population = Init(10);
global T
N = length(population);

beta = 0.5;
A = 3.4;
m = 0.5;
Jd = 0.4;
Ju = 1.3;
ad = 0.6;
au = 1.3;

L = [1.8,1.8,4.2,5.8,1.25,1.2,0.88,1.03,1.4,0.9,6.17]; %渠道长度
distance = [3,3.9,4.4,4.7,5,5.3,5.7,5.9,6.2,6.7,10.23]; %下级渠首到上级渠首
Qneed = [22,19,60,100,26,32,22,17,48,95,96].*1000; %子灌区需水量


for i=1:N
    tstart = population(i).tstart; % 解码
    tend = population(i).tend;
    tlast = tend - tstart + 1;
    q = population(i).q;
    
    % 是否处于供水状态
    isgongshui = zeros(T*24/4,11);
    for qu = 1:11
       isgongshui(tstart(qu):tend(qu),qu) = 1; 
    end
    
    % 下级渠道的配水水量
    Q = q.*tlast.*3600.*4;
    
    % 下级渠道的损失流量
    Q_down_loss = 0.01 .* A .* q.^(1-m) .* L .* 1000;
    
    % 用水户缺水量
    Ws = max(Qneed - Q, 0);
    
    % 计算各时间段渠首流量
    Q_t_shou = zeros(T*24/4,11);
    for t=1:T*24/4
        Q_t_shou(t,:) = q(11).*isgongshui(t,11);
        for qu = 10:-1:1
            Q_t_shou(t,qu) = Q_t_shou(t,qu+1) + q(qu)*isgongshui(t,qu);
        end
    end
    
    % 上级渠道的损失流量
    Q_up_loss = 0.01 .* A .* sum(Q_t_shou).^(1-m) .* distance .* 1000;
    
    %% 计算目标函数值
    Wl = sum(Q_down_loss + Q_up_loss);
    F = sum(Ws) + Wl;
    
    %% 检查约束条件
    cons = 0;
    % 水量约束
    if sum(Q) > 500000
       cons = cons + sum(Q)-500000;
    end
    
    % 渠道供水能力约束
    Q_ganqu_t = Q_t_shou(:,1);
    cons = cons + sum(max(Q_ganqu_t-2.5*Ju,0)) + sum(max(2.5*Jd-Q_ganqu_t,0));
    
    %% 封装
    population(i).obj = F;
    population(i).cons = cons;
    population(i).Q = Q;
    population(i).Wl = Wl;
    population(i).Ws = sum(Ws);
    population(i).Q_down_loss = Q_down_loss;
    population(i).Q_up_loss = Q_up_loss;
end

最后,博主专注于论文的复现工作,有兴趣的同学可以私信共同探讨。相关代码已经上传到资源共享,点击我的空间查看分享代码。

  • 28
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 30
    评论
水库优化调度是通过合理的利用水资源,优化水库的调度方式,以最大限度地满足社会经济发展和水资源保护的需求。与传统的水库调度相比,优化调度程序通过借助计算机技术和数学模型,能够更准确地预测水库的水位和出入库流量,并根据不同的地理、气象和经济条件,制定出最优的调度方案。 在水库优化调度中,MATLAB是一种常用的工具,用于编写优化调度的数学模型和求解问题。MATLAB具有强大的数值计算和优化求解功能,可以通过编写相应的算法和函数,快速、准确地计算出最优调度方案。 在编写水库优化调度的MATLAB程序时,一般需要将水库系统建立数学模型,并考虑诸多因素,如水库的容量、来水量、需水量、水位约束、出入库流量约束等。利用这些因素,可以构建水库调度的优化目标函数,使用MATLAB的优化工具箱对目标函数进行求解,得到最优的调度方案。 通过运行MATLAB程序,可以得到水库的最佳调度方案,并得到相关的调度结果,如每个时期的最佳出入库流量、最佳水位等信息。这些信息可以为水库管理部门和决策者提供科学依据,合理评估水库的水利效益,优化水资源的利用效能,提高水资源利用效益。 总之,水库优化调度MATLAB程序是一种利用计算机技术和数学模型,优化水库调度,提高水资源利用效益的方法。它能够通过求解数学模型,得到最佳的调度方案,并为水库管理和决策提供科学依据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运筹不帷幄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值