Пример #1
0
 def rate_meals(self):
     """Handles meal rating procedure"""
     # If only one user is given then query must be altered a bit, otherwise it will throw an error
     query_filter = f"IN {self.users}" if len(
         self.users) > 1 else f"= '{self.users[0]}'"
     # Get data about user AHP preferences
     query_ahp_pref = f"SELECT users.name, ahp_pref_name, value FROM users INNER JOIN user_ahp_pref ON users.id=user_ahp_pref.user_id WHERE users.name {query_filter}"
     result_ahp_pref = pd.read_sql_query(
         query_ahp_pref, self.database).set_index(['name', 'ahp_pref_name'])
     # Get data about user other preferences
     query_pref = f"SELECT users.name, type_name, subtype, value FROM users INNER JOIN user_pref ON users.id=user_pref.user_id WHERE users.name {query_filter}"
     result_pref = pd.read_sql_query(query_pref, self.database).set_index(
         ['name', 'type_name', 'subtype'])
     result_pref = result_pref.sort_index()
     # Calculate meal rating for each user
     self.meals['Rating'] = 0
     user_ratings = []
     for user in self.users:
         user_raw_preferences = result_ahp_pref.loc[
             user, 'typ-kuchnia']['value'], result_ahp_pref.loc[
                 user, 'kuchnia-smak']['value'], result_ahp_pref.loc[
                     user, 'typ-smak']['value']
         user_AHP = AHP(*user_raw_preferences)
         user_preferences = user_AHP.get_preferences(
         )  # [typ, kuchnia, smak]
         # Prepare Data Frame for user rating calculations
         user_meals_rating = self.meals.loc[:, ('name', 'Rating')].copy()
         user_meals_rating['type_rating'] = 0
         user_meals_rating['kitchen_rating'] = 0
         user_meals_rating['taste_rating'] = 0
         # Calculate score for meal taste
         tastes_list = list(result_pref.loc[user, 'smak'].index)
         for taste in tastes_list:
             user_meals_rating['taste_rating'] += self.meals[
                 taste] * result_pref.loc[user, 'smak', taste].value
         # Calculate score for meal type
         types_list = list(result_pref.loc[user, 'typ'].index)
         for type_ in types_list:
             user_meals_rating['type_rating'] += self.meals[
                 type_] * result_pref.loc[user, 'typ', type_].value
         # Calculate score for meal kitchen
         kitchens_list = list(result_pref.loc[user, 'kuchnia'].index)
         for kitchen in kitchens_list:
             user_meals_rating['kitchen_rating'] += self.meals[
                 kitchen] * result_pref.loc[user, 'kuchnia', kitchen].value
         # Sum scores
         for i, rating in zip(range(
                 0, 3), ['type_rating', 'kitchen_rating', 'taste_rating']):
             user_meals_rating['Rating'] += user_meals_rating[
                 rating] * user_preferences[i]
         user_ratings.append(user_meals_rating)
     weight_sum = 0
     for weight, rating in zip(self.weights, user_ratings):
         weight_sum += weight
         self.meals['Rating'] += rating['Rating'] * weight
     self.meals['Rating'] = self.meals['Rating'] / weight_sum
     self.meals_rated = self.meals.loc[:, ('name', 'Rating')].sort_values(
         by='Rating', ascending=False)
     return self.meals_rated
Пример #2
0
def test_computes_correct_priority_matrix_for_charisma(alts, crits, goal):
    decider = AHP(alternatives=alts, criterias=crits, goal=goal)
    # Charisma
    decider.compare_alternatives_wrt_criteria(alternatives=(0, 1),
                                              criteria=2,
                                              multiple=5)
    decider.compare_alternatives_wrt_criteria(alternatives=(0, 2),
                                              criteria=2,
                                              multiple=9)
    decider.compare_alternatives_wrt_criteria(alternatives=(1, 2),
                                              criteria=2,
                                              multiple=4)
    np.testing.assert_array_equal(
        decider.crit_mat[2], [[1, 5, 9], [1 / 5, 1, 4], [1 / 9, 1 / 4, 1]])
Пример #3
0
def test_computes_correct_priority_matrix_for_age(alts, crits, goal):
    decider = AHP(alternatives=alts, criterias=crits, goal=goal)
    # Age
    decider.compare_alternatives_wrt_criteria(alternatives=(0, 1),
                                              criteria=3,
                                              multiple=1 / 3)
    decider.compare_alternatives_wrt_criteria(alternatives=(0, 2),
                                              criteria=3,
                                              multiple=5)
    decider.compare_alternatives_wrt_criteria(alternatives=(1, 2),
                                              criteria=3,
                                              multiple=9)
    np.testing.assert_array_equal(
        decider.crit_mat[3], [[1, 1 / 3, 5], [3, 1, 9], [1 / 5, 1 / 9, 1]])
