如何重新排列行(基于一个条件),然后将它们分组到5个元素的有限列表中,目标是最小的组数?

2024-06-06 06:54:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在处理一个关于生产过程优化的项目,我遇到了一个问题,那就是

我有4种产品(A,B,C和D)在3种不同的颜色(绿色,蓝色,黄色),并得到订单与交货日期时,客户需要它直到。例如,请查看下表以获得更好的概述:

Product     Needs it till Date    Colour
   A            01.03.2018         Green
   A            15.03.2018         Blue
   B            12.03.2018         Yellow
   C            17.03.2018         Blue
   B            15.03.2018         Blue
   A            18.03.2018         Green
   D            07.03.2018         Yellow
   B            21.03.2018         Green
   C            23.03.2018        Yellow
   D            03.03.2018         Blue
   C            05.03.2018         Yellow
   B            17.03.2018         Blue
  ...              ...             ...

我每天最多能生产3种产品,一次只能生产a、B或D中的一种和C中的两种。例如,在给定的一天,我可以生产(a,B,C)或(a,C,D)或(C,C,D)等,但不能生产(a,a,C)或(B,D,D)等

首先,我根据交货日期对列进行排序,以便在客户需要时及时生产产品

然后,我需要对行重新排序,以便在连续的长期运行中使颜色变化最少

接下来有趣的部分,我想创建生产计划。为此,我需要创建最多3行的组。然而,我们的目标是以一种方式对它们进行分类和分组,即我们在持续的长期时间内对颜色变化的量最少(当然要记住客户需要的日期)

例如

坏:(黄,绿,蓝),(绿,黄,黄),(蓝,绿,绿)等。 最佳:(绿色,绿色,蓝色),(蓝色,蓝色,黄色),(黄色,黄色,蓝色)等

我从基础开始——我找到了一个可以帮助我的图书馆,那就是熊猫。我先按日期,然后按颜色对值进行排序

import pandas as pd
df = pd.read_excel('unsorted_orders.xlsx')
df = df.sort_values(['date', 'colour'])

我设法找出了如何将它们分成3行:

grouped = df
maxproduction = 3
grouped = [grouped[n:n+maxproduction] for n in range(0, len(grouped), maxproduction)]
print(grouped)

但我对其他任务完全迷茫了,即:

  • 在给定的一天只生产A、B、D一次,并允许C在生产日生产两次(如有必要)

  • 把他们分成最少的颜色变化在连续的长期运行,同时记住日期

我研究了纸浆,但我认为它可能不是最佳的图书馆。有人能给我指个方向吗


Tags: df客户图书馆排序产品颜色greenblue