コード例 #1
0
ファイル: main.py プロジェクト: Eegann/MADMC
def procedure1_nd_tree(n, p, k, w):

    print("procedure1_ND_tree  n={} p={}".format(n, p))
    data = file_parsing.get_data(n, p)

    # print("Recherche locale:\n\n")
    time1 = time.time()

    [allx, ally] = nd_tree.nd_tree(n, k, p, data)
    time2 = time.time()
    ally_for_file = copy.deepcopy(ally)

    # print("Données utilisées: ", data)
    # print("Vecteurs d'affectation solutions: ", allx)
    # print("Valeurs des évaluations: ", ally)

    # print("\n\nElicitation incrémentale:\nNombre de solutions potentielles:", len(ally), "\n\n")
    time3 = time.time()

    [opt, opt_value, nb_q, _,
     _] = incremental_elicitation.mmr_incremental_elicitaiton(
         allx, ally, w, [])

    time4 = time.time()
    # print("Solution optimale: ", opt)
    # print("Valeur de la solution: ", opt_value)
    # print("Poids du décideur: ", w)
    # print("Nombre de questions: ", nb_q)

    real_opt = compare_to_file(n, p, k)

    file_parsing.write_res_proc1_nd_tree(opt_value, real_opt, n, p, w, nb_q,
                                         time2 - time1, time4 - time3)
コード例 #2
0
    def create_starting_solution():
        ###############
        ### fonction locale
        ##############
        def find_best_objets(w):
            # calculer le score d'un objet selon w
            compute_score = lambda i: sum(
                [data[i][j] * w[j] for j in range(len(w))])
            # ordonner les objets selon leurs scores
            index = list(range(len(data)))
            index_ordered = sorted(index, key=compute_score)
            # ordre croissant
            index_ordered = reversed(index_ordered)
            # decroissant
            index_ordered = list(index_ordered)  # convertir a une liste
            x = [
                1 if i in index_ordered[:k] else 0
                for i in list(range(len(data)))
            ]
            # on prend les k meilleurs objets
            return x  # une solution

        ############
        ### main
        ############

        evidence = []
        # parametre
        m = 2 * n

        # Etape 1: on cree un ensemble de vecteur de poids aléatoire simulant les préférences du décideur
        ws = []
        for i in range(m):
            # on crée un vecteur de poids aléatoire simulant les préférences du décideur
            w = [random.uniform(0, 1) for i in range(p)]
            # on le normalise pour que la somme du vecteur fasse 1
            w = [w[i] / sum(w) for i in range(p)]
            # on ajoute w dans ws
            ws.append(w)
        # Etape 2: pour chaque w trouver une solution optimale
        xs = [find_best_objets(w) for w in ws]
        # pour chaque w trouver une solution optimale

        # Etape 3: find le most promising solution within xs
        allx = xs
        ally = [compute_evaluation(x) for x in xs]
        compute_dominance(allx, ally)
        x, eval_x, nb_q, evidence, mr = incremental_elicitation.mmr_incremental_elicitaiton(
            allx, ally, w, evidence)

        return x, eval_x, evidence
コード例 #3
0
ファイル: main.py プロジェクト: Qdake/Multi-criteria_Decision
def procedure1_PLS(n, p, k, w, start_time):
    print("procedure1_PLS  n={} p={}".format(n, p))
    data = file_parsing.get_data(n, p)  # n: nb de objets; p: nb de criteres

    # print("Recherche locale:\n\n")
    time1 = time.time()

    [allx, ally] = local_search.neighbor_local_search(n, k, p, data)
    time2 = time.time()
    ally_for_file = copy.deepcopy(ally)

    #print("Données utilisées: ", data)
    #print("Vecteurs d'affectation solutions: ", allx)
    #print("Valeurs des évaluations: ", ally)

    # print("\n\nElicitation incrémentale:\nNombre de solutions potentielles:", len(ally), "\n\n")
    time3 = time.time()

    evidence = []
    [opt, opty, opt_value, nb_q, _,
     _] = incremental_elicitation.mmr_incremental_elicitaiton(
         allx, ally, w, evidence)

    time4 = time.time()
    # print("Solution optimale: ", opt)
    # print("Valeur de la solution: ", opt_value)
    # print("Poids du décideur: ", w)
    # print("Nombre de questions: ", nb_q)

    real_opt = compare_to_file(n, p, k)
    real_opt = sum(w[i] * real_opt[i] for i in range(len(w)))
    file_parsing.write_res_proc1_PLS(opt_value, real_opt, n, p, w, nb_q,
                                     time2 - time1, time4 - time3)

    print("END procedure1_PLS  n={} p={} time={}".format(n, p, time.time()))
    return
