Essayez de résoudre le diagramme homme-machine avec Python

Une tentative de résoudre un problème de graphique MM courant avec python au lieu de manuellement.

Thème "Indiquer le temps de cycle minimum et l'attribution des processus aux travailleurs dans le processus circulaire" image.png

--Le nombre d'étapes et le temps requis pour chaque étape sont indiqués dans une liste.
Cette fois, il y a 8 processus, et le temps requis pour chaque processus est [6, 3, 3, 10, 6, 8, 4, 5]. ――Le temps nécessaire pour déplacer un ouvrier est de 1, sautez l'un à côté de l'autre 2, 2, sinon 3

condition


process_time_lst = [6, 3, 3, 10, 6, 8, 4, 5]
move_cost_lst = [1, 2, 3]
num_of_workers = 3

Ce que je veux savoir, c'est: "De quel processus les ours, les lapins et les porcs devraient-ils se charger?" image.png

Commencez par créer un dictionnaire des noms de processus et de leur travail.

image


# Input:
[6, 3, 3, 10, 6, 8, 4, 5]
# Output:
{'process0':6, 'process1':3, ... , 'process7':5}

code


def generate_process_lst(process_time_lst):
    lst = ['process'+str(val) for val in range(len(process_time_lst))]
    return lst

process_lst = generate_process_lst(process_time_lst)
process_time_dict = {process:cost for process, cost in zip(process_lst, process_time_lst)}

Ensuite, nous effectuerons un prétraitement pour le calcul. Insérez move, ce qui signifie passer au processus suivant, entre tous les processus.

image


# Input
['process0', 'process1', ... , 'process7']
# Output
['process0', 'move', 'process1', 'move', ... , 'move', 'process7']

code


def generate_process_and_move_lst(process_lst):
    len_lst = len(process_lst) - 1
    process_and_move_lst = process_lst.copy()
    for i in range(len_lst):
        process_and_move_lst.insert(len_lst - i, 'move')
    return process_and_move_lst

process_and_move_lst = generate_process_and_move_lst(process_lst)

Ensuite, créez une liste d'index où la liste process_and_move_lst est séparée.

image


# Input
['process0', 'move', 'process1', 'move', ... , 'move', 'process7']
# Output
[(0, 1, 2), (0, 1, 3), ... , (11, 13, 14), (12, 13, 14)]

code


import itertools

def generate_combi_lst(process_and_move_lst, num_of_workers):
    len_lst = len(process_and_move_lst)
    idx_lst = [x for x in range(len_lst)]
    combi_lst = list(itertools.combinations(idx_lst, num_of_workers))
    return combi_lst

combi_lst = generate_combi_lst(process_and_move_lst, num_of_workers)

Utilisez la liste d'index découpée pour générer une combinaison de listes de processus à affecter à chaque travailleur.

image


# Input
['process0', 'move', 'process1', 'move', ... , 'move', 'process7']
[(0, 1, 2), (0, 1, 3), ... , (11, 13, 14), (12, 13, 14)]
# Output(image)* Il fait partie de la liste de sortie réelle car il est difficile de comprendre ce que vous faites.
worker0 : ['move', 'process1', 'move']
worker1 : ['process2', 'move', 'process3', 'move', 'process4', 'move', 'process5', 'move', 'process6', 'move']
worker2 : ['process7', 'move', 'process0']

code


def generate_process_group_lst(process_and_move_lst, combi_lst):
    process_group_lst = []
    for combi in combi_lst:
        if combi[0] != 0:
            tmplst = [process_and_move_lst[0:combi[0]]]
        else:
            tmplst = []
        for idx, val in enumerate(combi):
            start = val
            if idx == len(combi) - 1:
                end = len(process_and_move_lst)
            else:
                end = combi[idx + 1]
            tmplst.append(process_and_move_lst[start:end])
        
        if combi[0] != 0:
            tmplst[-1].append('move')
            tmplst[-1] = tmplst[-1] + tmplst[0]
            tmplst = tmplst[1:]
        process_group_lst.append(tmplst)
    return process_group_lst

process_group_lst = generate_process_group_lst(process_and_move_lst, combi_lst)

Nous calculerons le nombre d'étapes requis pour chaque travailleur.

image


# Input(image)* Il est difficile de comprendre ce que vous faites(Abréviation
worker0 : ['move', 'process1', 'move']
worker1 : ['process2', 'move', 'process3', 'move', 'process4', 'move', 'process5', 'move', 'process6', 'move']
worker2 : ['process7', 'move', 'process0']

# Output(image)
[7, 39, 13] # move:1, process1:3, move:1, return_cost:2 → total 7

code


def calc_return_cost(process_set, process_time_dict, move_cost_lst):
    tmplst = [val for val in process_set if val in process_time_dict.keys()]
    if len(tmplst) == 0:
        return_cost = move_cost_lst[0]
    elif len(tmplst) == 1:
        if len(process_set) == 2:
            return_cost = move_cost_lst[0]
        else:
            return_cost = move_cost_lst[1]
    else:
        start_num = int(tmplst[0][-1])
        end_num = int(tmplst[-1][-1])
        if process_set[0] == 'move':
            start_num -= 1
        if process_set[-1] == 'move':
            end_num += 1
        tmp = abs(start_num - end_num)
        distance = min( tmp,  (len(process_time_dict.keys()) - tmp) )
        if distance == 1:
            return_cost = move_cost_lst[0]
        elif distance == 2:
            return_cost = move_cost_lst[1]
        else:
            return_cost = move_cost_lst[2]
    return return_cost

