Erlang数据结构及流程控制

本文详细介绍了Erlang中的数据结构概念,包括逻辑结构和物理结构,并探讨了变量绑定、模式匹配、复合数据类型转换等内容。同时,还讲解了记录、二进制数据的处理方法以及模块化编程的基本原则。
数据结构反映一个数据的内部构成。

数据的逻辑结构是指成分数据的逻辑关系,可分为单一类型和复合类型。

单一类型
数值
整数 - 理论上允许是任意长度(只要不超过机器限制)
浮点数 64bit
原子 - 用单引号括起来

复合类型 - 可无限嵌套
元组 - 不适用于递推

列表 - 可按序访问(用|),适用于递推
字符串 - 是一种特殊的列表,用双引号括起来


逻辑数据的赋值,由变量绑定实现。
逻辑数据的抽取,由模式匹配实现。

模式匹配中常用到占位变量: _ 和 _Var (区别是后者是实际变量,不能重复定义)

数据的物理结构是指数据在计算机内部的存储形式。
二进制流 - 用<< >>括起来,流不可以进行模式匹配这种复杂操作。

Term - 可以表示任何类型的Erlang数据

tuple_to_list, list_to_tuple只进行复合数据最外层的类型转换,下层嵌套结构不变。

记录record
记录描述了元组的最外层信息,用于批量创建元组。记录可以定义在记录文件中,也可以定义在模块文件中,一个记录文件(.hrl)可以包含多个记录。
-record(myrec,{
%% the next is structure of record
k1 = song,
k2 = feng
}).
-record(myrec2,{
%% the next is structure of record
k1 = song,
k2 = feng,
a1 = {china, shanghai, pudong}
}).

代码中常用-include_lib(File)来包含记录信息

shell中可以用rr(File), rr(File, Rec), rr(File, Rec, Opt)等来读取记录信息

二进制数 形如 <<I1,I2,...>>

list_to_binary(List)
list(必须是一个整数型List!)转成的是一个普通的二进制数据。

term_to_binary(Term)
Term可以是任何的Erlang数据(甚至是二进制数据)
binary_to_term(Bin)
Bin只能是由Term转换成的binary

由Term数据转成的二进制数据,是一种特殊的所谓“外部数据格式”存储的TLV结构(V可无限嵌套TLV')。

Term数据: <<131,T>> <L> (子数据的个数) +
原子: <<100,0>> <L> +
字符串: <<107,0>> <L> +
整数: 保持不变
浮点数: <<99>> + (ASCII码表示,后面补'0')
元组:<<104>> <L> +
列表:<<107,0>> <L> +
T可以是 上述子类型任何一种(整数是97)

begin..end 块
end只可用于函数体内

Erlang的模块化是通过模块(.erl)来组织的
运行一个模块,首先要编译它,生成相应的二进制文件(.beam)

匿名函数fun,就是lamba

高阶函数 - 允许传入,使用,或返回匿名函数的函数。

下划线变量 _Var 比 _更具可读性,但注意避免重复定义。

比较表达式:
> =< =:=
< >= =/=

匿名函数fun的参数可以采用模式匹配
F=
fun
(5,Y) -> 10*Y;
(X,2) -> 3*X;
(X,Y) -> 3*X + 10*Y //兜底
end.

更强的一种做法是用断言guard
when只可出现一次,但其可以使用与(逗号),或(分号)等关系,但不能使用自定义的关系表达式(难以保证其可以正确work)。
F=
fun (X,Y) when X>3; Y<100, Y>10
-> X + Y
end.


函数体内的流程控制可以使用if/case表达式
if
Bool1 -> Expr1;
Bool2 -> Expr2;
true -> Expr3 //兜底
end

case Expr of
Val1 -> Expr1;
Val2 -> Expr2;
_ -> Expr3 //兜底
end

Erlang异常
有三类: exit, error, throw.
exit是发生于系统(二进制代码)内部
error和exit区别不大,脱胎于exit,不同的一点是error会返回栈跟踪,而exit无。往往被用户用来截留exit信号后作些改头换面
throw发生于用户源代码,用于希望编程人员来处理的某类异常

try
throw({}),
erlang:error({}),
exit({})
catch
throw:X -> {};
error:X -> {};
exit:X -> {}
end
内容概要:本文提出了一种基于非合作博弈理论的居民负荷分层调度模型,并结合双层鲸鱼优化算法(Two-level Whale Optimization Algorithm)进行高效求解,模型与算法均通过Matlab代码实现。研究针对电力系统中居民侧用电负荷的复杂调度问题,引入非合作博弈机制刻画各用户之间的利益竞争关系,实现负荷的分层优化分配;同时设计双层优化架构,上层优化资源配置,下层模拟用户自主决策行为,提升了模型的实用性与合理性。通过智能优化算法求解多层级、非凸非线性的博弈模型,有效提高了调度方案的收敛性与全局寻优能力,适用于现代智能电网中的需求侧管理与能源优化场景。; 适合人群:具备电力系统基础理论知识和Matlab编程能力,从事智能电网、能源优化调度、需求侧管理、博弈论应用等方向的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于居民区电力负荷的分层优化调度系统设计与仿真分析;②为非合作博弈在多主体能源系统建模中的应用提供方法论支持;③利用双层鲸鱼算法解决具有嵌套结构的复杂双层优化问题,提升求解效率与调度方案的可行性。; 阅读建议:建议读者结合提供的Matlab代码深入理解模型构建逻辑与算法实现流程,重点关注博弈模型的效用函数设计、纳什均衡求解思路以及双层优化结构的迭代机制,宜配合实际用电数据开展复现实验以验证模型有效性与鲁棒性。
内容概要:本文围绕基于自适应神经模糊推理系统(ANFIS)智能控制器的可再生能源微电网功率管理系统展开研究,结合Simulink仿真实现,深入探讨了微电网中功率的智能调控与经济机组组合调度问题。通过引入ANFIS控制器,有效应对风能、光伏等可再生能源出力的波动性与不确定性,提升系统运行的稳定性与电能质量。研究内容涵盖微电网多源协调控制策略、功率平衡管理、优化调度模型构建及仿真验证,实现了对分布式电源、储能系统和负荷的协同优化,兼顾经济性与可靠性目标,并通过仿真平台验证了所提方法的有效性与优越性。; 适合人群:具备电力系统、自动化或新能源相关专业背景,熟悉Matlab/Simulink仿真环境,从事微电网能量管理、智能控制、能源优化等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于高比例可再生能源接入场景下的微电网能量管理系统研发与教学实践;②为实现微电网功率稳定控制与经济高效运行提供先进的智能控制解决方案;③支撑高水平学术论文复现、科研课题攻关及实际工程项目的仿真验证与方案优化。; 阅读建议:建议结合提供的Simulink模型与相关代码进行动手实践,重点关注ANFIS控制器的设计流程、规则库构建与参数调优方法,并通过与传统PID或MPC控制策略的对比实验,深入理解其在动态响应与鲁棒性方面的优势。同时可进一步拓展文中提出的优化调度逻辑,应用于多目标、多约束的复杂实际应用场景中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值