In many human situations there are parameters that can be measured and are associated with choice of an outcome, but there is no definable 'equation'. Rather we can gather data from previous cases and use these to classify new cases.
Suppose a company business is based on providing car insurance. Driver ages are 18 to 120, which we could divide into ranges -
driver.is.young ( 18, 25) - driver.is.middle ( 25, 70) - driver.is.old ( 70+)
Similarly, car top speed is relevant.
Top speed of the car is likely to be relevant- car top speed ( <120), ( <140) ( <170)
Combinations of these amount to 'rules'. But the boundaries are not sharp, but graduated. This is the 'fuzziness'
If driver is young OR old, and car is fast, then risk is high
If driver is middle-aged, OR car is average-speed, then risk is middle
If car is slow then risk is low except for young drivers
' *** Fuzzy logic example- bluatigro+jhf ****
WindowWidth = 1000
WindowHeight = 900
nomainwin
open "Fuzzy insurance.inc" for graphics_nf_nsb as #m
#m "trapclose quit"
#m "fill lightgray"
#m "size 4"
for age =18 to 120
driver.is.young$ = fuz$( 0, 0, 18, 25)
driver.is.middle$ = fuz$( 18, 25, 50, 70)
driver.is.old$ = fuz$( 50, 70, 120, 120)
for vel =0 to 300 step 2
car.is.slow$ = fuz$( 0, 0, 120, 140)
car.is.average$ = fuz$( 120, 140, 170, 200)
car.is.fast$ = fuz$( 170, 200, 400, 400)
driverYoung = fuzz( age, driver.is.young$)
driverMiddle = fuzz( age, driver.is.middle$)
driverOld = fuzz( age, driver.is.old$)
carSlow = fuzz( vel, car.is.slow$)
carAverage = fuzz( vel, car.is.average$)
carFast = fuzz( vel, car.is.fast$)
''if driver is young OR old, and car is fast, then risk is high
riskHigh = min( carFast, max( driverYoung, driverOld))
''if driver is middle-aged, OR car is average-speed, then risk is middle
riskMiddle = max( driverMiddle, carAverage)
''if car is slow then risk is low except for young drivers
riskLow = min( carSlow, 1 -driverYoung)
''defuzzyfication
pay.is.low$ =fuz$( 0, 1, 20, 40)
pay.is.middle$ =fuz$( 20, 40, 60, 80)
pay.is.high$ =fuz$( 60, 80, 99, 100)
ml =mass( riskLow, pay.is.low$)
mm =mass( riskMiddle, pay.is.middle$)
mh =mass( riskHigh, pay.is.high$)
pl =point( pay.is.low$)
pm =point( pay.is.middle$)
ph =point( pay.is.high$)
pay = ( ml *pl +mm *pm +mh *ph) /( ml +mm+ mh +1E-10)
call plot vel, age, pay
scan
next vel
next age
#m "flush"
wait
sub plot x, y, z
r = z * 2.5
if not( x mod 10) or not( y mod 10) then g = 255
b = 255 - r 'z * 2.5
#m "color "; r ;" "; g; " "; b
#m "down"
#m "line "; 100 +2 *y +2 *x; " "; 400 +y -x /4; " "; 100+ 2 *y +2*x; " "; 400 +y -x /4 -z
#m "up"
end sub
function fuz$( a, b, c, d) ''construct a fuzzy-object$
fuz$ =a; " "; b; " "; c; " "; d
end function
function fuzz( x, f$) ''what is membervalue of x in fuzzy-object f$
a =val( word$( f$, 1))
b =val( word$( f$, 2))
c =val( word$( f$, 3))
d =val( word$( f$, 4))
uit =0
if ( b <=x) and ( x <=c) then uit =1
if ( a