【问题标题】:Formulating and solving a linear programming/assignment problem in python在 python 中制定和解决线性规划/分配问题
【发布时间】:2020-10-29 16:50:46
【问题描述】:

我有一个案例需要将人员分配到组/天。我想以最大化每天人数的方式来做。

限制 - 一个人不能连续参加 2 天(即,A 不能参加第 1 天和第 2 天或第 2 天和第 3 天。但是,他/她可以参加第 1 天和第 3 天)

以下是数据的快照:

Person | Group/Day
A      | 1
A      | 2
A      | 3
B      | 2
B      | 4
B      | 1
C      | 2
D      | 4
D      | 3

我尝试过使用 FIFO 方法,但它并不理想,因为我最终会遇到很少人的日子。

我已经设法在 pandas/python 中使用循环和 groupby 做到了这一点,但它不是很有效,因为它需要太长时间

这是可以使用线性规划解决的吗?我不确定如何将其量化为线性问题。

【问题讨论】:

    标签: python optimization variable-assignment


    【解决方案1】:

    (如果我的问题有误,请告诉我。)

    我们如何才能将每天最多的人分组? 如果一个人每天都可以出现,但不能连续两天出现,那么他们可以出现的天数要么是偶数天,要么是奇数天,比如:

    # person = [list of days]
    PersonA = [1,3,5,7]
    PersonB = [2,4,6,8]
    

    的数学方程式是:
    偶数:f(x) = 2x # 它总是偶数,因为每个数乘以 2 都是偶数 奇数:f(x) = 2x+1 # 它总是奇数,因为任何偶数加 1 都是奇数

    对于每人可能的总天数,您只需将总天数除以 2。

    在 python 中,您可以使用简单的表达式来检查偶数或奇数:

    If (x%2 == 0): print(f'{x} is even'})
    If (x%2 == 1): print(f'{x} is odd'})
    

    但是,如果此人没有抓住每一个机会出现,您可以通过连续两天从列表 L 中获取 A 和 B 并检查 B 是否不等于 A-1 来测试有效天数。像这样:

    array = [a,b,c,d]
    
    # b and c being integers
    if (c+1 == b):
      print('list of days not valid for this person')
    

    【讨论】:

    • 感谢 Gulliver,第一个假设可能有缺陷。天数将事先确定,因此对于 A 人 - 一个解决方案可能是第 1、4、6 天(这将是奇数天和偶数天的混合)
    • @Guiliver 记录在案,您的最后一个答案实际上是正确的。他们有findall,但实际别名是findAll。很抱歉,我没有更加谨慎(尽管我还要指出,我不是反对你的人)。
    • 没关系!我会猜到 findAll 也是一个错字 - 所以无论如何我错了。但是谢谢你的注意!
    猜你喜欢
    • 2020-02-27
    • 1970-01-01
    • 2015-05-31
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多