def calc_cycleTime(process_group_lst, process_time_dict, move_cost_lst):
    ct_lst = []
    for process_group in process_group_lst:
        ct_tmp_lst = []
        for process_set in process_group:
            ct = 0
            ct += process_set.count('move') * move_cost_lst[0]
            ct += sum([process_time_dict[val] for val in process_set if val in process_time_dict.keys()])
            ct += calc_return_cost(process_set, process_time_dict, move_cost_lst)
            ct_tmp_lst.append(ct)
        ct_lst.append(ct_tmp_lst)
    return ct_lst

ct_lst = calc_cycleTime(process_group_lst, process_time_dict, move_cost_lst)

Calculez le temps de cycle pour chaque combinaison d'allocation de processus pour chaque travailleur.

image


# Input
[[8, 2, 47], [8, 5, 44], ... ,[6, 2, 49], [6, 2, 49]]
# Output
[47, 44, ..., 49, 49]

code


max_ct_lst = [max(lst) for lst in ct_lst]

Calculez quelle combinaison a le temps de cycle le plus court Obtenez l'index où la combinaison existe.

image


# Input
[47, 44, ..., 49, 49]
# Output
[58, 211]

code


min_ct = min(max_ct_lst)
min_ct_idx_lst = [idx for idx, val in enumerate(max_ct_lst) if val == min_ct]

Enfin, l'affichage du temps de cycle minimum et L'affectation du processus aux travailleurs qui y parviennent s'affiche.

image


# Output
minimumCT:21s
condition:
Worker0:['process0', 'move', 'process1', 'move', 'process2', 'move'], time=18s
Worker1:['process3', 'move', 'process4', 'move'], time=20s
Worker2:['process5', 'move', 'process6', 'move', 'process7'], time=21s
condition:
Worker0:['process1', 'move', 'process2', 'move', 'process3'], time=20s
Worker1:['move', 'process4', 'move', 'process5', 'move'], time=20s
Worker2:['process6', 'move', 'process7', 'move', 'process0', 'move'], time=21s

code


print(f'minimumCT:{min_ct}s')
for idx in min_ct_idx_lst:
    print('condition:')
    for worker, process in enumerate(process_group_lst[idx]):
        print(f'Worker{worker}:{process}, time={ct_lst[idx][worker]}s')

Lorsque tous les codes sont connectés, cela devient comme suit.

code


import itertools

def generate_process_lst(process_time_lst):
    lst = ['process'+str(val) for val in range(len(process_time_lst))]
    return lst

def generate_process_and_move_lst(process_lst):
    len_lst = len(process_lst) - 1
    process_and_move_lst = process_lst.copy()
    for i in range(len_lst):
        process_and_move_lst.insert(len_lst - i, 'move')
    return process_and_move_lst

def generate_combi_lst(process_and_move_lst, num_of_workers):
    len_lst = len(process_and_move_lst)
    idx_lst = [x for x in range(len_lst)]
    combi_lst = list(itertools.combinations(idx_lst, num_of_workers))
    return combi_lst

def generate_process_group_lst(process_and_move_lst, combi_lst):
    process_group_lst = []
    for combi in combi_lst:
        if combi[0] != 0:
            tmplst = [process_and_move_lst[0:combi[0]]]
        else:
            tmplst = []
        for idx, val in enumerate(combi):
            start = val
            if idx == len(combi) - 1:
                end = len(process_and_move_lst)
            else:
                end = combi[idx + 1]
            tmplst.append(process_and_move_lst[start:end])
        
        if combi[0] != 0:
            tmplst[-1].append('move')
            tmplst[-1] = tmplst[-1] + tmplst[0]
            tmplst = tmplst[1:]
        process_group_lst.append(tmplst)
    return process_group_lst

def calc_return_cost(process_set, process_time_dict, move_cost_lst):
    tmplst = [val for val in process_set if val in process_time_dict.keys()]
    if len(tmplst) == 0:
        return_cost = move_cost_lst[0]
    elif len(tmplst) == 1:
        if len(process_set) == 2:
            return_cost = move_cost_lst[0]
        else:
            return_cost = move_cost_lst[1]
    else:
        start_num = int(tmplst[0][-1])
        end_num = int(tmplst[-1][-1])
        if process_set[0] == 'move':
            start_num -= 1
        if process_set[-1] == 'move':
            end_num += 1
        tmp = abs(start_num - end_num)
        distance = min( tmp,  (len(process_time_dict.keys()) - tmp) )
        if distance == 1:
            return_cost = move_cost_lst[0]
        elif distance == 2:
            return_cost = move_cost_lst[1]
        else:
            return_cost = move_cost_lst[2]
    return return_cost

