| Autor | Zpráva | ||
|---|---|---|---|
| php Profil |
#1 · Zasláno: 13. 8. 2011, 12:59:56 · Upravil/a: php
Zajímá mně, jestli se dá v PHP použít, když jo tak jestli ste se s ní už někdy setkaly v PHP a v jaké podobě, případně, jestli neexistuje nějaká knihova pro PHP na Fuzzy logiku, protože by se sní dal zjednodušit, v některých případech, skript. Když uvedu příklad tak je to něco takového:
Mám několik bedýnek ovoce s určitým počtem kusů ovoce, a chtěl bych vybrat všechny bedýnky ve kterých je střední počet kusů ovoce.
//klasický skript:
$bedynky = array("b1" => 24, "b2" => 25, "b3" => 30, "b4" => 35, "b5" => 50);
foreach($bedynky as $bedna => $kusu_ovoce ){
if ( $kusu_ovoce >= 25 && $kusu_ovoce <= 35 ){
/*výstupem mi sou tedy bedýnky b2, b3 a b4 a tady teda nastává problém, proč by nemohla být bedýnka b1,
která obsahuje 24 kusů ovoce, taky zařazena mezi ty střední, takže problém je v určení hraničních bodů
*/
}
}
//fuzzy skript:
foreach($bedynky as $bedna = $kusu_ovoce){
if ( $kusu_ovoce == middle ){
/*výstupem mi jsou bedýnky, podle stupně příslušnosti, který vyjadřuje míru příslušnosti prvku do fuzzy množiny.
Něco jako kdybych každý bedýnce přiřadil skóre z intervalu <0,1>, přičemš čím blíž by se skóre blížilo k 1,
tím je větší šance, že daná bedýnka taky patří mezi ty střední. Takže vlastně jediný co musím stanovit je hodnota,
kdy požadujeme bedýnku za střední, v našem případě to je, když bedýnka obsahuje 30 kusů ovoce.
*/
}
}
|
||
| Joker Profil |
#2 · Zasláno: 13. 8. 2011, 14:27:37
php:
„jestli se dá v PHP použít, když jo tak jestli ste se s ní už někdy setkaly v PHP a v jaké podobě“ Programátorek sem moc nechodí, dovolím si předpokládat, že setkaly je chyba a výrok platí i pro muže :-) V uvedeném příkladu první skript bedýnku b1 vybere, protože 24 je větší než 10 a zároveň menší než 35. Jinak za tím ale není žádná „magie“, prostě potřebuji: 1. Nějaký etalon, „ideálně prostřední bedýnku“. V příkladu to je 30, není řečeno kde se to číslo vzalo, ale asi to je medián vstupních hodnot. Ten se zjistí snadno, přesně podle definice mediánu (hodnota která je v seznamu hodnot seřazených podle velikosti přesně uprostřed): Pole se seřadí podle velikosti a vezme se prostřední hodnota (velikost pole / 2) 2. Teď by šlo říct, že střední jsou etalon ± nějaký počet kusů a je to. Ale když budu „fuzzy“, určíme relativní odchylku od etalonu. K tomu potřebujeme ještě rozpětí vstupních hodnot. Z předchozího kroku je pole seřazené podle velikosti, takže triviální: poslední hodnota mínus první hodnota. Relativní odchylka od střední hodnoty pak je: abs(<etalon> - <hodnota>) / <rozsah> V uvedeném příkladu tedy relativní odchylky budou přibližně: 0,23; 0,19; 0; 0,19; 0,76 3. No a pak potřebujeme vědět míru tolerance, to musí být zadáno. Všechno to jsou relativně jednoduché operace, na co nějaká knihovna? |
||
| php Profil |
#3 · Zasláno: 13. 8. 2011, 15:25:39 · Upravil/a: php
Asi to neumím dostatečně (vůbec) vysvětlit, zkuste si přečíst tohle:
http://cs.wikipedia.org/wiki/Fuzzy_logika http://en.wikipedia.org/wiki/Fuzzy_logic?oldid=166423699 http://www.rydval.cz/phprs/view.php?cisloclanku=2005061701 1) tu 10 sem opravil ještě když tu nebyl ani jeden komentář k tomu... 2) k tomu tvímu příkladu: furt potřebuju zapsat podmínku jako if($x >= xy && $x <= yx ) //což neřeší problém hraničníh bodů //a nemůžu použít if($x == middle ) 3) těch 30 se tam vzalo tak, že bedýnku, která obsahuje 30 kusů ovoce, považuju v příkladu za střední a nikoliv tak že by to byl medián vstupních hodnot |
||
| Joker Profil |
#4 · Zasláno: 13. 8. 2011, 15:53:28 · Upravil/a: Joker
php:
Četl jsem. Pořád si myslím, že tak jak jsem to popsal to bude fungovat. „2) k tomu tvímu příkladu: furt potřebuju zapsat podmínku“ Právěže to nebude if((hodnota > něco) && (hodnota < něco)), ale if(odchylka < tolerance) ad 3), v tom případě těch 30 je prostě další vstup. Zkusím příklad: //vstupy (pozn. neuvažuje se počet kusů < 0):
$bedynky = array("b1" => 24, "b2" => 25, "b3" => 30, "b4" => 35, "b5" => 50);
$etalon = 30; // kolik považuji za střední počet
$tolerance = 0.2; // s jakou tolerancí
// Algoritmus:
sort($bedynky); // setřídění, pokud $bedynky vždycky bude setříděné, není potřeba
$rozsah = $bedynky[count($bedynky) - 1] - $bedynky[0]; // rozsah hodnot
foreach($bedynky as $bedna = $kusu)
{
if((abs($etalon - $kusu) / $rozsah) < $tolerance)
{
// je to střední bedýnka
}
}Dodatek: Jen to nesplňuje to, aby se hodnocení blízko u etalonu měnilo pomaleji než daleko, tzn. aby např. změna o 1 kus blízko u etalonu vyvolala menší změnu hodnocení, než daleko od etalonu. Kdyby se ale použila třeba druhá mocnina odchylky, splňovalo by to i tohle. |
||
|
Časová prodleva: 14 let
|
|||
0