obj2 = [ Expr.mul(c, z) for c, z in [ # Individual image/command pairs (r['A'], z_1_a), (r['B'], z_1_b), (r['A'], z_2_a), (r['B'], z_2_b), (r['C'], z_2_c), (r['D'], z_2_d), (r['B'], z_3_b), (r['C'], z_3_c), (r['D'], z_3_d), ] ] m.objective('w', ObjectiveSense.Maximize, Expr.sub(Expr.add(obj2), Expr.add(obj1))) m.setLogHandler(sys.stdout) m.solve() print print 'Images:' print '\tw_1 = %.0f' % w_1.level()[0] print '\tw_2 = %.0f' % w_2.level()[0] print '\tw_3 = %.0f' % w_3.level()[0] print print 'Commands:' print '\ty_a = %.0f' % y_a.level()[0] print '\ty_b = %.0f' % y_b.level()[0] print '\ty_c = %.0f' % y_c.level()[0] print '\ty_d = %.0f' % y_d.level()[0]
m.constraint('c_2_b', Expr.add([x_2_b]), Domain.equalsTo(1.0)) m.constraint('c_2_c', Expr.add([x_2_c]), Domain.equalsTo(1.0)) m.constraint('c_2_d', Expr.add([x_2_d]), Domain.equalsTo(1.0)) m.constraint('c_3_b', Expr.add([x_3_b]), Domain.equalsTo(1.0)) m.constraint('c_3_c', Expr.add([x_3_c]), Domain.equalsTo(1.0)) m.constraint('c_3_d', Expr.add([x_3_d]), Domain.equalsTo(1.0)) # Minimize resources required to construct all images. obj = [Expr.mul(c, x) for c, x in [ # Individual image/command pairs (r['A'], x_1_a), (r['B'], x_1_b), (r['A'], x_2_a), (r['B'], x_2_b), (r['C'], x_2_c), (r['D'], x_2_d), (r['B'], x_3_b), (r['C'], x_3_c), (r['D'], x_3_d), ]] m.objective('w', ObjectiveSense.Minimize, Expr.add(obj)) m.setLogHandler(sys.stdout) m.solve() print print 'Image 1:' print '\tx_1_a = %.0f' % x_1_a.level()[0] print '\tx_1_b = %.0f' % x_1_b.level()[0] print print 'Image 2:' print '\tx_2_a = %.0f' % x_2_a.level()[0] print '\tx_2_b = %.0f' % x_2_b.level()[0] print '\tx_2_c = %.0f' % x_2_c.level()[0] print '\tx_2_d = %.0f' % x_2_d.level()[0] print
# Eliminated intersections between cliques. m.constraint('e1', Expr.add([x_23_bcd, x_123_b]), Domain.lessThan(1.0)) # Minimize resources required to construct all images. obj = [Expr.mul(c, x) for c, x in [ # Individual image/command pairs (r['A'], x_1_a), (r['B'], x_1_b), (r['A'], x_2_a), (r['B'], x_2_b), (r['C'], x_2_c), (r['D'], x_2_d), (r['B'], x_3_b), (r['C'], x_3_c), (r['D'], x_3_d), # Cliques (r['B'] + r['C'] + r['D'], x_23_bcd), (r['B'], x_123_b), (r['C'] + r['D'], x_123_b_23_cd), ]] m.objective('w', ObjectiveSense.Minimize, Expr.add(obj)) m.setLogHandler(sys.stdout) m.solve() print print 'Image 1:' print '\tx_1_a = %.0f' % x_1_a.level()[0] print '\tx_1_b = %.0f' % x_1_b.level()[0] print print 'Image 2:' print '\tx_2_a = %.0f' % x_2_a.level()[0] print '\tx_2_b = %.0f' % x_2_b.level()[0] print '\tx_2_c = %.0f' % x_2_c.level()[0] print '\tx_2_d = %.0f' % x_2_d.level()[0] print
(r['A'], z_1_a), (r['B'], z_1_b), (r['A'], z_2_a), ]] obj3 = [Expr.mul(c, z) for c, z in [ # Individual image/command pairs for commands that are now run alone (r['B'], q_2_b), (r['C'], q_2_c), (r['D'], q_2_d), (r['B'], q_3_b), (r['C'], q_3_c), (r['D'], q_3_d), ]] obj4 = [Expr.mul(c, y) for c, y in [ # Commands taken out of the existing cliques (r['B'], n_b), (r['C'], n_c), (r['D'], n_d) ]] m.objective('w', ObjectiveSense.Maximize, Expr.sub(Expr.add(obj2 + obj4), Expr.add(obj1 + obj3)) ) m.setLogHandler(sys.stdout) m.solve() print print 'Images:' print '\tw_1 = %.0f' % w_1.level()[0] print '\tw_2 = %.0f' % w_2.level()[0] print '\tw_3 = %.0f' % w_3.level()[0] print print 'Commands:' print '\ty_a = %.0f' % y_a.level()[0] print '\ty_b = %.0f' % y_b.level()[0] print '\ty_c = %.0f' % y_c.level()[0]
m.constraint('c_3_d_1', Expr.sub(z_3_d, w_3), Domain.lessThan(0.0)) m.constraint('c_3_d_2', Expr.sub(z_3_d, y_d), Domain.lessThan(0.0)) m.constraint('c_3_d_3', Expr.sub(z_3_d, Expr.add([w_3, y_d])), Domain.greaterThan(-1.0)) # Maximize the amount we can improve our objective by adding a new clique. obj1 = [Expr.mul(c, y) for c, y in [ (r['A'], y_a), (r['B'], y_b), (r['C'], y_c), (r['D'], y_d) ]] obj2 = [Expr.mul(c, z) for c, z in [ # Individual image/command pairs (r['A'], z_1_a), (r['B'], z_1_b), (r['A'], z_2_a), (r['B'], z_2_b), (r['C'], z_2_c), (r['D'], z_2_d), (r['B'], z_3_b), (r['C'], z_3_c), (r['D'], z_3_d), ]] m.objective('w', ObjectiveSense.Maximize, Expr.sub(Expr.add(obj2), Expr.add(obj1))) m.setLogHandler(sys.stdout) m.solve() print print 'Images:' print '\tw_1 = %.0f' % w_1.level()[0] print '\tw_2 = %.0f' % w_2.level()[0] print '\tw_3 = %.0f' % w_3.level()[0] print print 'Commands:' print '\ty_a = %.0f' % y_a.level()[0] print '\ty_b = %.0f' % y_b.level()[0] print '\ty_c = %.0f' % y_c.level()[0] print '\ty_d = %.0f' % y_d.level()[0]
(r['D'], q_2_d), (r['B'], q_3_b), (r['C'], q_3_c), (r['D'], q_3_d), ] ] obj4 = [ Expr.mul(c, y) for c, y in [ # Commands taken out of the existing cliques (r['B'], n_b), (r['C'], n_c), (r['D'], n_d) ] ] m.objective('w', ObjectiveSense.Maximize, Expr.sub(Expr.add(obj2 + obj4), Expr.add(obj1 + obj3))) m.setLogHandler(sys.stdout) m.solve() print print 'Images:' print '\tw_1 = %.0f' % w_1.level()[0] print '\tw_2 = %.0f' % w_2.level()[0] print '\tw_3 = %.0f' % w_3.level()[0] print print 'Commands:' print '\ty_a = %.0f' % y_a.level()[0] print '\ty_b = %.0f' % y_b.level()[0] print '\ty_c = %.0f' % y_c.level()[0] print '\ty_d = %.0f' % y_d.level()[0]
def Build_Co_Model(self): r = len(self.roads) mu, sigma = self.mu, self.sigma m, n, r = self.m, self.n, len(self.roads) f, h = self.f, self.h M, N = m + n + r, 2 * m + 2 * n + r A = self.__Construct_A_Matrix() A_Mat = Matrix.dense(A) b = self.__Construct_b_vector() # ---- build Mosek Model COModel = Model() # -- Decision Variable Z = COModel.variable('Z', m, Domain.inRange(0.0, 1.0)) I = COModel.variable('I', m, Domain.greaterThan(0.0)) Alpha = COModel.variable('Alpha', M, Domain.unbounded()) # M by 1 vector Beta = COModel.variable('Beta', M, Domain.unbounded()) # M by 1 vector Theta = COModel.variable('Theta', N, Domain.unbounded()) # N by 1 vector # M1_matrix related decision variables ''' [tau, xi^T, phi^T M1 = xi, eta, psi^t phi, psi, w ] ''' # no-need speedup variables Psi = COModel.variable('Psi', [N, n], Domain.unbounded()) Xi = COModel.variable('Xi', n, Domain.unbounded()) # n by 1 vector Phi = COModel.variable('Phi', N, Domain.unbounded()) # N by 1 vector # has the potential to speedup Tau, Eta, W = self.__Declare_SpeedUp_Vars(COModel) # M2 matrix decision variables ''' [a, b^T, c^T M2 = b, e, d^t c, d, f ] ''' a_M2 = COModel.variable('a_M2', 1, Domain.greaterThan(0.0)) b_M2 = COModel.variable('b_M2', n, Domain.greaterThan(0.0)) c_M2 = COModel.variable('c_M2', N, Domain.greaterThan(0.0)) e_M2 = COModel.variable('e_M2', [n, n], Domain.greaterThan(0.0)) d_M2 = COModel.variable('d_M2', [N, n], Domain.greaterThan(0.0)) f_M2 = COModel.variable('f_M2', [N, N], Domain.greaterThan(0.0)) # -- Objective Function obj_1 = Expr.dot(f, Z) obj_2 = Expr.dot(h, I) obj_3 = Expr.dot(b, Alpha) obj_4 = Expr.dot(b, Beta) obj_5 = Expr.dot([1], Expr.add(Tau, a_M2)) obj_6 = Expr.dot([2 * mean for mean in mu], Expr.add(Xi, b_M2)) obj_7 = Expr.dot(sigma, Expr.add(Eta, e_M2)) COModel.objective( ObjectiveSense.Minimize, Expr.add([obj_1, obj_2, obj_3, obj_4, obj_5, obj_6, obj_7])) # Constraint 1 _expr = Expr.sub(Expr.mul(A_Mat.transpose(), Alpha), Theta) _expr = Expr.sub(_expr, Expr.mul(2, Expr.add(Phi, c_M2))) _expr_rhs = Expr.vstack(Expr.constTerm([0.0] * n), Expr.mul(-1, I), Expr.constTerm([0.0] * M)) COModel.constraint('constr1', Expr.sub(_expr, _expr_rhs), Domain.equalsTo(0.0)) del _expr, _expr_rhs # Constraint 2 _first_term = Expr.add([ Expr.mul(Beta.index(row), np.outer(A[row], A[row]).tolist()) for row in range(M) ]) _second_term = Expr.add([ Expr.mul(Theta.index(k), Matrix.sparse(N, N, [k], [k], [1])) for k in range(N) ]) _third_term = Expr.add(W, f_M2) _expr = Expr.sub(Expr.add(_first_term, _second_term), _third_term) COModel.constraint('constr2', _expr, Domain.equalsTo(0.0)) del _expr, _first_term, _second_term, _third_term # Constraint 3 _expr = Expr.mul(-2, Expr.add(Psi, d_M2)) _expr_rhs = Matrix.sparse([[Matrix.eye(n)], [Matrix.sparse(N - n, n)]]) COModel.constraint('constr3', Expr.sub(_expr, _expr_rhs), Domain.equalsTo(0)) del _expr, _expr_rhs # Constraint 4: I <= M*Z COModel.constraint('constr4', Expr.sub(Expr.mul(20000.0, Z), I), Domain.greaterThan(0.0)) # Constraint 5: M1 is SDP COModel.constraint( 'constr5', Expr.vstack(Expr.hstack(Tau, Xi.transpose(), Phi.transpose()), Expr.hstack(Xi, Eta, Psi.transpose()), Expr.hstack(Phi, Psi, W)), Domain.inPSDCone(1 + n + N)) return COModel