python 通用算法,以优化事件的顺序,同时要求最少的更改次数

dy2hfwbg  于 2023-06-28  发布在  Python
关注(0)|答案(1)|浏览(69)

我正在努力优化与家人和其他需要包括在内的人的婚礼照片的顺序。为了保持混乱和人们争吵到最低限度,我试图优化的顺序,图片拍摄,使有最少的数量的变化所需的。
例如:
最佳:
新娘,新郎,妈妈,爸爸
新娘,新郎,妈妈1,爸爸1,妈妈2,爸爸2
新娘,新郎,妈妈,爸爸
非最佳:
新娘,新郎,妈妈,爸爸
新娘,新郎,妈妈,爸爸
新娘,新郎,妈妈1,爸爸1,妈妈2,爸爸2
非最优顺序要求Mom1和Dad1进入图片,离开,然后重新加入,而第一个他们进入图片,停留,然后不再需要我有一个需要拍摄的64张照片的列表,每张照片中的人数都不同
到目前为止,我的方法是获取组合列表,并将每个组合输入到CSV文件的行中。
(56独特的个体,总共64张照片,所有参与者的数量都不同,
例如:
图片1,新娘,新郎,妈妈1,爸爸1
picture 2新娘,妈妈1,爸爸1
图片3新郎,妈妈1,爸爸1
picture 4新娘,新郎,妈妈,爸爸
等等
然后我做了一个字典,其中的关键字是人,值是他们在图片中出现的次数
除此之外,我想不出如何逻辑地一步一步地完成这件事而不引起争论
我可以答:从最大的图片开始,删除那些不在另一张图片中的,慢慢地工作到最小的群体
或B:从最小的组开始,添加人员,直到达到最具包容性的图片
我无法找出一个通用的方法来处理这一点的方式,我可以编码它

vcirk6k6

vcirk6k61#

这本质上是一种称为“最小集合覆盖问题”的优化问题。

from typing import List, Dict, Set

def min_set_cover(photos: Dict[str, Set[str]]) -> List[str]:
    # Sort photos by the number of people, in descending order
    photos = sorted(photos.items(), key=lambda x: len(x[1]), reverse=True)

    result = []
    photographed = set()

    while photos:
        # Select the group with the maximum intersection with photographed people and minimum new people
        next_photo = max(photos, key=lambda x: (len(x[1] & photographed), -len(x[1])))
        result.append(next_photo[0])
        photographed |= next_photo[1]
        photos.remove(next_photo)

    return result

photos = {
    'photo1': {'Bride', 'Groom', 'Mom1', 'Dad1'},
    'photo2': {'Bride', 'Mom1', 'Dad1'},
    'photo3': {'Groom', 'Mom1', 'Dad1'},
    'photo4': {'Bride', 'Groom', 'Mom2', 'Dad2'}
}

print(min_set_cover(photos))  # Output: ['photo1', 'photo4', 'photo3']

相关问题