-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfuzzy_ujian.py
121 lines (103 loc) · 3.75 KB
/
fuzzy_ujian.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import argparse
import numpy as np
import skfuzzy as fuzz
from dataclasses import dataclass
from skfuzzy import control as ctrl
@dataclass
class FuzzyVariable:
"""
Class for storing fuzzy variables
"""
def __init__(self):
self.essay = ctrl.Antecedent(np.arange(1, 6, 1), "essay")
self.pilgan = ctrl.Antecedent(np.arange(1, 16, 1), "pilgan")
self.waktu = ctrl.Consequent(np.arange(30, 121, 1), "waktu")
self.essay["sedikit"] = fuzz.trimf(self.essay.universe, [1, 1, 2])
self.essay["sedang"] = fuzz.trimf(self.essay.universe, [1, 3, 4])
self.essay["banyak"] = fuzz.trimf(self.essay.universe, [3, 5, 5])
self.pilgan["sedikit"] = fuzz.trimf(self.pilgan.universe, [1, 1, 6])
self.pilgan["sedang"] = fuzz.trimf(self.pilgan.universe, [5, 8, 12])
self.pilgan["banyak"] = fuzz.trimf(self.pilgan.universe, [8, 15, 15])
self.waktu["sedikit"] = fuzz.trimf(self.waktu.universe, [30, 30, 60])
self.waktu["sedang"] = fuzz.trimf(self.waktu.universe, [45, 90, 100])
self.waktu["banyak"] = fuzz.trimf(self.waktu.universe, [90, 120, 120])
@dataclass
class FuzzyRule(FuzzyVariable):
"""
Class for storing fuzzy rules derived from FuzzyVariable
"""
def __init__(self):
super().__init__()
self.r_1 = ctrl.Rule(
self.essay["sedikit"] & self.pilgan["sedikit"],
self.waktu["sedikit"],
)
self.r_2 = ctrl.Rule(
self.essay["sedikit"] & self.pilgan["sedang"], self.waktu["sedang"]
)
self.r_3 = ctrl.Rule(
self.essay["sedikit"] & self.pilgan["banyak"], self.waktu["sedang"]
)
self.r_4 = ctrl.Rule(
self.essay["sedang"] & self.pilgan["sedikit"], self.waktu["sedang"]
)
self.r_5 = ctrl.Rule(
self.essay["sedang"] & self.pilgan["sedang"], self.waktu["banyak"]
)
self.r_6 = ctrl.Rule(
self.essay["sedang"] & self.pilgan["banyak"], self.waktu["banyak"]
)
self.r_7 = ctrl.Rule(
self.essay["banyak"] & self.pilgan["sedikit"], self.waktu["banyak"]
)
self.r_8 = ctrl.Rule(
self.essay["banyak"] & self.pilgan["sedang"], self.waktu["banyak"]
)
self.r_9 = ctrl.Rule(
self.essay["banyak"] & self.pilgan["banyak"], self.waktu["banyak"]
)
self.rules = [
self.r_1,
self.r_2,
self.r_3,
self.r_4,
self.r_5,
self.r_6,
self.r_7,
self.r_8,
self.r_9,
]
class FuzzySystem(FuzzyRule):
def __init__(self, essay: int, pilgan: int):
super().__init__()
self.essay = essay
self.pilgan = pilgan
self.system = ctrl.ControlSystem(self.rules)
self.system_sim = ctrl.ControlSystemSimulation(self.system)
def compute(self, view=False):
system_sim = self.system_sim
system_sim.input["essay"] = self.essay
system_sim.input["pilgan"] = self.pilgan
system_sim.compute()
if view:
self.waktu.view(sim=system_sim)
return int(system_sim.output["waktu"])
if __name__ == "__main__":
fuzzy_parser = argparse.ArgumentParser()
fuzzy_parser.add_argument(
"essay", metavar="essay", type=int, help="banyaknya soal essay"
)
fuzzy_parser.add_argument(
"pilihan_ganda",
metavar="pilihan_ganda",
type=int,
help="banyaknya soal pilihan ganda",
)
args = fuzzy_parser.parse_args()
fuzzy_system = FuzzySystem(args.essay, args.pilihan_ganda)
time = fuzzy_system.compute()
print(time)
for i in fuzzy_system.system.rules:
print(i)
for i in fuzzy_system.system.fuzzy_variables:
print(i)