Диссертация (1149691), страница 24
Текст из файла (страница 24)
Также данная реализацияинтересна тем, что в ней задействована библиотека для решения задач линейного программирования.Листинг 4.6 — Реализация алгоритма проверки непротиворечивости.public override bool checkConsistency (){int lp ;if ( pattern is IntervalConjunctKnowledgePattern )5{lp = setConjunctConstraints () ;} else136{lp = setQuantConstraints () ;1015}Matrix < double > newProbabilities = solveProblem ( lp , pattern .getVectorSize () ) ;if ( newProbabilities .
RowCount > 0){pattern . setProbabilities ( newProbabilities ) ;return true ;} else{return false ;}20 }Листинг 4.7 содержит этапы определения типа фрагмента знаний (ФЗнад идеалом конъюнктов или над пропозициями-квантами) и дальнейшеговызова методов, соответствующих каждому из типов ФЗ. Заметим, что библиотека lp_solve 5.5 устроена таким образом, что мы имеем возможностьполностью разделить процесс установки ограничений от решения задачимаксимизации и минимизации целевой функции, что позволяет реализовать общий метод solveProblem(lp, rowColumnNumber), принимающий в качествепараметров ранее созданную ЗЛП и количество переменных, для обоих типов фрагментов знаний, рассматриваемых в данной функции.
Рассмотримподобнее из каких этапов состоит задание ограничений,а затем и само решение ЗЛП для фрагмента знаний над идеалом конъюнктов.Листинг 4.7 — Метод, задающий ограничения в ЗЛП над ФЗ спропозициями-квантами.private int setConjunctConstraints (){var I_n = matrixHelper . getKronekerPowerOfI ( pattern . getSize () ) ;lpsolve . Init ( " . " ) ;5var rowColumnNumber = Convert . ToInt32 ( Math . Pow (2 , pattern .getSize () )) ;int lp = lpsolve . make_lp (0 , rowColumnNumber ) ;double [] E_constraint_row = new double [ rowColumnNumber + 1];lpsolve . set_add_rowmode ( lp , true ) ;var P_c = pattern . getProbabilities () ;10for ( int i = 0; i < rowColumnNumber ; i ++){137for ( int j = 0; j < rowColumnNumber ; j ++){E_constraint_row [ j + 1] = I_n [i , j ]; // column - row value ,coefficient}if (! lpsolve .
add_constraint ( lp , E_constraint_row , lpsolve .lpsolve_constr_types .GE , 0) ){Console . WriteLine ( " Incorrect constraint added ! " ) ;}lpsolve . set_bounds ( lp , i + 1 , P_c [i , 0] , P_c [i , 1]) ;1520}lpsolve . set_add_rowmode ( lp , false ) ;lpsolve . write_lp ( lp , " interval_conjunct_lp " ) ;return lp ;25 }В первой строке объявляется матрица I , необходимая для заданияусловия непротиворечивости фрагмента знаний на матрично-векторномязыке. В следующих четырех строках инициализируется переменная типаint, хранящая задачу линейного программирования, и прочие необходимыепеременные. Устанавливая в следующей строке rowmode равным true, мы объявляем, что собираемся задавать ограничения в ЗЛП построчно.
Внутрицикла for на каждой итерации вносятся ограничения, следующие из аксиоматики теории вероятностей (ℰ ), а с помощью метода set_bounds задаютсяограничения . Устанавливая по завершении выполнения цикла rowmode равным false мы обозначаем конец блока, в котором задаются ограничения.Данный метод возвращает число int, которое хранит в себе всю информацию о всех добавленных ограничениях.Теперь перейдем к методу solveProbelm, принимающему в качестве параметров 2 числа типа int, первое из которых хранит информацию о ЗЛП,а второе размер множества квантов (идеала конъюнктов), над которым построен данный ФЗ.Листинг 4.8 — Покомпонентное решение задачи линйеногопрограммирования.private Matrix < double > solveProblem ( int lp , int rowColumnNumber ){Matrix < double > newProbabilities = DenseMatrix .
Create (rowColumnNumber , 2 , 0) ;138for ( int i = 0; i < rowColumnNumber ; i ++){lpsolve . set_obj_fnex ( lp , 1 , new double [] { 1 } , new int [] {i + 1 }) ;lpsolve . set_minim ( lp ) ;if ( lpsolve . solve ( lp ) == lpsolve . lpsolve_return . OPTIMAL ){newProbabilities [i , 0] = lpsolve . get_objective ( lp ) ;} else{Console .
WriteLine ( " Linear programming problem can not besolved " );return DenseMatrix . Create (0 , 0 , 0) ;}lpsolve . set_maxim ( lp ) ;if ( lpsolve . solve ( lp ) == lpsolve . lpsolve_return . OPTIMAL ){newProbabilities [i , 1] = lpsolve . get_objective ( lp ) ;} else{Console . WriteLine ( " Linear programming problem can not besolved " );return DenseMatrix . Create (0 , 0 , 0) ;}}return newProbabilities ;510152025}В первой строке мы инициализируем матрицу 2 × , в которую вдальнейшем будем записывать уточненные вероятности.
Внутри цикла мыитерируем по всем компонентам вектора вероятностей и для каждой изних решаем задачу максимизации и минимизации, а полученный результатзаписываем в соответствующую компоненту результирующей матрицы. Вслучае, если хоть одна из задач по максимизации-минимизации неразрешима, функция возвращает пустую матрицу. Таким образом, если размерностьматрицы, возвращаемой данным методом не нулевая, то оценки, хранимыев данной матрице принимаются как уточненные оценки вероятностей, иначе оценки остаются прежними, а метод isConsistent возвращает false.139Локальный априорный выводРеализация алгоритма априорного вывода существенно упрощаетсяблагодаря использованию библиотеки Math.NET.
Алгебраические операциинад матрицами и векторами позволяют сократить объем и повысить читаемость кода. На следующем листинге приведена реализация алгоритмалокального априорного вывода над фрагментом знаний со скалярнымиоценками вероятностей. Единственным параметром метода consluseFormulaявляется характеристический вектор пропозициональной формулы надмножеством квантов, состоящий из 0 и 1.Листинг 4.9 — Метод, реализующий априорный вывод над ФЗ сскалярными оценками вероятностей.public virtual double concluseFormula ( Vector < double > X_f ){Matrix < double > P_q = getQuantsProbability () ;return X_f * P_q .
Column (0) ;5}1015protected Matrix < double > getQuantsProbability (){Matrix < double > P_q ;if ( pattern is ScalarConjunctKnowledgePattern ){var I_n = matrixHelper . getKronekerPowerOfI ( pattern . getSize() ) ;P_q = I_n * pattern . getProbabilities () ;}else{P_q = pattern . getProbabilities () ;}return P_q ;20 }Метод getQuantsProbability() возвращает оценки вероятностей квантовдля текущего фрагмента знаний. В случае фрагмента знаний с интервальными оценками потребуется решить ЗЛП по поиску минимума и максимума140вероятности указанной пропозициональной формулы. Рассмотрим следующий листинг, представляющий реализацию алгоритма априорного выводаво фрагменте знаний с интервальными оценками.Листинг 4.10 — Реализаця алгоритма априорного вывода.public new Vector < double > concluseFormula ( Vector < double > X_f ){Vector < double > formulaProbability = DenseVector .
Create (2 , 0) ;int lp ;5if ( pattern is IntervalConjunctKnowledgePattern ){var I_n_transposed = matrixHelper . getKronekerPowerOfI (pattern . getSize () ) . Transpose () ;var row = ( I_n_transposed * X_f ). ToArray () ;lp = setConjunctConstraints () ;10lpsolve . set_obj_fn ( lp , row ) ;} else{lp = setQuantConstraints () ;lpsolve . set_obj_fn ( lp , X_f . ToArray () ) ;15}20253035lpsolve . set_minim ( lp );if ( lpsolve . solve ( lp ) == lpsolve . lpsolve_return .
OPTIMAL ){formulaProbability [0] = lpsolve . get_objective ( lp ) ;} else{Console . WriteLine ( " Linear programming problem can not besolved " );return DenseVector . Create (2 , 0) ;}lpsolve . set_maxim ( lp );if ( lpsolve . solve ( lp ) == lpsolve . lpsolve_return . OPTIMAL ){formulaProbability [1] = lpsolve . get_objective ( lp ) ;} else{Console . WriteLine ( " Linear programming problem can not besolved " );return DenseVector . Create (2 , 0) ;}141return formulaProbability ;}Как и в случае с поддержанием непротиворечивости, в первых строках мы инициализируем переменные и задаем ограничения в зависимостиот типа фрагмента знаний. Целевой функцией в данном случае являетсялибо характеристический вектор формулы над множеством квантов, либо он же, домноженный на транспонированную матрицу I .