Пример #4
0
def test_computes_correct_priority_matrix_for_experience(alts, crits, goal):
    decider = AHP(alternatives=alts, criterias=crits, goal=goal)
    # Experience
    decider.compare_alternatives_wrt_criteria(alternatives=(0, 1),
                                              criteria=0,
                                              multiple=1 / 4)
    decider.compare_alternatives_wrt_criteria(alternatives=(0, 2),
                                              criteria=0,
                                              multiple=4)
    decider.compare_alternatives_wrt_criteria(alternatives=(1, 2),
                                              criteria=0,
                                              multiple=9)
    np.testing.assert_array_equal(
        decider.crit_mat[0], [[1, 1 / 4, 4], [4, 1, 9], [1 / 4, 1 / 9, 1]])
Пример #5
0
def test_computes_correct_priority_matrix_for_education(alts, crits, goal):
    decider = AHP(alternatives=alts, criterias=crits, goal=goal)
    # Education
    decider.compare_alternatives_wrt_criteria(alternatives=(0, 1),
                                              criteria=1,
                                              multiple=3)
    decider.compare_alternatives_wrt_criteria(alternatives=(0, 2),
                                              criteria=1,
                                              multiple=1 / 5)
    decider.compare_alternatives_wrt_criteria(alternatives=(1, 2),
                                              criteria=1,
                                              multiple=1 / 7)
    np.testing.assert_array_equal(
        decider.crit_mat[1], [[1, 3, 1 / 5], [1 / 3, 1, 1 / 7], [5, 7, 1]])
Пример #6
0
def ahp():
    """
    前端传过来的参数
    {
        "tableName": firstLayer,
        "l1Matrix": [],
        "l2Matrix": []
    }
    :return:
    """
    log_file = "algorithm.log"
    logging.basicConfig(filename=log_file,
                        format="%(asctime)s [ %(levelname)-6s ] %(message)s",
                        level='INFO')
    try:
        from ahp import AHP
        request_data = request.json
        tableName = request_data["tableName"]


        l1 = request_data.get("l1Matrix")
        l2 = request_data.get("l2Matrix")

        l1_factors, l2_factors = len(l1[0]), len(l2[0])
        if not l1:
            print("read the first layer Matrix fail, please check")
            return
        if l1_factors != len(l2):
            print("the second layer's Matrix Number not equal the first layer Factors")
            return

        l1_Weight = []
        for mat in l1:
            a = AHP(mat)
            w = a.get_Weight()
            l1_Weight.append(w)

        l2_Weight = []
        for mat in l2:
            a = AHP(mat)
            w = a.get_Weight()
            l2_Weight.append(w)
        score = np.dot(np.array(l2_Weight).T, np.array(l1_Weight).T)
        print("ok")
    except NotImplementedError as e:
        raise e
    response_data = {"res": score,
                     "code": "200",
                     "msg": "ok!"}
    return jsonify(response_data)
Пример #7
0
from ahp import AHP

if __name__ == "__main__":
    ASK_QUESTIONS = False

    # Main objective/goal to be achieved
    goal = "Deciding where to eat"

    # The alternatives (final decisions)
    alternatives = ["Pizza Hut", "Domino's"]

    # The criterias to judge the alternatives
    criterias = ["Distance", "Price", "Cuisine"]

    ahp_decider = AHP(alternatives, criterias, goal)

    if ASK_QUESTIONS:
        # Baseline prioritisation walk through (prints out questions in terminal)
        ahp_decider.prioritise()
    else:
        # Add your prioritisations
        ahp_decider.compare_alternatives_wrt_criteria(alternatives=(0, 1),
                                                      criteria=0,
                                                      multiple=5)
        ahp_decider.compare_criterias_wrt_goal(criterias=(1, 2), multiple=5)
        pass

    # Returns the index of alternatives array
    # that is the best result (based on the
    # prior comparisons made)
    result = ahp_decider.decide()
