我遇到了一个复杂的问题,我想知道是否存在现有且易于理解的解决方案模型,例如旅行商问题。
输入:
(Ai,Aj)
对,表示服务员Ai
希望与出席者Aj
见面,Aj
接受该邀请。输出:
A
,他将参加的所有活动的计时码表。主要标准是每位服务员应尽可能多地接待接受邀请的服务员,以满足空间限制。到目前为止,我们考虑使用回溯求解(尝试所有可能的解决方案),并使用线性编程(即定义模型并使用单纯形算法求解)
更新:如果在某些情况下Ai
已满足Aj
,则他们不再需要见面(他们已经见过面)。
答案 0 :(得分:3)
您的问题与区间图中的minimum maximal matching problem一样困难,w.l.o.g假设房间容量为2
,表示他们只能及时处理一次会议。您可以使用Interval graphs对问题进行建模,每个时间间隔(对于每个人)是一个节点。如果A_i和A的边缘也是如此。 A_j有共同的时间,他们也希望看到对方,将边缘的权重设置为他们应该看到的时间量,。如果您在此图表中找到最小的最大匹配,则可以找到针对受限案例的解决方案。但请注意,此图是n-partite,每个部分都是区间图。
P.S:请注意,如果人们应该相互固定的时间是固定的,那么这比加权的更容易。
答案 1 :(得分:2)
如果您可以访问一个好的MIP求解器(cplex / gurobi通过acedamic计划,但硬币OR和LP_solve是开源的,也不错),我肯定会尝试使用Simplex。我把你的问题看作是一个混合整数程序,我觉得它会有相当强烈的放松,所以分支和削减价格对你来说会有很长的路要走。这些解算器现在提供了非常可扩展的解决方案,尤其是商业解决方案。优点是它们也提供了上限,因此您可以了解解决方案的质量,而启发式则不然。
配方:
将z(i,j)(二进制)定义为变量,表示i和j在{1,2,...,N}中的至少一个事件n中一起。 定义z(i,j,n)(二进制)以指示它们在事件n中一起。 定义z(i,n)表示我正在参加n。 Z(i,j)和z(i,j,m)仅在i和j应该相遇时才存在。
对于每个t,M ^ t是同时保持的时间事件的子集。 因此,如果事件1从9到11,则事件2从10到12,事件3从11到13,然后 M ^ 1 = {事件1,事件2)并且M ^ 2 = {事件2,事件3}。即没有人可以参加1和2,或2和3,但1和3都可以。
Max sum Z(i,j)
z(i,j)<= sum_m z(i,j,m)
(every i,j)(i and j can meet if they are in the same location m at least once)
z(i,j,m)<= z(i,m) (for every i,j,m)
(if i and j attend m, then i attends m)
z(i,j,m)<= z(j,m) (for every i,j,m)
(if i and j attend m, then j attends m)
sum_i z(i,m) <= C(m) (for every m)
(only C(m) persons can visit event m)
sum_(m in M^t) z(i,m) <= 1 (for every t and i)
(if m and m' are both overlapping time t, then no person can visit them both. )
答案 2 :(得分:1)
正如@SaeedAmiri所指出的,这看起来像一个复杂的问题。
我的猜测是,一旦助手数量增加(可能是数十个),您正在考虑的回溯和线性编程选项会爆炸助理)。
如果最优性不是必需的话,也许你应该考虑(meta)启发式方法,或者建立初始模型并看看它如何扩展的约束编程。
为了给您一个更精确的答案,您为什么需要解决这个问题?参与者的典型数量是多少?房间数量?