File size: 1,493 Bytes
97b4d0f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import numpy as np
from scipy.optimize import minimize

if __name__ == '__main__':

    # Given subset of m values for x_1, x_2, and x_3
    x1_subset = [2, 3, 4]
    x2_subset = [0, 1]
    x3_subset = [5, 6, 7]

    # Full set of possible values for x_1, x_2, and x_3
    x1_full = [1, 2, 3, 4, 5]
    x2_full = [0, 1, 2, 3, 4, 5]
    x3_full = [3, 5, 7]

    # Define the objective function for quantile-based ranking
    def objective_function(w):
        y_subset = [x1 * w[0] + x2 * w[1] + x3 * w[2] for x1, x2, x3 in zip(x1_subset, x2_subset, x3_subset)]
        y_full_set = [x1 * w[0] + x2 * w[1] + x3 * w[2] for x1 in x1_full for x2 in x2_full for x3 in x3_full]

        # Calculate the 90th percentile of y values for the full set
        y_full_set_90th_percentile = np.percentile(y_full_set, 90)

        # Maximize the difference between the 90th percentile of the subset and the 90th percentile of the full set
        return - min(y_subset) + y_full_set_90th_percentile


    # Bounds for w_1, w_2, and w_3 (-1 to 1)
    bounds = [(-1, 1), (-1, 1), (-1, 1)]

    # Perform bounded optimization to find the values of w_1, w_2, and w_3 that maximize the objective function
    result = minimize(objective_function, np.zeros(3), method='TNC', bounds=bounds)

    # Get the optimal values of w_1, w_2, and w_3
    w_1_opt, w_2_opt, w_3_opt = result.x

    # Print the results
    print("Optimal w_1:", w_1_opt)
    print("Optimal w_2:", w_2_opt)
    print("Optimal w_3:", w_3_opt)