195 lines
6.3 KiB
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();
|
|
}
|
|
}
|