Пример #1
0
 def solve(self, stepsize=1.0 / scalar_var('iter'), cur=None):
     if isNumber(stepsize): stepsize = scalar(stepsize)
     if self.type == MAXIMIZE:
         self.obj = -self.obj
     vars = self.obj.get_vars()
     if cur == None:
         cur = {}
         for var in vars:
             cur[var] = 0.0
     optval = None
     for iter in range(1, MAXITERS + 1):
         f = self.obj.get_value(cur)
         g = None
         maxres = 0
         for cons in self.constraints:
             if cons.get_value(cur) > maxres:
                 maxres = cons.get_value(cur)
                 g = cons.subgrad(cur)
         if g == None: g = self.obj.subgrad(cur)
         norm = math.sqrt(sum([x**2 for x in g.itervalues()]))
         if norm < EPS: break
         nxt = {}
         if self.type == MAXIMIZE:
             stepsizedic = {'f': -f, 'gnorm': norm, 'iter': iter}
         else:
             stepsizedic = {'f': f, 'gnorm': norm, 'iter': iter}
         alpha = stepsize.get_value(stepsizedic)
         assert alpha > 0
         for (key, val) in g.iteritems():
             nxt[key] = cur[key] - val * alpha
         cur = nxt
     if self.type == MAXIMIZE:
         self.obj = -self.obj
     optval = self.obj.get_value(cur)
     return (optval, cur)
Пример #2
0
 def solve(self, stepsize = 1.0/scalar_var('iter'), cur = None):
     if isNumber(stepsize): stepsize = scalar(stepsize)
     if self.type == MAXIMIZE:
         self.obj = -self.obj
     vars = self.obj.get_vars()
     if cur == None:
         cur = {}
         for var in vars: cur[var] = 0.0
     optval = None
     for iter in range(1, MAXITERS+1):
         f = self.obj.get_value(cur)
         g = None
         maxres = 0
         for cons in self.constraints:
             if cons.get_value(cur) > maxres:
                 maxres = cons.get_value(cur)
                 g = cons.subgrad(cur)
         if g == None: g = self.obj.subgrad(cur)
         norm = math.sqrt(sum([x**2 for x in g.itervalues()]))
         if norm < EPS: break
         nxt = {}
         if self.type == MAXIMIZE:
             stepsizedic = {'f': -f, 'gnorm': norm, 'iter': iter}
         else:
             stepsizedic = {'f': f, 'gnorm': norm, 'iter': iter}
         alpha = stepsize.get_value(stepsizedic)
         assert alpha > 0
         for (key, val) in g.iteritems():
             nxt[key] = cur[key]-val*alpha
         cur = nxt
     if self.type == MAXIMIZE:
         self.obj = -self.obj
     optval = self.obj.get_value(cur)
     return (optval, cur)
Пример #3
0
 def __init__(self, type, obj, constraints):
     if isNumber(obj): obj = scalar(obj)
     assert type in [MINIMIZE, MAXIMIZE]
     assert (type == MINIMIZE and obj.is_convex()) or (type == MAXIMIZE and obj.is_concave())
     self.type = type
     self.obj = obj
     self.constraints = []
     for cons in constraints:
         if cons.relop == LT or cons.relop == EQ:
             self.constraints.append(cons.lhs-cons.rhs)
         if cons.relop == GT or cons.relop == EQ:
             self.constraints.append(cons.rhs-cons.lhs)
Пример #4
0
 def __init__(self, type, obj, constraints):
     if isNumber(obj): obj = scalar(obj)
     assert type in [MINIMIZE, MAXIMIZE]
     assert (type == MINIMIZE and obj.is_convex()) or (type == MAXIMIZE
                                                       and obj.is_concave())
     self.type = type
     self.obj = obj
     self.constraints = []
     for cons in constraints:
         if cons.relop == LT or cons.relop == EQ:
             self.constraints.append(cons.lhs - cons.rhs)
         if cons.relop == GT or cons.relop == EQ:
             self.constraints.append(cons.rhs - cons.lhs)