Beispiel #1
0
def solve_SAA(params, Xi, r):
    N = Xi.shape[0]
    Xi_pic = [pic.new_param('xi_' + str(i + 1), Xi[i]) for i in range(N)]
    # Unpack problem parameters
    c, q, xi_0, b, B = unpack_params_picos(params)
    r = pic.new_param('r', r)
    # Unpack artificial parameters
    E, c_tilde, E_tilde_arr, E_arr, e5 = define_art_params(
        c.get_value(), q.get_value(), xi_0)
    E, c_tilde, E_tilde_arr, E_arr, e5 = convert_art_params_picos(
        E, c_tilde, E_tilde_arr, E_arr, e5)
    # Get dimensions.
    x_dim = len(c)
    xi_dim = len(xi_0)
    num_piecewise_lin_f = len(E_tilde_arr)
    # Initialize picos problem.
    pb = pic.Problem()

    # Add variables.
    x_tilde = pb.add_variable("x_tilde", x_dim + 1)
    t = pb.add_variable("t", N)
    eta1_arr = [
        pb.add_variable("eta1_" + str(i + 1), xi_dim) for i in range(2)
    ]
    eta2_arr = [pb.add_variable("eta2_" + str(i + 1), 10) for i in range(2)]

    # Add constraints.
    for i in range(N):
        for j in range(num_piecewise_lin_f):
            pb.add_constraint((E_tilde_arr[j] * Xi_pic[i]) | x_tilde <= t[i])

    for j in range(2):
        pb.add_constraint(
            abs(B.T * E_arr[j].T * x_tilde - B.T *
                (eta1_arr[j] - eta2_arr[j])) <= MAX_MAN_HOUR -
            (x_tilde.T * E_arr[j] * xi_0 / r) -
            ((eta1_arr[j] + eta2_arr[j]) | b / r))
        # positivity of lagrange multipliers
        pb.add_constraint(eta1_arr[j] >= 0)
        pb.add_constraint(eta2_arr[j] >= 0)

    pb.add_constraint(E.T * x_tilde >= 0)
    pb.add_constraint(e5 | x_tilde == -1)

    # Set objective.
    pb.set_objective("min", (1 / N) * (1 | t) - (c_tilde | x_tilde))

    solution = pb.solve(solver='cvxopt')
    opt_val = -pb.obj_value()
    opt_sol = np.array(solution['cvxopt_sol']['x'][:x_dim]).reshape(-1).round(
        5)  # round 5 digits
    return opt_sol, opt_val
