tomi_hartanto_TIFNJK_E41221088/app/Services/ForwardChainingService.php

195 lines
6.3 KiB
PHP

<?php
namespace App\Services;
use App\Models\Penyakit;
use Illuminate\Support\Facades\DB;
class ForwardChainingService
{
private $decisionTree = [
'root' => [
'name' => 'Diagnosis Jamur Tiram',
'primary_symptoms' => [1, 6, 9, 12, 13, 15],
'branches' => [
[
'symptom_id' => 12,
'name' => 'Bintik Noda Hijau',
'children' => [
[
'symptom_id' => 18,
'name' => 'Noda Hijau di Daun',
'penyakit_ids' => [1]
],
[
'symptom_id' => 23,
'name' => 'Warna Coklat pada Miselium',
'penyakit_ids' => [4]
]
]
],
[
'symptom_id' => 13,
'name' => 'Tepung Orange pada Baglog',
'children' => [
[
'symptom_id' => 6,
'name' => 'Pertumbuhan Lambat',
'penyakit_ids' => [2]
]
]
],
[
'symptom_id' => 11,
'name' => 'Noda Hitam pada Baglog',
'children' => [
[
'symptom_id' => 6,
'name' => 'Pertumbuhan Lambat',
'penyakit_ids' => [3]
]
]
],
[
'symptom_id' => 1,
'name' => 'Jamur Tiram Membusuk',
'children' => [
[
'symptom_id' => 10,
'name' => 'Bau Menyengat',
'penyakit_ids' => [5]
],
[
'symptom_id' => 2,
'name' => 'Jamur Tiram Keriput',
'penyakit_ids' => [9]
]
]
],
[
'symptom_id' => 23,
'name' => 'Warna Coklat pada Miselium',
'children' => [
[
'symptom_id' => 9,
'name' => 'Baglog Rusak',
'penyakit_ids' => [6]
]
]
],
[
'symptom_id' => 15,
'name' => 'Warna Biru pada Ujung Jamur',
'children' => [
[
'symptom_id' => 24,
'name' => 'Kerusakan Tubuh Buah',
'penyakit_ids' => [7]
]
]
],
[
'symptom_id' => 9,
'name' => 'Baglog Rusak',
'children' => [
[
'symptom_id' => 20,
'name' => 'Jamur Rontok',
'penyakit_ids' => [8]
]
]
],
[
'symptom_id' => 5,
'name' => 'Jamur Tumbuh Kecil',
'children' => [
[
'symptom_id' => 19,
'name' => 'Perakaran Lembek',
'penyakit_ids' => [10]
]
]
]
]
]
];
public function getDecisionTree(): array
{
return $this->decisionTree;
}
public function getPrimarySymptoms(): array
{
return $this->decisionTree['root']['primary_symptoms'];
}
public function traverseDecisionTree(array $selectedGejalaIds): array
{
$matching = [];
foreach ($this->decisionTree['root']['branches'] as $branch) {
if (in_array($branch['symptom_id'], $selectedGejalaIds)) {
$matching[] = [
'symptom_id' => $branch['symptom_id'],
'name' => $branch['name'],
'matched' => true,
'possible_penyakit_ids' => $this->extractPenyakitFromBranch($branch, $selectedGejalaIds)
];
}
}
return $matching;
}
private function extractPenyakitFromBranch(array $branch, array $selectedGejalaIds): array
{
$penyakitIds = [];
if (isset($branch['penyakit_ids'])) {
$penyakitIds = array_merge($penyakitIds, $branch['penyakit_ids']);
}
if (isset($branch['children'])) {
foreach ($branch['children'] as $child) {
if (in_array($child['symptom_id'], $selectedGejalaIds)) {
if (isset($child['penyakit_ids'])) {
$penyakitIds = array_merge($penyakitIds, $child['penyakit_ids']);
}
}
}
}
return array_unique($penyakitIds);
}
public function findMatchingDiseases(array $selectedGejalaIds): array
{
$rules = DB::table('penyakit_gejala')
->select('penyakit_id', 'gejala_id')
->get()
->groupBy('penyakit_id')
->map(function ($group) {
return $group->pluck('gejala_id')->toArray();
});
$matchingPenyakitIds = [];
foreach ($rules as $penyakitId => $ruleGejalaIds) {
$match = true;
foreach ($ruleGejalaIds as $gejalaId) {
if (!in_array($gejalaId, $selectedGejalaIds)) {
$match = false;
break;
}
}
if ($match) {
$matchingPenyakitIds[] = $penyakitId;
}
}
return Penyakit::whereIn('id', array_unique($matchingPenyakitIds))->get()->all();
}
}