我还在学习Python和这里的基本规则,所以如果我犯了错误,请纠正我。没有适当的批评和指导,一个人无法成长。你知道吗
我想帮我妻子安排一个募捐活动的志愿者日程。一天包含7个每小时一次的活动,我有7个每小时一次的时间表,让一个人为7个活动中的4个工作,供志愿者挑选。你知道吗
此代码所做的是根据我现有的志愿者数量,计算我需要满足活动志愿者要求的每个时间表的数量。我目前不知道她将有多少志愿者。你知道吗
import random
# Volunteer Requirements for each of the 7 events
r = [6, 12, 14, 14, 12, 16, 10]
# Available Schedules where 0 = hour off and 1 = hour working
s = []
s.append([0,1,1,1,1,0,0])
s.append([0,0,1,1,1,1,0])
s.append([0,0,0,1,1,1,1])
s.append([1,1,1,1,0,0,0])
s.append([1,1,0,0,0,1,1])
s.append([1,1,1,0,0,0,1])
s.append([1,0,0,0,1,1,1])
number_of_schedules = len(s)
number_of_vols = 21
number_of_hours = len(s[0])
while True:
q = [0]*number_of_schedules
for i in range(number_of_vols):
q[random.randint(0,len(q)-1)] += 1
t = [sum([q[j]*s[j][i] for j in range(number_of_schedules)]) for i in range(number_of_hours)]
if sum([r[i] <= t[i] for i in range(number_of_hours)]) == number_of_hours:
print '\n'.join(map(str,q))
print '\n'.join(map(str,s))
break
当我运行代码时,它打印为:
3
8
2
1
6
2
0
[0, 1, 1, 1, 1, 0, 0]
[0, 0, 1, 1, 1, 1, 0]
[0, 0, 0, 1, 1, 1, 1]
[1, 1, 1, 1, 0, 0, 0]
[1, 1, 0, 0, 0, 1, 1]
[1, 1, 1, 0, 0, 0, 1]
[1, 0, 0, 0, 1, 1, 1]
这告诉我,为了满足要求,我将需要3个人采取第一时间表,8采取第二,2采取第三,以此类推。你知道吗
我要做的是将列表“s”构建为dict,这样我就可以为每个计划指定一个名称,即“计划a”、“计划B”等。这样我就可以调用print函数来打印每个计划所需的次数。你知道吗
当我调用print函数时,首选的最终结果如下所示。你知道吗
Schedule A
Schedule A
Schedule B
Schedule B
Schedule B
Schedule B
Schedule B
........
Schedule G
然后每个志愿者可以把他们的名字放在一个可用的时间表旁边。你知道吗
我遇到的问题是,无论我尝试什么方法,我都无法让它正常工作。我希望在周五之前完成,因为我妻子想在这个周末发一封志愿者请求邮件。任何人能提供的任何帮助/指导都将不胜感激。你知道吗
提前谢谢。你知道吗
如果你需要额外的速度或科学严谨,休·博思韦尔的解决方案是非常好的。它回答了一个没有被问到的问题。如果您对现在的计算方式感到满意,并且只希望能够打印计划名称而不是(或者除了)0和1的序列,那么就简单多了。你知道吗
你不可能用一个数字“乘”整本字典。有很多奇妙的方法来制作一个类似字典的对象,它会以你想要的方式工作,但是我认为这对于你想要完成的事情来说是过分的。你知道吗
它的技术含量很低,可能看起来也不优雅,但最简单的方法是创建另一个只包含计划名称的列表,其顺序与
s
相同。s
中的给定索引将对应于名称列表中的相同索引。(如果不可能按顺序处理它们,可以使用.index()
查找给定值的索引。例如,s.index([0, 0, 0, 1, 1, 1, 1])
将返回2。)出于兴趣,我将其编码为基因搜索:
输出如下
有几个有趣的地方:
只要把需要的志愿者名额加起来,你就至少需要84/4==21名志愿者
运行几次表明,您至少需要22名志愿者才能真正安排好一切,至少需要24名志愿者才能在每个时间段都有空闲时间
你随机发现的解决方案实际上与我得到的完全相同,但是我的算法运行得更快-0.8秒,而平均36秒(在我的测试中从12秒到86秒)。
为了得到你想要的最终结果格式
这就好像
我还做了一些敏感性分析,比如
这给了
也就是说,在100次试验中只发现了3种解决方案,第二种解决方案被发现的频率略高,但这三种解决方案的可能性大致相同。值得注意的是,它们之间的唯一区别是附表a和D==时隙1和5之间的权衡。你知道吗
相关问题 更多 >
编程相关推荐