用于决策的模糊推理系统
本例演示了创建模糊推理系统的过程。这种系统以模糊集、其成员函数和决策规则的形式将人类推理和专家知识正规化。
安装和连接图书馆
为了创建模糊推理系统,我们将使用名为FuzzyLogic的 Julia 编程语言库。要在 Engee 中安装该库,需要执行以下代码单元:
Pkg.add(["FuzzyLogic"])
Pkg.add("FuzzyLogic")
连接已安装的 FuzzyLogic 库:
using FuzzyLogic
构建模糊推理系统
在下面的代码中,使用 @mamfis 宏构建了一个马姆达尼模糊推理系统。该系统包括为输入和输出变量定义成员函数。
在代码的开头,我们声明了一个小费函数,它需要两个参数:服务和食物。这些变量代表输入数据,将用于估算餐厅顾客想要留下的小费。
对于服务变量,我们使用高斯成员函数定义了三个模糊集:
- 差,中心为 0,标准偏差为 1.5
- 好,中心为 5,标准偏差为 1.5
- 优,中心为 10,标准偏差为 1.5
对于变量 "食物",我们使用梯形隶属度函数定义了两个模糊集:
- 馊,坐标为(-2,0,1,3)
- 美味,坐标为(7、9、10、12)
变量 tip 有三个模糊集,分别由三角形隶属度函数定义:
- 便宜(小),坐标为(0,5,10)
- 平均值,坐标为(10、15、20)
- 慷慨,坐标为(20、25、30)
接着,定义模糊逻辑规则,将服务和食物质量与小费联系起来。例如,如果服务不好或食物质量差,小费就会少;如果服务好且食物质量令人满意,小费就会一般,以此类推。
fis = @mamfis function tipper(service, food)::tip
service := begin
domain = 0:10
poor = GaussianMF(0.0, 1.5)
good = GaussianMF(5.0, 1.5)
excellent = GaussianMF(10.0, 1.5)
end
food := begin
domain = 0:10
rancid = TrapezoidalMF(-2, 0, 1, 3)
delicious = TrapezoidalMF(7, 9, 10, 12)
end
tip := begin
domain = 0:30
cheap = TriangularMF(0, 5, 10)
average = TriangularMF(10, 15, 20)
generous = TriangularMF(20, 25, 30)
end
service == poor || food == rancid --> tip == cheap
service == good --> tip == average
service == excellent || food == delicious --> tip == generous
end
以函数fis
的形式使用模糊推理系统为例:
fis(service=2, food=4)
使用compilefis
生成独立于库的函数:
fis_ex = compilefis(fis)
通过代码生成获得的函数可以写入文件。为此,将格式为Expr
的变量fis_ex
转换为格式为String
的变量,以便进一步写入:
text_function = string(fis_ex)
将字符串格式的函数写入文件:
f = open("fis.jl","w") # создание файла
write(f, text_function) # запись в файл
close(f) # закрытие файла
在 Engee 工作区中使用创建文件中的函数include
定义函数tipper
, :
include("fis.jl")
使用**.jl**格式文件中的函数。
tipper(2, 3)
获得的函数可在其他项目中使用,无需连接FuzzyLogic库。
成员函数的可视化
连接图形可视化库
using Plots
显示变量的成员函数service
:
plot(fis, :service)
显示变量的成员函数food
:
plot(fis, :food)
显示变量的成员函数tip
:
plot(fis, :tip)
构建响应面
如果一个模糊输出系统有 2 个输入,我们就可以构建其响应曲面。这是一个显示输出数据如何随输入数据变化的曲面:
# Определяем векторы
s = collect(0:0.2:10) # Вектор s от 0 до 10
f = collect(0:0.2:10) # Вектор f от 0 до 10
# Создаем матрицы значений
tip_matrix = zeros(length(s), length(f))
# Заполняем матрицу значениями отклика
for (i, service) in enumerate(s)
for (j, food) in enumerate(f)
tip_matrix[i, j] = tipper(service, food)
end
end
# Построение поверхности отклика
surface(s, f, tip_matrix, xlabel="Service", ylabel="Food", zlabel="Tip", title="Поверхность отклика", color=:inferno)
输出
在本示例中,考虑了FuzzyLogic库的功能。它们被用来建立一个模糊推理系统,该系统允许使用模糊逻辑对不确定和不精确的数据进行建模和处理。在决策和计算方面,模糊推理系统将人类推理和专家知识形式化,与传统方法相比,可以在不确定情况下做出更加灵活和适应性更强的决策。