Beispiel #2
0
def solve_moment_based_partial_lifting(params, r, mu, t, g):
    g = pic.new_param('g', g)
    # Unpack problem parameters
    c, q, xi_0, b, B = unpack_params_picos(params)
    r = pic.new_param('r', r)
    # Unpack artificial parameters
    E, c_tilde, E_tilde_arr, E_arr, e5 = define_art_params(
        c.get_value(), q.get_value(), xi_0)
    E, c_tilde, E_tilde_arr, E_arr, e5 = convert_art_params_picos(
        E, c_tilde, E_tilde_arr, E_arr, e5)
    # Get dimensions.
    x_dim = len(c)
    xi_dim = len(xi_0)
    num_piecewise_lin_f = len(E_tilde_arr)
    t_dim = len(t)
    # Initialize picos problem.
    pb = pic.Problem()

    # Add variables.
    x_tilde = pb.add_variable("x_tilde", x_dim + 1)
    kappa = pb.add_variable("kappa", 1)
    beta = pb.add_variable("beta", xi_dim)
    delta = pb.add_variable("delta", t_dim)
    alpha_arr = []
    for i in range(t_dim):
        for j in range(num_piecewise_lin_f):
            alpha_arr.append(
                pb.add_variable("alpha_" + str(i + 1) + "_" + str(j + 1), 3))
    lambda1_arr = [
        pb.add_variable("lambda1_" + str(i + 1), xi_dim)
        for i in range(num_piecewise_lin_f)
    ]
    lambda2_arr = [
        pb.add_variable("lambda2_" + str(i + 1), xi_dim)
        for i in range(num_piecewise_lin_f)
    ]
    eta1_arr = [
        pb.add_variable("eta1_" + str(i + 1), xi_dim) for i in range(2)
    ]
    eta2_arr = [pb.add_variable("eta2_" + str(i + 1), 10) for i in range(2)]

    # Add constraints.
    for j in range(num_piecewise_lin_f):
        pb.add_constraint((lambda1_arr[j] | (xi_0 + b)) -
                          (lambda2_arr[j] | (xi_0 - b)) + 0.5 *
                          (sum(alpha_arr[j::num_piecewise_lin_f])[2] -
                           sum(alpha_arr[j::num_piecewise_lin_f])[1]) <= kappa)
        pb.add_constraint(0.5 *
                          (sum(alpha_arr[j::num_piecewise_lin_f])[2] +
                           sum(alpha_arr[j::num_piecewise_lin_f])[1]) == delta)
        pb.add_constraint(lambda1_arr[j] - lambda2_arr[j] - sum([
            alpha[0] * g[i, :].T for alpha, i in zip(
                alpha_arr[j::num_piecewise_lin_f], range(t_dim))
        ]) + beta == E_tilde_arr[j].T * x_tilde)
        # positivity of lagrange multipliers
        pb.add_constraint(lambda1_arr[j] >= 0)
        pb.add_constraint(lambda2_arr[j] >= 0)
        # conic dual variables (alpha in L^3)
        for alpha_ij in alpha_arr[j::num_piecewise_lin_f]:
            pb.add_constraint(abs(alpha_ij[0] // alpha_ij[1]) <= alpha_ij[2])

    for k in range(2):
        pb.add_constraint(
            abs(B.T * E_arr[k].T * x_tilde - B.T *
                (eta1_arr[k] - eta2_arr[k])) <= MAX_MAN_HOUR -
            (x_tilde.T * E_arr[k] * xi_0 / r) -
            ((eta1_arr[k] + eta2_arr[k]) | b / r))
        # positivity of lagrange multipliers
        pb.add_constraint(eta1_arr[k] >= 0)
        pb.add_constraint(eta2_arr[k] >= 0)

    pb.add_constraint(E.T * x_tilde >= 0)
    pb.add_constraint(e5 | x_tilde == -1)

    # Set objective.
    pb.set_objective("min",
                     kappa + (beta | mu) + (delta | t) - (c_tilde | x_tilde))

    solution = pb.solve(solver='cvxopt')
    opt_val = -pb.obj_value()
    opt_sol = np.array(
        solution['cvxopt_sol']['x'][:x_dim]).reshape(-1).round(5)
    return opt_sol, opt_val
Beispiel #3
0
def solve_moment_based(params, r, mu, Sigma):
    # Unpack problem parameters
    c, q, xi_0, b, B = unpack_params_picos(params)
    r = pic.new_param('r', r)
    # Unpack artificial parameters
    E, c_tilde, E_tilde_arr, E_arr, e5 = define_art_params(
        c.get_value(), q.get_value(), xi_0)
    E, c_tilde, E_tilde_arr, E_arr, e5 = convert_art_params_picos(
        E, c_tilde, E_tilde_arr, E_arr, e5)
    # Get dimensions.
    x_dim = len(c)
    xi_dim = len(xi_0)
    num_piecewise_lin_f = len(E_tilde_arr)
    # Initialize picos problem.
    pb = pic.Problem()

    # Add variables.
    x_tilde = pb.add_variable("x_tilde", x_dim + 1)
    t = pb.add_variable("t", 1)
    theta_arr = [
        pb.add_variable("theta_" + str(i + 1), 1)
        for i in range(num_piecewise_lin_f)
    ]
    beta = pb.add_variable("beta", xi_dim)
    phi_arr = [
        pb.add_variable("phi_" + str(i + 1), xi_dim)
        for i in range(num_piecewise_lin_f)
    ]
    Lambda = pb.add_variable("Lambda", (xi_dim, xi_dim), vtype='symmetric')
    lambda1_arr = [
        pb.add_variable("lambda1_" + str(i + 1), xi_dim)
        for i in range(num_piecewise_lin_f)
    ]
    lambda2_arr = [
        pb.add_variable("lambda2_" + str(i + 1), xi_dim)
        for i in range(num_piecewise_lin_f)
    ]
    eta1_arr = [
        pb.add_variable("eta1_" + str(i + 1), xi_dim) for i in range(2)
    ]
    eta2_arr = [
        pb.add_variable("eta2_" + str(i + 1), xi_dim) for i in range(2)
    ]

    # Add constraints.
    for i in range(num_piecewise_lin_f):
        pb.add_constraint((lambda1_arr[i] | (xi_0 + b)) -
                          (lambda2_arr[i] | (xi_0 - b)) -
                          (2 * phi_arr[i] | mu) + theta_arr[i] <= t)
        pb.add_constraint(lambda1_arr[i] - lambda2_arr[i] - 2 * phi_arr[i] +
                          beta == E_tilde_arr[i].T * x_tilde)
        pb.add_constraint((Lambda & phi_arr[i]) //
                          (phi_arr[i].T & theta_arr[i]) >> 0)
        # positivity of lagrange multipliers
        pb.add_constraint(lambda1_arr[i] >= 0)
        pb.add_constraint(lambda2_arr[i] >= 0)

    for j in range(2):
        pb.add_constraint(
            abs(B.T * E_arr[j].T * x_tilde - B.T *
                (eta1_arr[j] - eta2_arr[j])) <= MAX_MAN_HOUR -
            (x_tilde.T * E_arr[j] * xi_0 / r) -
            ((eta1_arr[j] + eta2_arr[j]) | b / r))
        # positivity of lagrange multipliers
        pb.add_constraint(eta1_arr[j] >= 0)
        pb.add_constraint(eta2_arr[j] >= 0)

    pb.add_constraint(E.T * x_tilde >= 0)
    pb.add_constraint(e5 | x_tilde == -1)

    # Set objective.
    pb.set_objective("min",
                     t + (beta | mu) + (Lambda | Sigma) - (c_tilde | x_tilde))

    solution = pb.solve(solver='cvxopt')
    opt_val = -pb.obj_value()
    opt_sol = np.array(
        solution['cvxopt_sol']['x'][:x_dim]).reshape(-1).round(5)
    return opt_sol, opt_val
Beispiel #4
0
def solve_SRO(params, Xi, eps_N):
    '''
        Xi is essential as input, since we need the values of the realizations rather
        than some statistics of (e.g. mean, covariance, etc.)
    '''
    Xi_pic = pic.new_param('Xi', Xi)
    eps_N = pic.new_param('eps_N', eps_N)
    N = Xi.shape[0]
    # Unpack problem parameters
    c, q, xi_0, b, B = unpack_params_picos(params)
    # Unpack artificial parameters
    E, c_tilde, E_tilde_arr, E_arr, e5 = define_art_params(
        c.get_value(), q.get_value(), xi_0)
    E, c_tilde, E_tilde_arr, E_arr, e5 = convert_art_params_picos(
        E, c_tilde, E_tilde_arr, E_arr, e5)
    # Get dimensions.
    x_dim = len(c)
    xi_dim = len(xi_0)
    num_piecewise_lin_f = len(E_tilde_arr)
    # Initialize picos problem.
    pb = pic.Problem()

    # Add variables.
    x_tilde = pb.add_variable("x_tilde", x_dim + 1)
    t = pb.add_variable("t", N)

    lambda_arr = []
    lambda1_arr = []
    lambda2_arr = []
    eta_arr = []
    eta1_arr = []
    eta2_arr = []
    for i in range(N):
        for j in range(num_piecewise_lin_f):
            lambda_arr.append(
                pb.add_variable("lambda_" + str(i + 1) + "_" + str(j + 1), 1))
            lambda1_arr.append(
                pb.add_variable("lambda1_" + str(i + 1) + "_" + str(j + 1),
                                xi_dim))
            lambda2_arr.append(
                pb.add_variable("lambda2_" + str(i + 1) + "_" + str(j + 1),
                                xi_dim))
        for k in range(2):
            eta_arr.append(
                pb.add_variable("eta_" + str(i + 1) + "_" + str(k + 1), 1))
            eta1_arr.append(
                pb.add_variable("eta1_" + str(i + 1) + "_" + str(k + 1),
                                xi_dim))
            eta2_arr.append(
                pb.add_variable("eta2_" + str(i + 1) + "_" + str(k + 1),
                                xi_dim))

    # Add constraints.
    for i in range(N):
        Xi_i_hat = Xi_pic[i, :].T
        for j in range(num_piecewise_lin_f):
            pb.add_constraint(
                ((E_tilde_arr[j] * Xi_i_hat) | x_tilde) -
                ((Xi_i_hat - xi_0 - b) | lambda1_arr[
                    (num_piecewise_lin_f * i) + j]) +
                ((Xi_i_hat - xi_0 + b) | lambda2_arr[
                    (num_piecewise_lin_f * i) + j]) +
                (lambda_arr[(num_piecewise_lin_f * i) + j] * eps_N) <= t[i])
            pb.add_constraint(
                abs((E_tilde_arr[j].T * x_tilde) -
                    lambda1_arr[(num_piecewise_lin_f * i) + j] +
                    lambda2_arr[(num_piecewise_lin_f * i) + j]) <= lambda_arr[
                        (num_piecewise_lin_f * i) + j])
            # positivity of lagrange multipliers
            pb.add_constraint(lambda_arr[(num_piecewise_lin_f * i) + j] >= 0)
            pb.add_constraint(lambda1_arr[(num_piecewise_lin_f * i) + j] >= 0)
            pb.add_constraint(lambda2_arr[(num_piecewise_lin_f * i) + j] >= 0)

        for k in range(2):
            pb.add_constraint(((E_arr[k] * Xi_i_hat) | x_tilde) -
                              ((Xi_i_hat - xi_0 - b) | eta1_arr[(2 * i) + k]) +
                              ((Xi_i_hat - xi_0 + b) | eta2_arr[(2 * i) + k]) +
                              (eta_arr[(2 * i) + k] * eps_N) <= MAX_MAN_HOUR)
            pb.add_constraint(
                abs((E_arr[k].T * x_tilde) - eta1_arr[(2 * i) + k] +
                    eta2_arr[(2 * i) + k]) <= eta_arr[(2 * i) + k])
            # positivity of lagrange multipliers
            pb.add_constraint(eta_arr[(2 * i) + k] >= 0)
            pb.add_constraint(eta1_arr[(2 * i) + k] >= 0)
            pb.add_constraint(eta2_arr[(2 * i) + k] >= 0)

    pb.add_constraint(E.T * x_tilde >= 0)
    pb.add_constraint(e5 | x_tilde == -1)

    # Set objective.
    pb.set_objective("min", (1 / N) * (1 | t) - (c_tilde | x_tilde))

    solution = pb.solve(solver='cvxopt')
    opt_val = -pb.obj_value()
    opt_sol = np.array(
        solution['cvxopt_sol']['x'][:x_dim]).reshape(-1).round(5)
    return opt_sol, opt_val