def calc_cycleTime(process_group_lst, process_time_dict, move_cost_lst):
    ct_lst = []
    for process_group in process_group_lst:
        ct_tmp_lst = []
        for process_set in process_group:
            ct = 0
            ct += process_set.count('move') * move_cost_lst[0]
            ct += sum([process_time_dict[val] for val in process_set if val in process_time_dict.keys()])
            ct += calc_return_cost(process_set, process_time_dict, move_cost_lst)
            ct_tmp_lst.append(ct)
        ct_lst.append(ct_tmp_lst)
    return ct_lst

process_time_lst = [6, 3, 3, 10, 6, 8, 4, 5]
move_cost_lst = [1, 2, 3]
num_of_workers = 3

process_lst = generate_process_lst(process_time_lst)
process_time_dict = {process:cost for process, cost in zip(process_lst, process_time_lst)}
process_and_move_lst = generate_process_and_move_lst(process_lst)
combi_lst = generate_combi_lst(process_and_move_lst, num_of_workers)
process_group_lst = generate_process_group_lst(process_and_move_lst, combi_lst)
ct_lst = calc_cycleTime(process_group_lst, process_time_dict, move_cost_lst)
max_ct_lst = [max(lst) for lst in ct_lst]
min_ct = min(max_ct_lst)
min_ct_idx_lst = [idx for idx, val in enumerate(max_ct_lst) if val == min_ct]

print(f'minimumCT:{min_ct}s')
for idx in min_ct_idx_lst:
    print('condition:')
    for worker, process in enumerate(process_group_lst[idx]):
        print(f'Worker{worker}:{process}, time={ct_lst[idx][worker]}s')

Comme mentionné ci-dessus, j'ai essayé de résoudre le graphique homme-machine en utilisant python.

Recommended Posts

Essayez de résoudre le diagramme homme-machine avec Python
Essayez de résoudre le livre des défis de programmation avec python3
Essayez de résoudre le problème d'affectation du médecin de formation avec Python
Essayez de résoudre l'itinéraire le plus court avec les données sociales Python + NetworkX +
Essayez de résoudre le problème du fizzbuzz avec Keras
Essayez de résoudre le problème de l'héritage de classe Python
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de résoudre le problème avec Python Vol.1
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (code Python)
Essayez d'exploiter Facebook avec Python
Je voulais résoudre le concours de programmation Panasonic 2020 avec Python
Essayez d'automatiser le fonctionnement des périphériques réseau avec Python
Essayez de déchiffrer les caractères déformés dans le nom du fichier joint avec Python
Essayez de reproduire un film couleur avec Python
Essayez de vous connecter à qiita avec Python
Je voulais résoudre ABC160 avec Python
Python amateur tente de résumer la liste ①
Je voulais résoudre ABC172 avec Python
La route de la compilation vers Python 3 avec Thrift
Essayez de résoudre le problème N Queen avec SA de PyQUBO
Je voulais résoudre le problème ABC164 A ~ D avec Python
Mettez Cabocha 0.68 dans Windows et essayez d'analyser la dépendance avec Python
Résolvez AtCoder 167 avec python
Je voulais résoudre NOMURA Contest 2020 avec Python
Le 16ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Essayez de dessiner une courbe de vie avec python
Spécifiez le fichier exécutable Python à utiliser avec virtualenv
Essayez d'imaginer les données d'élévation du National Land Research Institute avec Python
Comment essayer l'algorithme des amis d'amis avec pyfof
Dites bonjour au monde avec Python avec IntelliJ
Essayez de créer un code de "décryptage" en Python
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (théorie)
Résoudre des maths avec Python
Essayez de générer automatiquement des documents Python avec Sphinx
Le moyen le plus simple d'utiliser OpenCV avec python
Introduction à Python avec Atom (en route)
Je veux résoudre APG4b avec Python (chapitre 2)
Essayez de créer un groupe de dièdre avec Python
Le 19ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Essayez de résoudre un problème défini de mathématiques au lycée avec Python
Résolvez POJ 2386 avec python
Essayez de détecter les poissons avec python + OpenCV2.4 (inachevé)
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (résultat de l'exécution)
Essayez d'utiliser le processeur à 4 cœurs du Raspberry Pi 2 avec Parallel Python
[Python] Essayez de lire la bonne réponse au problème FizzBuzz
[Introduction à Python] Comment itérer avec la fonction range?
Essayez de traduire avec Python tout en conservant la mise en page PDF
Essayez de résoudre les problèmes / problèmes du "programmeur matriciel" (Chapitre 1)
Visualisons la pièce avec tarte aux râpes, partie 1
J'ai essayé de toucher un fichier CSV avec Python
[Python] Comment spécifier l'emplacement de téléchargement avec youtube-dl
Essayez le fonctionnement de la base de données avec Python et visualisez avec d3
Convertissez l'image au format .zip en PDF avec Python
Je veux hériter de l'arrière avec la classe de données python
Essayez d'obtenir le contenu de Word avec Golang
[Neo4J] ④ Essayez de gérer la structure du graphe avec Cypher