排队算法优化

排队算法优化

一、起因

按照订单简单的FIFO排队,做完一桌菜再做下一桌菜,这样会导致大量的等待时间,可会体验会不太好,因此提出以下算法模型。

二、若干模型以及算法细节

假定我们已经清楚各个菜品制作所需要的时间;

考虑AB两桌订单时间存在重叠,B桌的菜品必须等待前一桌A桌的菜品全上完全了再开始做。考虑A桌订单提交时间为Ta0,所需时间为taB桌订单提交时间为Tb0,所需时间为tb,则这样决策B所需等待的总时间为Tw = ta-(Tb0-Ta0);

排队算法优化_第1张图片

而若考虑当A桌订单B桌订单都已提交时,两个订单上未做的菜品被做的概率均等,则A桌所需时间为2*ta-Tb0+Ta0 > taB桌所需时间为tb+ta-Tb0+Ta0 > tb,然而等待时间却大大缩短,E(Tw) = 2tb/Nb,其中NbB桌订单菜品的数量。


然而,我们在缩短等待的同时,必须保证A桌就餐的不间断性,尽量不要出现桌上的菜吃完了,还有菜没有上的情况。设吃完一个菜是做一个菜时间的k倍,因此需要维护这样一个待做菜品队列。这个队列中,选中各个已经做过菜的桌的概率,必须大于1/k,因此若NANB分别为已经开始上菜了的AB两桌还未上的菜的个数,NC为已经提交订单的等位桌,则需保证条件Pmin(NA,NB)/(NA+NB+NC)>1/k;并尽量扩充队列。

因此,算法伪代码如下:

 

时间t循环 {

  若发现灶台空闲(菜品制作完成或初始) {

        在待制作的链表中均匀随机的选择一个菜品制作;

        从待制作的链表中删除该菜品;

    }

    若某订单已全部制作完成,则宣告该订单完成;

    若收到某订单,则把其所有菜品从尾部导入未制作菜品链表中;

 尝试向待制作菜品尾部添加未制作菜品链表头部的菜品,直到不满足条件P

}

你可能感兴趣的:(作业)