Особенности решения концептуальной модели задачи решающего комплекса

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



?чеством итераций, которые необходимы для решения.

Переносимость и интегрируемость

Так как программа написана на Python, программа является переносимой на любую платформу (Windows, Linux, MacOS).

В целях интегрируемости программа принимает параметры в командной строке. Перечень параметров:

t, --type - [math | sudoku] - тип шаблона, математические формулы по предметной области или судоку

a, --task - [solve | generate] - задание, решить или создать, для шаблона math по умолчанию - решить

m, --method - [[None] | [brute | analytic] | [opening | cut]] - метод, не применим для шаблона math, принимает значения brute или analytic при задании solve или opening или cut при задании generate

q, --template - шаблон для математических формул

i, --input - входной файл

o, --output - выходной файл

Литература

1.Нечаев В.В. Концептуальное модельное представление задачи как системы. Информационные технологии, № 2009.с.

2.

Приложение

Программный код

Решатель математических моделей

# -*- coding: cp1251 -*-mathcodecsresysstringgraphWindowcopy

solver():__init__(self, data, rules, goals, **kwargs):._recursionLevel = 0.data = (data.lower()).split("\n").rules = (rules.lower()).split("\n").goals = (goals.lower()).split("\n").rawgoals = self.goals.templateVars = kwargs.get('templateVars', {}).templateFull = kwargs.get('templateFull', {}).sErrTxt = ''.sSolveTxt = ''.env = kwargs.get('env', {}).__globals = {}.__locals = {}.fString = []

.parent = kwargs.get('parent', None)

.analyzeData().analyzeRules().analyzeGoals()

.makeSolveFor()

#for g in self.goals:

#self.makeSolveFor(g)

analyzeData(self):.definiedVariables = []q in self.data:= q.split('=').definiedVariables.append(r[0].strip()).definiedVariablesFirst = copy.copy(self.definiedVariables)

analyzeRules(self):self.rules.ruledVariablesLeft = [].ruledVariablesRight = []= 0 q in self.rules:= q.split('=').ruledVariablesLeft.append(r[0]):[1]IndexError:.solveErr = 31.solveErrExtend = { 'vString' : r}.solveErrorsText()= re.split('([A-Za-z]+)([0-9]*)', r[1]).ruledVariablesRight.append([])splRulessId in range(len(splRules)-1):= splRules[sId]= splRules[sId+1]re.match('^[A-Za-z]+$', sRule) and ('' == nsRule or re.match('^[0-9]+$', nsRule)):sRule+nsRule.ruledVariablesRight[l].append(str(sRule+nsRule))= l + 1

analyzeGoals(self):= self.goals.goals = []i in goals:= re.split('(^[A-Za-z]+)([0-9]+)$', i).goals.append({ 'goalLine' : i,

'goalParts' : goalParts if goalParts[0] != '' else goalParts[1:3]

})

makeSolveFor(self):'Solving'self.ruledVariablesLeftself.ruledVariablesRightself.goals.solveErr = 0.solveErrExtend = {}.solution = 0.solutionString = 'крабе'

('import math', self.__globals, self.__locals)

cGoal in self.goals:cGoal['goalParts'][0] not in self.templateVars['vars'].lower().split(','):.solveErr = 24.solveErrExtend = { 'vName' : cGoal['goalParts'][0], 'dVars' : self.templateVars['vars']}

cGoal in self.goals:'definded: '+ ''.join(self.definiedVariables)'goal:'+cGoal['goalLine']cGoal['goalLine'] in self.definiedVariables:'Found'.solveErr = 14.solveErrExtend = cGoal['goalLine'].solveErrorsText()self._recursionLevel == 0:iData in self.data:iData.strip() == ''::(iData+';', self.__globals, self.__locals)

self.log("Ввод (exec) начальной информации: %s"%(iData))

except NameError as err:'NameError %s' %(err).solveErr = 1.solveErrExtend = { 'vName' : err }:'Unknown exception %s'%sys.exc_info()[0].solveErr = 3.solveErrExtend = {}

m in range(len(self.goals)):.log('Step %d:\n'%m)

iRule in self.rules:iRule.strip() == ''::

self.log('Применяем правило %s' %iRule)

exec(iRule+';', self.__globals, self.__locals)NameError as err:'NameError %s' %(err).solveErr = 15.solveErrExtend = { 'vName' : err }.solveErrorsText():'Unknown exception'.solveErr = 18.solveErrExtend = {}.solveErrorsText()

= self.preFind()

#l = [0](l[0] not in (0, 2, 5, 13)):12 == l[0]:.solveErrorsText()self._recursionLevel < 2:._recursionLevel = self._recursionLevel + 1.makeSolveFor():.solveErrorsText()2 == l[0]:.solveErrorsText()5 == l[0]::.solveErrorsText() (l[1]['ruleString'], self.__globals, self.__locals).log(l[1]['varName']).log("%s = %2.8lf" %(l[1]['varName'], eval(l[1]['varName'], self.__globals, self.__locals)))NameError as s:'NameError in right solving %s' %s.solveErr = 21.solveErrExtend = l[1].solveErrorsText()

