Приложение 1

Листинг 1. ЭС для оценки надежности поставщика (в среде GURU)

/* Программа выбора поставщика */

clear /* очистка экрана */

e.stat = false /* блокировка вывода трассировки на экран */

e.supd = true /* блокировка вывода сообщений на экран при вводе из файла */

finish all /* закрытие всех активных баз данных */

/* Следующие базы данных делаются активными */

use progr

use proizv

use postav

use specif

 

at 5,5 ? «****** ЭКСПЕРТНАЯ СИСТЕМА ******»

at 6,5 ? «*** ПРОГРАММА ВЫБОРА ПОСТАВЩИКА ***»

at 7,5 ? «********* press any key ***********»

wait;

 

obtain first from progr; /* получение первой записи из БД progr */

while not (eot (progr)) do /* eot() – функция, опред. конец файла */

clear;

? « *** Код иэделия: », progr.kodizd;

? « *** Изделие: », progr.izdel;

flag2 = 0;

/* получение из файла базы данных 'specif' первой записи, для которой запись в поле 'kodizd' совпадает с текущей записью в поле 'kodizd' базы данных 'progr' */

obtain first from specif for progr.kodizd = specif.kodizd;

while (not (eot (specif)) and flag2 = 0) do

potrebn = progr.odiem * specif.spec;

output « **** Код продукта: », specif.kodprod;

? « **** потребность: », potrebn;

/* получение из файла базы данных 'proizv' первой записи, для которой запись в поле 'kodprod' совпадает с текущей записью в поле 'kodprod' базы данных 'specif' */

obtain first from proizv for specif.kodprod = proizv.kodprod;

if #found = false then /* если запись не найдена, то поставщика нет */

at 8,2 output « <><> Поставщик не найден <><> »;

wait;

flag2 = 1;

endif;

flag1 = 0;

while (not (eot (proizv)) and flag1 = 0 and flag2 = 0) do

at 8,2 output « **** Код поставщика: », proizv.kodpred;

? «**** цена продукта: », proizv.cena, « ру6лей за 1 шт.»;

/* из файла базы данных 'postav' выбирается поставщик, который может предложить товар по цене, не превышающей имеющиеся фонды */

obtain from postav for postav.kodpred = proizv.kodpred and

progr.fond > potrebn * proizv.cena;

? «*** Поставщик: », postav.name;

if #found = false then

? «**** Фонды меньше чем цена * потребность»;

? «**** Поставщик исключается из рассмотрения»;

flag1 = 0; flag2 = 0;

break;

endif;

/* если цена, предлагаемая поставщиком, не превышает имеющиеся фонды, то поставщика необходимо проверить на надежность */

consult n to test nad; /* Определение надежности поставщика с помощью ЭС*/

if nad = true then

at 14,2 output « **** Поставщик », postav.kodpred, « надежный»;

else

at 14,2 output « **** Поставщик », postav.kodpred, « НЕнадежный»

endif;

wait;

/* получение следующей записи из базы данных 'proizv' */

obtain next from proizv for specif.kodprod = proizv.kodprod;

if #found = false then flag1 = 1; endif;

endwhile;

/* получение следующей записи из базы данных 'specif' */

obtain next from specif for progr.kodizd = specif.kodizd;

if #found = false then break; endif;

endwhile;

/* получение следующей записи из базы данных 'progr' */

obtain next from progr;

enbdwile;

wait;

clear;

at 19, 10 ? « **** Конец консультации **** »;

at 20, 10 ? « ********* bye, bye **********»;

wait;

clear;

finish all;

 

/* Набор правил – Определение надежности поставщика */

GOAL: NAD /* НАДЕЖНОСТЬ */

 

INITIAL:

form main /* описание главной формы */

at 10, 25 put «********************************»;

at 11, 25 put «* Экспертная Система *»;

at 12, 25 put «* Оценка надежности поставщика *»;

at 13, 25 put «******** press any key *********»;

endform /* окончание описания формы main */

 

form vivod /* описание формы для вывода результатов */

at 3, 25 put «********************************»;

at 4, 25 put «* Экспертная Система *»;

at 5, 25 put «* Оценка надежности поставщика *»;

at 6, 25 put «* Вывод результатов *»;

at 7, 25 put «********************************»;

endform /*окончание описания формы vivod */

 

e.trac = «n» /* отмена трассировки. v – включить трассировку */

e.sord = «ph» /* критерии, по которым устанавливается очередность проверки правил; ph – по приоритету + по наибольшей достоверности результата */

e.rigr = «a» /* режим проверки конфликтующих правил для достижения результата с заданной степенью точности; а – все правила, дающие минимально допустимый фактор уверенности + правила, увеличивающие достоверность результата */

e.tryp = «s» /* режимы оценки; s – проверка неизвестных переменных, пока значение какой-либо из них не будет получено */

e.cfva = «pp» /* задание вероятностной логики */

e.lnum = 5 /* длина числового значения для округления */

e.deci = 0 /* число значащих цифр после запятой */

e.lstr = 75 /* максимальная длина строки */

 

/******* Следующие переменные имеют тип UNKNOWN *******/

ZAD = UNKNOWN /* Задолженность поставщика. Boolean */

REN = UNKNOWN /* Рентабельность. Boolean */

REC = UNKNOWN /* Наличие рекламаций. Boolean */

UD = UNKNOWN /* Удаленность поставщика. Integer */

ST = UNKNOWN /* Статус поставщика. String */

NAD = UNKNOWN /* Надёжность поставщика */

FIN = UNKNOWN /* Финансовое состояние */

WORK = UNKNOWN /* Рабочая переменная */

 

DO:

putform vivod;

if 50 < hicf(nad) then

