问题陈述:共有5个项目和15名员工,每列的数字表示每个员工对给定项目的兴趣。每个项目最多可有3名员工。分数为1-5分,1分为最高偏好,5分为最低偏好。我必须在项目中分配员工,以使不满意的人数最少或得分最低。请注意,我的算法创建所有可能的组合,然后按升序对这些组合进行排序,并选择具有不同雇员的前5个组合
但问题是,例如,我的sortedsum矩阵是[1,1,1,4,9,9,…]现在这个算法是正确的,但问题是如果我选择前5个,我的总和将是16。但是有一种可能,如果我把[2,1,1,4,4]作为前四个,那么第五个项目团队的总和会变成3,这样最小值就会改变,这就是我的算法失败的地方
我有一个3nXn矩阵,在这个例子中,我将把它作为一个15x5: 所以矩阵看起来像这样(https://i.stack.imgur.com/omcq7.png):
df = pd.read_csv(io.StringIO("""
employee proj_A proj_B proj_C proj_D proj_E
A1 1 5 3 4 2
B1 5 4 1 2 3
C1 2 3 4 1 5
A2 4 2 1 3 5
B2 4 5 3 2 1
C2 3 1 2 5 4
A3 1 2 4 3 5
B3 2 3 1 5 4
C3 5 3 4 1 2
A4 4 5 3 2 1
B4 5 3 4 2 1
C4 1 2 3 4 5
A5 1 3 2 5 4
B5 2 1 3 5 4
C5 2 1 4 5 4
"""), sep=r"\s+")
[格式化以便于粘贴到shell中]
我想解决的问题是在每一列中选择三个不同的元素,不同的行有不同的含义,以这样的方式,它们对所有5列的总和仍然是最小的
例如,这里,如果我选择A1,B1,C1作为A,然后选择A2,B2,C2作为B等等,那么A的和是1+5+2=8,B的和是2+5+1=8,当加在一起时,也就是8+8+。。。应为所有可能组合的最小和。请注意,如果A1、B1和C1被分配到A,则它们不能切换到B或任何其他下一列
我尝试的是创建所有可能的组合,从A1、B1、C1到A5、B5和C5,计算它们的总和并按递增顺序排序,然后选择具有不同元素的前五个,如下所示:
我的代码的限制: 1.我正在优化的矩阵(一个30x10的矩阵)花费了太多时间,因为组合太多了。 2.它将忽略任何情况,即通过将初始元素的分数降低到稍高一点,我们可以得到可以大幅降低的中间分数
import pandas as pd
data=pd.read_csv("csvfile.csv")
teamsize=3
employes=data["Name"]
PScore=[]
for i in range(10):
PScore.append(data[f"Project {i+1}"])
Scorings_combo=[]
for i in range(len(employes)):
for j in range(len(employes)):
for k in range(len(employes)):
for l in range(10):
if i==j or j==k or k==i:
break
score=0
score=score+PScore[l][i]+PScore[l][j]+PScore[l][k]
Scorings_combo.append([i+1,j+1,k+1,l+1,score])
a=[Scorings_combo[i][4]for i in range(len(Scorings_combo))]
#b=sorted(a,reverse=True)
b=sorted(a)
emps=[]
sig=1
empl=[]
passigned=[]
countee=0
for i in range(len(b)):
for j in range(3):
if Scorings_combo[a.index(b[i])][j] in emps or Scorings_combo[a.index(b[i])][3] in passigned:
a[a.index(b[i])]=-1
sig=0
break
if sig!=0:
print("New")
for k in range(3):emps.append(Scorings_combo[a.index(b[i])][k])
empl.append(Scorings_combo[a.index(b[i])])
passigned.append(Scorings_combo[a.index(b[i])][3])
countee=countee+1
if count==8:
break
sig=1
print(f"Iteration:{i}/{len(b)}")
例如: 3,3,3,4,9 即使有以下可能,也将是解决方案: 4,4,4,4,4 因为它将寻找降序的不同元素,这给了我第一个解决方案
如果你有任何想法,请帮助我。谢谢
这是数据的驱动器链接:https://drive.google.com/file/d/1yaswBEi3RzrhQ743hJTnUeZFZNo-QBBR/view?usp=sharing
下面是一个简单的例子: 矩阵=[[1,2],[2,1],[1,2],[1,2],[2,1],[1,2]] 现在,最小可能的组合是:对于第一列:[1,1,1]和第二列[1,1,2]
这个问题描述了“稳定婚姻问题”的一个变体。它有一个非常简单的算法;我在下面粘贴了最简单的版本-还有其他更严格的版本。未订婚的求婚者向对方求婚,对方拒绝或接受(解除其当前订婚)。这将一直持续到各方都参与进来
对稳定婚姻问题后的项目分配解决方案进行建模,我们可以将
Teammate
一方视为求婚者,另一方视为一夫多妻Project
,可以与多个求婚者订婚。这看起来像是很多代码,但它相对较短且易于理解如果严格遵循上述算法,项目分布可能包含一些队友的第3或第4个选择-这不是一个理想的情况。因此,我发现随机化作业顺序,并在跟踪最佳分布的同时重试几次,会产生最佳结果
每次运行时,可能会产生一个得分相等的项目分布,但队友的安排不同。因此,如果队友出于某种原因决定不喜欢1号或2号选择,只需生成一个新的分布
可运行代码位于:https://pastebin.com/kVj0FuJP
通过将第二个选择随机分配到一些
Teammate
的首选项列表的前面,我们在放置上获得了一个有趣的效果。通过让一些队友开始他们的第二选择,他们很可能会被淘汰出他们的第二选择,然后找到另一个他们评为1的项目。最终的效果是你得到的矩阵大多是1,2的一小部分,没有3和4Project
类中更有趣的方法是consider()
方法,其中Project
考虑了Teammate
的参与提议。这个变化无常的项目将抛弃现有求婚者中任何一个订婚的求婚者,如果另一个求婚者提供更好的报价的话当然,在现代世界中,每个人都在使用婚介服务,
Teammate
和Projects
。。。不过,这项服务有点古怪,在某种程度上依赖于随机尝试,直到找到适合各方的最佳匹配把这一切放在一起
输出:
结果始终是好的,可能有100次迭代,它默认为1K表示好的度量,这只需要眨眼的时间。不知何故,尽管部分基于偶然,它还是成功地制作出了高质量的配对
可以修改该程序以收集得分最低的所有唯一分发,并生成一个列表。每一项都有相同的最低分数,但分布不同:
我想用遗传算法进行实验,这似乎是一个很好的优化类型的问题。有15行可以是任意顺序,一共有15行!排列,或1.0e+12。尝试所有排列的蛮力方法是不实际的
我有下面的函数来计算人口中个体的“适合度”。分数是平均值和标准差的组合。我的数学可能不完全正确,我肯定是用numpy来做的,但它似乎产生了很好的结果
输出-前3行属于A,后3行属于B,依此类推:
在这一组中,似乎每个人都很高兴,这可能是最佳组合
在这里,每个人都非常满意所有的1分,除了A3得到3分
我发现,调整高突变率,保护前5名个体不受突变和死亡的影响,大大提高了结果
父母是通过随机抽取4个人,将他们的健康分数作为权重来选择,以选择更健康的父母。然后,将4个中的前4个中的任何一个与不具有相同适应度分数的其他任何一个进行匹配,以尝试防止近亲繁殖,并将种群多样性保持在一个良好的范围内
每次迭代,一个个体死亡,两个父代被选择并产生一个子代,并且以50%的速率通过随机交换其两行来选择和变异一个个体
我发现最好的群体是150个成员,1k到2k的迭代似乎得到了一致的结果
相关问题 更多 >
编程相关推荐