コード例 #4
0
def interactive_local_search(n, k, p, data, w):
    ################
    ### fonctions locales
    ###############
    def compute_evaluation(x):
        y = [0] * p
        j = 0

        # on fait ici une somme pour faire l'evaluation
        while j < p:
            i = 0
            while i < n:
                y[j] += x[i] * data[i][j]
                i += 1
            j += 1
        return y

    def create_starting_solution():
        ###############
        ### fonction locale
        ##############
        def find_best_objets(w):
            # calculer le score d'un objet selon w
            compute_score = lambda i: sum(
                [data[i][j] * w[j] for j in range(len(w))])
            # ordonner les objets selon leurs scores
            index = list(range(len(data)))
            index_ordered = sorted(index, key=compute_score)
            # ordre croissant
            index_ordered = reversed(index_ordered)
            # decroissant
            index_ordered = list(index_ordered)  # convertir a une liste
            x = [
                1 if i in index_ordered[:k] else 0
                for i in list(range(len(data)))
            ]
            # on prend les k meilleurs objets
            return x  # une solution

        ############
        ### main
        ############

        evidence = []
        # parametre
        m = 2 * n

        # Etape 1: on cree un ensemble de vecteur de poids aléatoire simulant les préférences du décideur
        ws = []
        for i in range(m):
            # on crée un vecteur de poids aléatoire simulant les préférences du décideur
            w = [random.uniform(0, 1) for i in range(p)]
            # on le normalise pour que la somme du vecteur fasse 1
            w = [w[i] / sum(w) for i in range(p)]
            # on ajoute w dans ws
            ws.append(w)
        # Etape 2: pour chaque w trouver une solution optimale
        xs = [find_best_objets(w) for w in ws]
        # pour chaque w trouver une solution optimale

        # Etape 3: find le most promising solution within xs
        allx = xs
        ally = [compute_evaluation(x) for x in xs]
        compute_dominance(allx, ally)
        x, eval_x, nb_q, evidence, mr = incremental_elicitation.mmr_incremental_elicitaiton(
            allx, ally, w, evidence)

        return x, eval_x, evidence

    def compute_dominance(allx, ally):
        toremovex = []
        toremovey = []
        # on calcule les dominance pour chaque paire de solution i et j
        i = 0
        while i < len(allx):
            j = i + 1
            while j < len(ally):
                k = 0
                domi = 0
                domj = 0
                # on calcul le nombre de fois où j domine i, et le nombre de fois où i domine j
                while k < p:
                    if ally[i][k] < ally[j][k]:
                        domj += 1
                    if ally[i][k] > ally[j][k]:
                        domi += 1
                    k += 1
                # si une des solutions ne domine jamais l'autre strictement, elle est donc dominée faiblement
                # on l'ajoute à la liste des solutions à retirer
                # attention au cas où les évaluations sont égales!
                if domi == 0 and domj > 0 and allx[i] not in toremovex:
                    toremovex.append(allx[i])
                    toremovey.append(ally[i])
                    # print("i",i,j)
                if domj == 0 and domi > 0 and allx[j] not in toremovex:
                    toremovex.append(allx[j])
                    toremovey.append(ally[j])
                    # print("j",i,j)
                j += 1
            i += 1
        # on retire les elements dominés des listes allx et ally
        for x in toremovex:
            allx.remove(x)
        for y in toremovey:
            ally.remove(y)

    def compute_dominance2(allx, ally, newx, newy):
        toremove = []
        addnew = True
        for i in range(len(ally)):
            dom1 = 0
            dom2 = 0
            # on calcul le nombre de fois où j domine i, et le nombre de fois où i domine j
            for k in range(p):
                if ally[i][k] < newy[k]:
                    dom2 += 1
                if ally[i][k] > newy[k]:
                    dom1 += 1
            if dom1 == 0 and dom2 > 0:
                toremove.append(i)
            if dom2 == 0 and dom1 > 0:
                addnew = False
        for i in reversed(toremove):
            allx.pop(i)
            ally.pop(i)
        if addnew:
            allx.append(newx)
            ally.append(newy)

    def neighbors(x, allx, ally):
        # on récupère les voisins de la manière suivante:
        # si la ième composante vaut 1 et la jème vaut 0
        # on fait une copie du vecteur et on met i à 0 et j à 1
        # on répète le procédé pour toutes les combinaisons de i et j possible
        i = 0
        while i < n:
            if x[i] == 1:
                j = 0
                while j < n:
                    if (x[j] == 0 and i != j):
                        x1 = copy.deepcopy(x)
                        x1[i] = 0
                        x1[j] = 1
                        # on n'ajoute pas de solution déjà existante dans notre ensemble
                        if (x1 not in allx):
                            y1 = compute_evaluation(x1)
                            #allx.append(x1)
                            #ally.append(y1)
                            compute_dominance2(allx, ally, x1, y1)
                    j += 1
            i += 1

    #######################
    ### MAIN : combinaison de LS et Incremental_elicitation
    #######################

    ######################
    ### Find a promising starting solution
    ######################
    # création d'un vecteur aléatoire et calcule de son évaluation
    x, eval_x, evidence = create_starting_solution()
    y = compute_evaluation(x)

    #######################
    ### Local improvement
    ######################
    improve = True
    nb_q = 0
    while improve:
        # création de listes pour stocker nos solutions et leur évaluation
        allx = []
        allx.append(x)
        ally = []
        ally.append(y)

        # recherche du voisinage de x
        neighbors(x, allx, ally)

        # on supprime les solutions dominées
        compute_dominance(allx, ally)

        newx, eval_newx, new_nb_q, evidence, mr_x = incremental_elicitation.mmr_incremental_elicitaiton(
            allx, ally, w, evidence)
        nb_q += new_nb_q
        if mr_x > 0:
            x = newx
            y = eval_newx
        else:
            improve = False

    return x, y, nb_q