at 12,27 output «Надежность поставщика – TRUE», hival(nad);

at 13,27 output «Фактор уверенности = », hicf(nad);

else

at 12,27 output «Надежность поставщика – FALSE»;

at 13,27 output «Фактор уверенности = », 100 - hicf(nad);

endif;

 

RULE: R1

PRIORITY: 100

COST: 100

IF: ren = true and zad = false

THEN: fin = true

REASON: Если рентабельность высокая и нет задолженности, то финансовое состояние достаточно высокое.

 

RULE: R2

PRIORITY: 100

COST: 100

IF: ren = false and zad = true

THEN: fin = false

REASON: Если рентабельность низкая, то финансовое состояние плохое

 

RULE: R3

PRIORITY: 100

COST: 90

IF: ren = true and zad = true

THEN: work = false

REASON: Если есть задолженность, то финансовое состояние достаточно плохое

 

RULE: R33

PRIORITY: 100

COST: 90

IF: ren = false and zad = false

THEN: work = true

REASON: Если нет рентабельности, но и нет задолженности, то финансовое состояние можно считать удовлетворительным

 

RULE: R4

PRIORITY: 100

IF: fin = true

THEN: nad += true cf 90

REASON: Если финансовое состояние хорошее, то надежность поставщика высокая

 

RULE: R44

PRIORITY: 100

IF: work = true

THEN: nad += true cf 54

REASON: Если финансовое состояние удовлетворительное, то надёжность поставщика повышается

 

RULE: R5

PRIORITY: 100

IF: fin = false

THEN: nad -= true cf 90

REASON: Если финансовое состояние плохое, то надежность поставщика низкая

 

RULE: R55

PRIORITY: 100

IF: work = false

THEN: nad -= true cf 63

REASON: Если есть задолженность, то надёжность поставщика снижается

 

RULE: R6

PRIORITY: 90

IF: rec = 1

THEN: nad -= true cf 60

REASON: Если есть рекламации, то надежность поставщика низкая

 

RULE: R7

PRIORITY: 90

IF: rec = 2

THEN: nad += true cf 80

REASON: Если рекламаций нет, то надежность поставщика высокая

 

RULE: R8

PRIORITY: 80

IF: st = «gosud»

THEN: nad += true cf 70

REASON: Если предприятие государственное, то надежность высокая

 

RULE: R9

PRIORITY: 80

IF: st = «akc»

THEN: nad += true cf 70

REASON: Если предприятие акционерное, то надежность высокая

 

RULE: R10

PRIORITY: 80

IF: st = «sovmest»

THEN: nad += true cf 70

REASON: Если предприятие совместное, то надежность высокая

 

RULE: R11

PRIORITY: 80

IF: st = «maloe»

THEN: nad += true cf 50

REASON: Если предприятие малое, то надежность средняя

 

RULE: R12

PRIORITY: 80

IF: st = «kooper»

THEN: nad += true cf 50

REASON: Если предприятие кооперативное, то надежность средняя

 

RULE: R13

PRIORITY: 80

IF: st = «individ»

THEN: nad += true cf 20

REASON: Если предприятие индивидуальное, то надежность низкая

 

RULE: R14

PRIORITY: 70

IF: ud <= 1000

THEN: nad += true cf 70

REASON: Если удаленность поставщика небольшая, то надежность высокая

 

RULE: R15

PRIORITY: 70

IF: ud > 1000

THEN: nad -= true cf 30

REASON: Если удаленность поставщика большая, то надежность низкая

 

VAR: NAD

TYPE: pp

LABEL: Надежность поставщика

 

VAR: REN

FIND:

clear;

let deci = e.deci;

let lnum = e.lnum;

let e.deci = 0;

let e.lnum = 1;

putform main;

wait;

clear;

at 5,10 input tmpv num with «Введите рентабельность: (1–Есть, 2–Нет)»

if tmpv = 1 then

let ren = true;

else

let ren = false;

endif;

LABEL: Рентабельность

 

VAR: ZAD

FIND:

at 7,10 input tmpv num with «Введите задолженность: (1–Есть, 2–Нет)»

if tmpv = 1 then

let zad = true;

else

let zad = false;

endif;

LABEL: Задолженность

 

VAR: FIN

LABEL: Финансовое состояние

 

VAR: REC

FIND:

let e.icf = true;

at 9,10 input rec int with «Введите рекламации (1 – Есть, 2 – Нет): »

let e.icf = false;

LABEL: Рекламации

 

VAR: ST

FIND:

at 11,11 ? «Статус предприятия:»

at 12,10 ? « 1 – государственное,»;

at 13,10 ? « 2 – акционерное,»;

at 14,10 ? « 3 – совместное,»;

at 15,10 ? « 4 – малое,»;

at 16,10 ? « 5 – кооперативное,»;

at 17,10 ? « 6 – индивидуальное»;

at 18,10 input tmp num with «Укажите статус предприятия: »

if tmp = 1 then let st = «gosud»;

else if tmp = 2 then let st = «akc»;

else if tmp = 3 then let st = «sovmest»;

else if tmp = 4 then let st = «maloe»;

else if tmp = 5 then let st = «kooper»;

else let st = «individ»;

endif; endif; endif; endif; endif;

e.deci = deci;

e.lnum = lnum;

LABEL: Статус предприятия

 

VAR: UD

FIND:

at 20,10 input ud num with «Введите удаленность поставщика в км: »

at 23,21 ? «*** Ввод значений завершен. ***»;

at 24,21 ? «*** press any key ***»;

wait;

clear;

LABEL: Удаленность поставщика

 

VAR: WORK

LABEL: Финансовое состояние

 

END:

 








Дата добавления: 2015-10-13; просмотров: 843;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.06 сек.