Пример #8
0
def test_computes_correct_priority_matrix_for_goal(alts, crits, goal):
    decider = AHP(alternatives=alts, criterias=crits, goal=goal)
    # Criterias vs goal
    decider.compare_criterias_wrt_goal(criterias=(0, 1), multiple=4)
    decider.compare_criterias_wrt_goal(criterias=(0, 2), multiple=3)
    decider.compare_criterias_wrt_goal(criterias=(0, 3), multiple=7)
    decider.compare_criterias_wrt_goal(criterias=(1, 2), multiple=1 / 3)
    decider.compare_criterias_wrt_goal(criterias=(1, 3), multiple=3)
    decider.compare_criterias_wrt_goal(criterias=(3, 2), multiple=1 / 5)
    np.testing.assert_array_equal(decider.goal_mat,
                                  [[1, 4, 3, 7], [1 / 4, 1, 1 / 3, 3],
                                   [1 / 3, 3, 1, 5], [1 / 7, 1 / 3, 1 / 5, 1]])
Пример #9
0
def test_computes_correct_priority_vecs(alts, crits, goal):
    decider = AHP(alternatives=alts, criterias=crits, goal=goal)
    # Experience
    decider.compare_alternatives_wrt_criteria(alternatives=(0, 1),
                                              criteria=0,
                                              multiple=1 / 4)
    decider.compare_alternatives_wrt_criteria(alternatives=(0, 2),
                                              criteria=0,
                                              multiple=4)
    decider.compare_alternatives_wrt_criteria(alternatives=(1, 2),
                                              criteria=0,
                                              multiple=9)
    # Education
    decider.compare_alternatives_wrt_criteria(alternatives=(0, 1),
                                              criteria=1,
                                              multiple=3)
    decider.compare_alternatives_wrt_criteria(alternatives=(0, 2),
                                              criteria=1,
                                              multiple=1 / 5)
    decider.compare_alternatives_wrt_criteria(alternatives=(1, 2),
                                              criteria=1,
                                              multiple=1 / 7)
    # Charisma
    decider.compare_alternatives_wrt_criteria(alternatives=(0, 1),
                                              criteria=2,
                                              multiple=5)
    decider.compare_alternatives_wrt_criteria(alternatives=(0, 2),
                                              criteria=2,
                                              multiple=9)
    decider.compare_alternatives_wrt_criteria(alternatives=(1, 2),
                                              criteria=2,
                                              multiple=4)
    # Age
    decider.compare_alternatives_wrt_criteria(alternatives=(0, 1),
                                              criteria=3,
                                              multiple=1 / 3)
    decider.compare_alternatives_wrt_criteria(alternatives=(0, 2),
                                              criteria=3,
                                              multiple=5)
    decider.compare_alternatives_wrt_criteria(alternatives=(1, 2),
                                              criteria=3,
                                              multiple=9)
    # Criterias vs goal
    decider.compare_criterias_wrt_goal(criterias=(0, 1), multiple=4)
    decider.compare_criterias_wrt_goal(criterias=(0, 2), multiple=3)
    decider.compare_criterias_wrt_goal(criterias=(0, 3), multiple=7)
    decider.compare_criterias_wrt_goal(criterias=(1, 2), multiple=1 / 3)
    decider.compare_criterias_wrt_goal(criterias=(1, 3), multiple=3)
    decider.compare_criterias_wrt_goal(criterias=(3, 2), multiple=1 / 5)

    assert decider.decide() == 1
Пример #10
0
 def start_ahp(self, data):
     ahp = AHP(data)
     return ahp.start()
Пример #11
0
def decide(
    name: str,
    goal: str,
    alternatives: List[str],
    save: bool = Option(default=False,
                        help="Saves Decision problem graph as pdf file")):
    print("save=", save)
    global dp
    dp = AHP(goal=goal, alternatives=alternatives)
    dp.input_values()
    print("**********************")
    print("result = ", dp.decide())
    print("**********************")
    if save:
        dp.draw()
        dp.draw_result()
        dp.view(filename="graph")
Пример #12
0
from ahp import AHP

example = AHP(method='',
              precision=3,
              alternatives=['Tom', 'Dick', 'Harry'],
              criteria=['Experiência', 'Educação', 'Carisma', 'Idade'],
              sub_criteria={},
              matrix={
                  'Experiência': [[1, 1 / 4, 4], [4, 1, 9], [1 / 4, 1 / 9, 1]],
                  'Educação': [[1, 3, 1 / 5], [1 / 3, 1, 1 / 7], [5, 7, 1]],
                  'Carisma': [[1, 5, 9], [1 / 5, 1, 4], [1 / 9, 1 / 4, 1]],
                  'Idade': [[1, 1 / 3, 5], [3, 1, 9], [1 / 5, 1 / 9, 1]],
                  'criterios': [[1, 4, 3, 7], [1 / 4, 1, 1 / 3, 3],
                                [1 / 3, 3, 1, 5], [1 / 7, 1 / 3, 1 / 5, 1]]
              },
              log=True)

example.local_priorities()