Разработка ИИ в КС Отчет №2
.pdf
[wm,applied]=run_inference(rules,facts); fprintf('\n--- Рекомендация ---\n');
brand=get_first_value(wm,'рекомендация_марки'); model=get_first_value(wm,'рекомендация_модели'); if ~isempty(brand) && ~isempty(model), fprintf('%s %s\n',brand,model); else fprintf('Не найдено.\n'); end fprintf('Характеристики: кузов=%s, двигатель=%s, коробка=%s, привод=%s\n',...
get_first_value(wm,'кузов'), get_first_value(wm,'двигатель'), get_first_value(wm,'коробка'), get_first_value(wm,'привод')); if ~isempty(applied), fprintf('Сработало правил: %d\n',length(applied)); end
end
function scenario_student(rules) fprintf('\n--- СТУДЕНТ ---\n'); facts = get_facts_from_user();
[wm,applied]=run_inference(rules,facts); fprintf('\n--- Рабочая память ---\n');
for i=1:size(wm,1)
if isnumeric(wm{i,2}), fprintf(' %s: %d\n',wm{i,1},wm{i,2}); else fprintf(' %s: %s\n',wm{i,1},wm{i,2}); end end
fprintf('\n--- Применённые правила ---\n');
for i=1:length(applied), fprintf('%d. %s\n',i,applied(i).description); end brand=get_first_value(wm,'рекомендация_марки'); model=get_first_value(wm,'рекомендация_модели'); if ~isempty(brand) && ~isempty(model), fprintf('\nРекомендация: %s %s\n',brand,model); end
end
function scenario_expert(rules) fprintf('\n--- ЭКСПЕРТ ---\n'); while true
fprintf('\n1-тест 2-просмотр правил 0-выход\n'); act=input('Выбор: ');
if act==1 facts=get_facts_from_user();
[wm,applied]=run_inference(rules,facts);
brand=get_first_value(wm,'рекомендация_марки'); model=get_first_value(wm,'рекомендация_модели'); fprintf('Рекомендация: %s %s (правил: %d)\n',brand,model,length(applied));
elseif act==2
for i=1:length(rules), fprintf('%d. %s\n',i,rules(i).description); end else break; end
end end
11
function scenario_knowledge_engineer(rules) fprintf('\n--- ИНЖЕНЕР ПО ЗНАНИЯМ ---\n'); while true
facts=get_facts_from_user(); if isempty(facts), break; end
[wm,applied]=run_inference(rules,facts); fprintf('\n--- Вывод ---\n');
for i=1:size(wm,1), if isnumeric(wm{i,2}), fprintf('%s: %d\n',wm{i,1},wm{i,2}); else fprintf('%s: %s\n',wm{i,1},wm{i,2}); end; end
fprintf('\nПрименённые правила:\n');
for i=1:length(applied), fprintf('%d. %s\n',i,applied(i).description); end fprintf('\n');
end end
% Вспомогательные
function facts = get_facts_from_user() facts = {};
fprintf('Вводите факты (имя значение). "стоп" для завершения.\n'); while true
inp=input('Факт: ','s');
if strcmpi(inp,'стоп'), break; end parts=strsplit(inp);
if length(parts)>=2 name=parts{1}; value=parts{2}; num=str2double(value);
if ~isnan(num), value=num; end facts{end+1}={name,value};
end end end
function wm = add_fact(wm,name,value)
if ~has_fact(wm,name,value), wm{end+1,1}=name; wm{end,2}=value; end end
function present = has_fact(wm,name,value) present=false;
for i=1:size(wm,1)
12
if strcmp(wm{i,1},name) && isequal(wm{i,2},value), present=true; return; end end
end
function values = get_facts_by_name(wm,name) values={};
for i=1:size(wm,1), if strcmp(wm{i,1},name), values{end+1}=wm{i,2}; end; end end
function value = get_first_value(wm,name) vals=get_facts_by_name(wm,name);
if ~isempty(vals), value=vals{1}; else value=[]; end end
function [wm,applied] = run_inference(rules,initial_facts) wm={};
for i=1:length(initial_facts), wm=add_fact(wm,initial_facts{i}{1},initial_facts{i}{2}); end applied=struct('conditions',{},'conclusions',{},'description',{});
new_facts_added=true; while new_facts_added
new_facts_added=false; for r=1:length(rules)
rule=rules(r); all_cond=true;
for c=1:length(rule.conditions) cond=rule.conditions{c};
if ~has_fact(wm,cond{1},cond{2}), all_cond=false; break; end end
if all_cond rule_applied=false;
for c=1:length(rule.conclusions) concl=rule.conclusions{c};
if ~has_fact(wm,concl{1},concl{2}) wm=add_fact(wm,concl{1},concl{2}); rule_applied=true;
end end
if rule_applied, applied(end+1)=rule; new_facts_added=true; end
13
end
end
end
end
14