(key, val) in self.templateFull.iteritems():(key == self.goals[m]['goalParts'][0]):'Found %s'%key:-1 != self.goals[m]['goalParts'][1]:

# заменяем шаблон= val.lower()ctr in self.templateVars['vars'].lower().split(','):= string.replace(lf, ctr, ctr+str(self.goals[m]['goalParts'][1]))IndexError as s:'IndexError %s'%s= val.lower().log('Применение шаблона %s = %s для переменной %s (%s = %s)' % (key, val, self.goals[m]['goalLine'], self.goals[m]['goalLine'], lf)):("%s=%s"%(self.goals[m]['goalLine'], lf), self.__globals, self.__locals).fString.append((self.goals[m]['goalLine'], lf)).log(self.goals[m]['goalLine'])= eval(self.goals[m]['goalLine'], self.__globals, self.__locals).log("%s = %2.8lf" %(self.goals[m]['goalLine'], r)).data.append(r).definiedVariables.append(self.goals[m]['goalLine'])

.checkEnv(self.goals[m]['goalLine'], r)

NameError as err:.solveErr = 36 .solveErrExtend = { 'line' : "%s=%s"%(self.goals[m]['goalLine'], lf), 'err' : err}:.solveErr = 37.solveErrExtend = { 'line' : "%s=%s"%(self.goals[m]['goalLine'], lf), 'err' : sys.exc_info()[0]}

# if (key == self.goals[m]['goalLine']):

preFind(self):'Analyzing'self.goals, self._recursionLevelsGoal in self.goals:= sGoal['goalLine']sRule in self.ruledVariablesRight:goalLine in sRule:.solveErr = 2.solveErrExtend = {'vName' : goalLine}(2, {})goalLine in self.ruledVariablesLeft:.solveErr = 5= self.retRuleStringByVal(goalLine).solveErrExtend = { 'vName' : goalLine, 'ruleString' : rS } (5, {'ruleString' : rS, 'varName' : goalLine})= 0sRule in self.ruledVariablesRight:l in sRule:l in self.definiedVariables:= 1l in self.ruledVariablesLeft:= 2

1 == err: (0, {})2 == err:.solveErr = 13(0, {}): = self.analyzeGoalsNeeded()qq == '':(0, {}):.solveErr = 12= self.analyzeGoalsNeeded().solveErrExtend = { 'vName' : line }

#self.goals = ('%s' %(line)).split('\'')[1]+"\n".join(self.rawgoals).goals = [].goals.append(('%s' %(line)).split('\'')[1])i in self.rawgoals:.goals.append(i).log('Поиск \'%s\''%('%s' %(line)).split('\'')[1])'Поиск \'%s\''%('%s' %(line)).split('\'')[1].analyzeGoals() (12, {})

analyzeGoalsNeeded(self):goalLine in self.goals:= goalLine['goalLine']= goalLine['goalParts'](key, val) in self.templateFull.iteritems():key == gP[0]::-1 != gP[1]:

# заменяем шаблон= val.lower()ctr in self.templateVars['vars'].lower().split(','):= string.replace(lf, ctr, ctr+str(self.goals[m]['goalParts'][1]))IndexError as s:'IndexError %s'%s= val.lower():lf(lf, self.__globals, self.__locals)NameError as err:err''

simpleCheckEnv(self, varName, envVar, envParts, envElem)::[1]:envVar == varName:= eval(envElem, self.__globals, self.__locals)l:'TRUE':

self.log('Переменная %s не удовлетворяет параметрам внешней среды (%s)'%(varName, envElem))

print 'FALSE'

checkEnv(self, varName, res):'Checking %s by %lf'%(varName, res)self.env(envKey, envElem) in self.env.iteritems():= envElem.split('>=')= envParts[0].lower().strip().simpleCheckEnv(varName, envVar, envParts, envElem)= envElem.split('')= envParts[0].lower().strip().simpleCheckEnv(varName, envVar, envParts, envElem)= envElem.split('<')= envParts[0].lower().strip().simpleCheckEnv(varName, envVar, envParts, envElem) retRuleStringByVal(self, val):i in self.rules:val == i.split('=')[0].strip():i

retSolving(self, **kwargs):= { 'err' : self.solveErr,

'errTxt' : self.sSolveTxt,

'sol' : self.solution,

'solStr' : self.sSolveTxt

}ret

solveErrorsText(self):.log({

: lambda q: 'ОК',

1 : lambda q: "Переменная %s используется, но не задана" %(q['vName']),

: lambda q: "Переменная %s задана для поиска и в то же время используется в правиле. Возможна рекурсия"%(q),

: lambda q: 'Неизвес