TIF_E41201726/FuzzyWater/app/services/FuzzyLogicService.php

620 lines
25 KiB
PHP

<?php
namespace App\Services;
class FuzzyLogicService
{
// Definisi fungsi round_float di dalam kelas FuzzyLogicService
public static function round_float($value) {
return number_format((float)$value, 2, '.', '');
}
public static function fuzzifikasi_usia_tanaman($usia_tanaman) {
// Fuzzifikasi for Usia Tanaman
// Derajat keanggotaan linier turun untuk kategori 'muda'
$muda = max(0, min((70 - $usia_tanaman) / (70 - 45), 1));
$muda = self::round_float($muda);
// Derajat keanggotaan segitiga untuk kategori 'dewasa'
$dewasa = max(0, min(($usia_tanaman - 45) / (70 - 45), (110 - $usia_tanaman) / (110 - 70)));
$dewasa = self::round_float($dewasa);
// Derajat keanggotaan linier naik untuk kategori 'tua'
$tua = max(0, min(($usia_tanaman - 70) / (110 - 70), 1));
$tua = self::round_float($tua);
return array('muda' => $muda, 'dewasa' => $dewasa, 'tua' => $tua);
}
public static function fuzzifikasi_luas_lahan($luas_lahan) {
// Fuzzifikasi for Luas Lahan
// Derajat keanggotaan linier turun untuk kategori 'kecil'
$kecil = max(0, min((700 - $luas_lahan) / (700 - 300), 1));
$kecil = self::round_float($kecil);
// Derajat keanggotaan segitiga untuk kategori 'sedang'
$sedang = max(0, min(($luas_lahan - 300) / (700 - 300), (1000 - $luas_lahan) / (1000 - 700)));
$sedang = self::round_float($sedang);
// Derajat keanggotaan linier naik untuk kategori 'besar'
$besar = max(0, min(($luas_lahan - 700) / (1000 - 700), 1));
$besar = self::round_float($besar);
return array('kecil' => $kecil, 'sedang' => $sedang, 'besar' => $besar);
}
public static function fuzzifikasi_tinggi_air($tinggi_air) {
// Fuzzifikasi for Tinggi Air
// Derajat keanggotaan linier turun untuk kategori 'rendah'
$rendah = max(0, min((10 - $tinggi_air) / (10 - 5), 1));
$rendah = self::round_float($rendah);
// Derajat keanggotaan segitiga untuk kategori 'sedang'
$sedang = max(0, min(($tinggi_air - 5) / (10 - 5), (15 - $tinggi_air) / (15 - 10)));
$sedang = self::round_float($sedang);
// Derajat keanggotaan linier naik untuk kategori 'tinggi'
$tinggi = max(0, min(($tinggi_air - 10) / (15 - 10), 1));
$tinggi = self::round_float($tinggi);
return array('rendah' => $rendah, 'sedang' => $sedang, 'tinggi' => $tinggi);
}
public static function rule_evaluation($usia_tanaman_membership, $tinggi_air_membership, $luas_lahan_membership) {
// Rules for Kebutuhan Air Rendah
$kebutuhan_air_rendah_rules = array(
// Rule 1
array(
"usia_tanaman" => "muda",
"tinggi_air" => "sedang",
"luas_lahan" => "kecil",
"rule" => min($usia_tanaman_membership['muda'], $tinggi_air_membership['sedang'], $luas_lahan_membership['kecil']),
"kebutuhan_air" => "rendah"
),
// Rule 2
array(
"usia_tanaman" => "muda",
"tinggi_air" => "tinggi",
"luas_lahan" => "kecil",
"rule" => min($usia_tanaman_membership['muda'], $tinggi_air_membership['tinggi'], $luas_lahan_membership['kecil']),
"kebutuhan_air" => "rendah"
),
// Rule 3
array(
"usia_tanaman" => "muda",
"tinggi_air" => "tinggi",
"luas_lahan" => "besar",
"rule" => min($usia_tanaman_membership['muda'], $tinggi_air_membership['tinggi'], $luas_lahan_membership['besar']),
"kebutuhan_air" => "rendah"
),
// Rule 4
array(
"usia_tanaman" => "muda",
"tinggi_air" => "sedang",
"luas_lahan" => "sedang",
"rule" => min($usia_tanaman_membership['muda'], $tinggi_air_membership['sedang'], $luas_lahan_membership['sedang']),
"kebutuhan_air" => "rendah"
),
// Rule 5
array(
"usia_tanaman" => "muda",
"tinggi_air" => "tinggi",
"luas_lahan" => "sedang",
"rule" => min($usia_tanaman_membership['muda'], $tinggi_air_membership['tinggi'], $luas_lahan_membership['sedang']),
"kebutuhan_air" => "rendah"
),
// Rule 6
array(
"usia_tanaman" => "muda",
"tinggi_air" => "sedang",
"luas_lahan" => "besar",
"rule" => min($usia_tanaman_membership['muda'], $tinggi_air_membership['sedang'], $luas_lahan_membership['besar']),
"kebutuhan_air" => "rendah"
),
// Rule 7
array(
"usia_tanaman" => "dewasa",
"tinggi_air" => "tinggi",
"luas_lahan" => "kecil",
"rule" => min($usia_tanaman_membership['dewasa'], $tinggi_air_membership['tinggi'], $luas_lahan_membership['kecil']),
"kebutuhan_air" => "rendah"
),
// Rule 8
array(
"usia_tanaman" => "dewasa",
"tinggi_air" => "tinggi",
"luas_lahan" => "sedang",
"rule" => min($usia_tanaman_membership['dewasa'], $tinggi_air_membership['tinggi'], $luas_lahan_membership['sedang']),
"kebutuhan_air" => "rendah"
),
// Rule 9
array(
"usia_tanaman" => "dewasa",
"tinggi_air" => "tinggi",
"luas_lahan" => "besar",
"rule" => min($usia_tanaman_membership['dewasa'], $tinggi_air_membership['tinggi'], $luas_lahan_membership['besar']),
"kebutuhan_air" => "rendah"
),
// Rule 10
array(
"usia_tanaman" => "tua",
"tinggi_air" => "tinggi",
"luas_lahan" => "kecil",
"rule" => min($usia_tanaman_membership['tua'], $tinggi_air_membership['tinggi'], $luas_lahan_membership['kecil']),
"kebutuhan_air" => "rendah"
),
// Rule 11
array(
"usia_tanaman" => "tua",
"tinggi_air" => "tinggi",
"luas_lahan" => "sedang",
"rule" => min($usia_tanaman_membership['tua'], $tinggi_air_membership['tinggi'], $luas_lahan_membership['sedang']),
"kebutuhan_air" => "rendah"
),
// Rule 12
array(
"usia_tanaman" => "tua",
"tinggi_air" => "tinggi",
"luas_lahan" => "besar",
"rule" => min($usia_tanaman_membership['tua'], $tinggi_air_membership['tinggi'], $luas_lahan_membership['besar']),
"kebutuhan_air" => "rendah"
),
// Rule 13
array(
"usia_tanaman" => "tua",
"tinggi_air" => "sedang",
"luas_lahan" => "kecil",
"rule" => min($usia_tanaman_membership['tua'], $tinggi_air_membership['sedang'], $luas_lahan_membership['kecil']),
"kebutuhan_air" => "rendah"
),
// Rule 14
array(
"usia_tanaman" => "tua",
"tinggi_air" => "sedang",
"luas_lahan" => "sedang",
"rule" => min($usia_tanaman_membership['tua'], $tinggi_air_membership['sedang'], $luas_lahan_membership['sedang']),
"kebutuhan_air" => "rendah"
),
// Rule 15
array(
"usia_tanaman" => "tua",
"tinggi_air" => "sedang",
"luas_lahan" => "besar",
"rule" => min($usia_tanaman_membership['tua'], $tinggi_air_membership['sedang'], $luas_lahan_membership['besar']),
"kebutuhan_air" => "rendah"
),
);
// Rules for Kebutuhan Air Tinggi
$kebutuhan_air_tinggi_rules = array(
// Rule 1
array(
"usia_tanaman" => "muda",
"tinggi_air" => "rendah",
"luas_lahan" => "kecil",
"rule" => min($usia_tanaman_membership['muda'], $tinggi_air_membership['rendah'], $luas_lahan_membership['kecil']),
"kebutuhan_air" => "tinggi"
),
// Rule 2
array(
"usia_tanaman" => "muda",
"tinggi_air" => "rendah",
"luas_lahan" => "sedang",
"rule" => min($usia_tanaman_membership['muda'], $tinggi_air_membership['rendah'], $luas_lahan_membership['sedang']),
"kebutuhan_air" => "tinggi"
),
// Rule 3
array(
"usia_tanaman" => "muda",
"tinggi_air" => "rendah",
"luas_lahan" => "besar",
"rule" => min($usia_tanaman_membership['muda'], $tinggi_air_membership['rendah'], $luas_lahan_membership['besar']),
"kebutuhan_air" => "tinggi"
),
// Rule 4
array(
"usia_tanaman" => "dewasa",
"tinggi_air" => "rendah",
"luas_lahan" => "besar",
"rule" => min($usia_tanaman_membership['dewasa'], $tinggi_air_membership['rendah'], $luas_lahan_membership['besar']),
"kebutuhan_air" => "tinggi"
),
// Rule 5
array(
"usia_tanaman" => "dewasa",
"tinggi_air" => "sedang",
"luas_lahan" => "besar",
"rule" => min($usia_tanaman_membership['dewasa'], $tinggi_air_membership['sedang'], $luas_lahan_membership['besar']),
"kebutuhan_air" => "tinggi"
),
// Rule 6
array(
"usia_tanaman" => "dewasa",
"tinggi_air" => "rendah",
"luas_lahan" => "kecil",
"rule" => min($usia_tanaman_membership['dewasa'], $tinggi_air_membership['rendah'], $luas_lahan_membership['kecil']),
"kebutuhan_air" => "tinggi"
),
// Rule 7
array(
"usia_tanaman" => "dewasa",
"tinggi_air" => "sedang",
"luas_lahan" => "kecil",
"rule" => min($usia_tanaman_membership['dewasa'], $tinggi_air_membership['sedang'], $luas_lahan_membership['kecil']),
"kebutuhan_air" => "tinggi"
),
// Rule 8
array(
"usia_tanaman" => "dewasa",
"tinggi_air" => "rendah",
"luas_lahan" => "sedang",
"rule" => min($usia_tanaman_membership['dewasa'], $tinggi_air_membership['rendah'], $luas_lahan_membership['sedang']),
"kebutuhan_air" => "tinggi"
),
// Rule 9
array(
"usia_tanaman" => "dewasa",
"tinggi_air" => "sedang",
"luas_lahan" => "sedang",
"rule" => min($usia_tanaman_membership['dewasa'], $tinggi_air_membership['sedang'], $luas_lahan_membership['sedang']),
"kebutuhan_air" => "tinggi"
),
// Rule 10
array(
"usia_tanaman" => "tua",
"tinggi_air" => "rendah",
"luas_lahan" => "kecil",
"rule" => min($usia_tanaman_membership['tua'], $tinggi_air_membership['rendah'], $luas_lahan_membership['kecil']),
"kebutuhan_air" => "tinggi"
),
// Rule 11
array(
"usia_tanaman" => "tua",
"tinggi_air" => "rendah",
"luas_lahan" => "sedang",
"rule" => min($usia_tanaman_membership['tua'], $tinggi_air_membership['rendah'], $luas_lahan_membership['sedang']),
"kebutuhan_air" => "tinggi"
),
// Rule 12
array(
"usia_tanaman" => "tua",
"tinggi_air" => "rendah",
"luas_lahan" => "besar",
"rule" => min($usia_tanaman_membership['tua'], $tinggi_air_membership['rendah'], $luas_lahan_membership['besar']),
"kebutuhan_air" => "tinggi"
),
);
// Gabungkan hasil aturan untuk kedua kategori kebutuhan air
$all_rules = array_merge($kebutuhan_air_rendah_rules, $kebutuhan_air_tinggi_rules);
// Assign rule activations
$rule_activations = array();
for ($i = 0; $i < count($all_rules); $i++) {
$rule_activations["rule_$i"] = $all_rules[$i];
}
return $rule_activations;
// return array(
// 'rule_activations' => $rule_activations
// );
}
public static function aggregation($rule_activations) {
// Array untuk menyimpan nilai aktivasi tertinggi dari aturan yang berasal dari variabel rendah dan tinggi
$max_activations = array(
'rendah' => -INF,
'tinggi' => -INF
);
// Array untuk menyimpan aturan-aturan dengan nilai aktivasi tertinggi dari variabel rendah dan tinggi
$max_activation_rules = array(
'rendah' => null,
'tinggi' => null
);
// Iterasi melalui aturan-aturan dan pilih aturan dengan nilai aktivasi tertinggi dari variabel rendah dan tinggi
foreach ($rule_activations as $rule => $activation) {
$kebutuhan_air = $activation['kebutuhan_air'];
$activation_degree = $activation['rule'];
// Periksa apakah variabel kebutuhan air adalah 'rendah' atau 'tinggi'
if ($kebutuhan_air === 'rendah' || $kebutuhan_air === 'tinggi') {
// Periksa apakah aktivasi saat ini lebih besar dari nilai tertinggi yang disimpan
if ($activation_degree > $max_activations[$kebutuhan_air]) {
// Jika ya, perbarui nilai maksimum dan aturan yang sesuai
$max_activations[$kebutuhan_air] = $activation_degree;
$max_activation_rules[$kebutuhan_air] = array(
'rule' => $rule,
'activation' => $activation_degree
);
}
}
}
// Gabungkan nilai aktivasi tertinggi dari aturan variabel rendah dan tinggi
$aggregated_output = max($max_activations['rendah'], $max_activations['tinggi']);
// return $aggregated_output;
return array('max_activations' => $max_activations, 'max_activation_rules' => $max_activation_rules, 'aggregated_output' => $aggregated_output);
}
public static function calculate_intersection_points($aggregated_output) {
// Mengambil nilai aktivasi tertinggi dari variabel rendah dan tinggi
// $nilai_aktivasi_rendah = $aggregated_output['rendah'];
// $nilai_aktivasi_tinggi = $aggregated_output['tinggi'];
$nilai_aktivasi_rendah = $aggregated_output['max_activations']['rendah'];
$nilai_aktivasi_tinggi = $aggregated_output['max_activations']['tinggi'];
// Menghitung titik perpotongan t1 dan t2
$t1 = ($nilai_aktivasi_rendah * 10) + 10;
$t2 = ($nilai_aktivasi_tinggi * 10) + 10;
return array('t1' => $t1, 't2' => $t2);
}
public static function integrate($rule_activations){
// Menambahkan fungsi round_float di sini
function round_float($value) {
return number_format((float)$value, 2, '.', '');
}
function integrateFunction($lower_bound, $upper_bound, $function, $n = 1000) {
$step = ($upper_bound - $lower_bound) / $n;
$sum = 0;
for ($i = 0; $i <= $n; $i++) {
$x = $lower_bound + $i * $step;
$sum += $function($x);
if ($i !== 0 && $i !== $n) {
$sum += $function($x);
}
}
$integral = $step * $sum / 2;
// return $integral;
return round_float($integral);
}
$aggregated_output = self::aggregation($rule_activations);
$intersection_points = self::calculate_intersection_points($aggregated_output);
$lower_bound = 0;
$upper_bound = $intersection_points['t1'];
$function = function($z) use ($aggregated_output) {
$max_activation_rendah = $aggregated_output['max_activations']['rendah'];
return round_float($max_activation_rendah * $z);
};
// return $function4;
return integrateFunction($lower_bound, $upper_bound, $function);
}
public static function integrate2($rule_activations){
// Menambahkan fungsi round_float di sini
function round_float2($value) {
return number_format((float)$value, 2, '.', '');
}
function integrateFunction2($lower_bound2, $upper_bound2, $function2, $n = 1000) {
$step = ($upper_bound2 - $lower_bound2) / $n;
$sum = 0;
for ($i = 0; $i <= $n; $i++) {
$x = $lower_bound2 + $i * $step;
$sum += $function2($x);
if ($i !== 0 && $i !== $n) {
$sum += $function2($x);
}
}
$integral = $step * $sum / 2;
// return $integral;
return round_float2($integral);
}
$aggregated_output = self::aggregation($rule_activations);
$intersection_points = self::calculate_intersection_points($aggregated_output);
$lower_bound2 = $intersection_points['t1'];
$upper_bound2 = $intersection_points['t2'];
$function2 = function($z) {
return round_float(($z - 10) / 10 * $z);
};
// return $function4;
return integrateFunction2($lower_bound2, $upper_bound2, $function2);
}
public static function integrate3($rule_activations){
// Menambahkan fungsi round_float di sini
function round_float3($value) {
return number_format((float)$value, 2, '.', '');
}
function integrateFunction3($lower_bound3, $upper_bound3, $function3, $n = 1000) {
$step = ($upper_bound3 - $lower_bound3) / $n;
$sum = 0;
for ($i = 0; $i <= $n; $i++) {
$x = $lower_bound3 + $i * $step;
$sum += $function3($x);
if ($i !== 0 && $i !== $n) {
$sum += $function3($x);
}
}
$integral = $step * $sum / 2;
// return $integral;
return round_float3($integral);
}
$aggregated_output = self::aggregation($rule_activations);
$intersection_points = self::calculate_intersection_points($aggregated_output);
$lower_bound3 = $intersection_points['t2'];
$upper_bound3 = 20;
$function3 = function($z) use ($aggregated_output) {
$max_activation_tinggi = $aggregated_output['max_activations']['tinggi'];
return round_float3($max_activation_tinggi * $z);
};
// return $function4;
return integrateFunction3($lower_bound3, $upper_bound3, $function3);
}
public static function integrate4($rule_activations){
// Menambahkan fungsi round_float di sini
function round_float4($value) {
return number_format((float)$value, 2, '.', '');
}
function integrateFunction4($lower_bound4, $upper_bound4, $function4, $n = 1000) {
$step = ($upper_bound4 - $lower_bound4) / $n;
$sum = 0;
for ($i = 0; $i <= $n; $i++) {
$x = $lower_bound4 + $i * $step;
$sum += $function4($x);
if ($i !== 0 && $i !== $n) {
$sum += $function4($x);
}
}
$integral = $step * $sum / 2;
// return $integral;
return round_float4($integral);
}
$aggregated_output = self::aggregation($rule_activations);
$intersection_points = self::calculate_intersection_points($aggregated_output);
$lower_bound4 = 0;
$upper_bound4 = $intersection_points['t1'];
$function4 = function($z) use ($aggregated_output) {
$max_activation_rendah = $aggregated_output['max_activations']['rendah'];
return round_float4($max_activation_rendah * 1);
};
// return $function4;
return integrateFunction4($lower_bound4, $upper_bound4, $function4);
}
public static function integrate5($rule_activations){
// Menambahkan fungsi round_float di sini
function round_float5($value) {
return number_format((float)$value, 2, '.', '');
}
function integrateFunction5($lower_bound5, $upper_bound5, $function5, $n = 1000) {
$step = ($upper_bound5 - $lower_bound5) / $n;
$sum = 0;
for ($i = 0; $i <= $n; $i++) {
$x = $lower_bound5 + $i * $step;
$sum += $function5($x);
if ($i !== 0 && $i !== $n) {
$sum += $function5($x);
}
}
$integral = $step * $sum / 2;
// return $integral;
return round_float5($integral);
}
$aggregated_output = self::aggregation($rule_activations);
$intersection_points = self::calculate_intersection_points($aggregated_output);
// Menggunakan nilai t1 dan t2 untuk batas bawah dan atas
$lower_bound5 = $intersection_points['t1'];
$upper_bound5 = $intersection_points['t2'];
// Mendefinisikan fungsi yang akan diintegrasikan
$function5 = function($z) {
return round_float5(($z - 10) / 10 * 1); // Sesuaikan fungsi sesuai dengan persamaan integral yang diberikan
};
// return $function5;
return integrateFunction5($lower_bound5, $upper_bound5, $function5);
}
public static function integrate6($rule_activations){
// Menambahkan fungsi round_float di sini
function round_float6($value) {
return number_format((float)$value, 2, '.', '');
}
function integrateFunction6($lower_bound6, $upper_bound6, $function6, $n = 1000) {
$step = ($upper_bound6 - $lower_bound6) / $n;
$sum = 0;
for ($i = 0; $i <= $n; $i++) {
$x = $lower_bound6 + $i * $step;
$sum += $function6($x);
if ($i !== 0 && $i !== $n) {
$sum += $function6($x);
}
}
$integral = $step * $sum / 2;
// return $integral;
return round_float6($integral);
}
$aggregated_output = self::aggregation($rule_activations);
$intersection_points = self::calculate_intersection_points($aggregated_output);
$lower_bound6 = $intersection_points['t2'];
$upper_bound6 = 20;
$function6 = function($z) use ($aggregated_output) {
$max_activation_tinggi = $aggregated_output['max_activations']['tinggi'];
return round_float6($max_activation_tinggi * 1);
};
// return $function6;
return integrateFunction6($lower_bound6, $upper_bound6, $function6);
}
public static function display($lower_bound, $upper_bound, $function, $lower_bound2, $upper_bound2, $function2, $lower_bound3, $upper_bound3, $function3, $lower_bound4, $upper_bound4, $function4, $lower_bound5, $upper_bound5, $function5, $lower_bound6, $upper_bound6, $function6, $rule_activations, $aggregated_output) {
// Hitung integral untuk setiap bagian
$integral_value = self::integrate($lower_bound, $upper_bound, $function, $rule_activations);
$integral_value2 = self::integrate2($lower_bound2, $upper_bound2, $function2, $rule_activations);
$integral_value3 = self::integrate3($lower_bound3, $upper_bound3, $function3, $rule_activations);
$integral_value4 = self::integrate4($lower_bound4, $upper_bound4, $function4, $rule_activations);
$integral_value5 = self::integrate5($lower_bound5, $upper_bound5, $function5, $rule_activations);
$integral_value6 = self::integrate6($lower_bound6, $upper_bound6, $function6, $rule_activations);
// Terapkan pembulatan dua angka di belakang koma pada semua nilai integral
$integral_value = round_float($integral_value);
$integral_value2 = round_float($integral_value2);
$integral_value3 = round_float($integral_value3);
$integral_value4 = round_float($integral_value4);
$integral_value5 = round_float($integral_value5);
$integral_value6 = round_float($integral_value6);
// Hitung total M dan total A
$total_M = $integral_value + $integral_value2 + $integral_value3;
$total_A = $integral_value4 + $integral_value5 + $integral_value6;
// Hitung hasil akhir
$result = $total_M / $total_A;
// Terapkan pembulatan dua angka di belakang koma pada hasil akhir
$result = round_float($result);
return [
'total_M' => $total_M,
'total_A' => $total_A,
'result' => $result
];
}
}