安排计划策略

时间:2015-06-02 19:54:41

标签: prolog scheduling clpfd

我将尝试使用Prolog解决调度问题。 我收到了一些格式为

的人的请求
req_id, user_id, start_date, end_date, state

这些人都在一个或多个小组中

group_id, user_id

并且每个组都由

定义
group_id, loose, strict

其中loose和strict是整数> = 0

每个请求的初始状态未知,可以更改为拒绝或批准。

要解释组中的松散和严格,请考虑以下示例

Group A - Loose 1 - Strict 1
Group B - Loose 1 - Strict 0
Group C - Loose 0 - Strict 1

在任何给定时间给出这些数据我们需要3个人在工作,因为1个人可以解决A和B松散(因为他在这两个群体中)并且A严格需要1个人而C严格需要1个人。

日期范围将限制为5-6周 - 从不开放式搜索。

问题1:如何在任何给定时间代表可用人员,以便不会破坏任何组规则

问题2:如何“强制”prolog搜索最大可能的接受操作,而不是仅仅拒绝所有请求

修改

对于迟到的跟进感到抱歉,我的腿受伤了,没有时间做这件事。

我目前的代码是:

updateGroupStrict(
    [ group(Group,N,Loose) | GroupsRest ],
    [ usergroup(User,Group) | _ ],
    User,
    [ group(Group,M,Loose) | GroupsRest ]
) :- N > 0,
    M is N - 1.

% Reduce strict helper, try next group
updateGroupStrict( [ GroupHead | GroupsRest ], UserGroups, User, [ GroupHead | UpdatedGroups ] ) :- updateGroupStrict(GroupsRest,UserGroups,User,UpdatedGroups).

% Reduce strict helper, try next usergroup
updateGroupStrict(Groups,[ _ | UserGroupTail ],User,UpdatedGroups) :- updateGroupStrict(Groups,UserGroupTail,User,UpdatedGroups).

handle(Groups, _, userrequest( _, [ request(_, accept) | _ ]), Groups).

% to reject a request, the groups should be updated in the following way
% - A strict accept should only update 1 strict group
handle(
    Groups,
    UserGroups,
    userrequest( User, [ request(_, reject) | _ ]),
    UpdatedGroups
) :- updateGroupStrict(Groups, UserGroups, User, UpdatedGroups).

% Success when all requests have been processed - meaning the list is empty, and all groups are 0,0.
planned([],_,[]).

% If a group do not have more unsatisfied then just reduce it
planned( [ group(_,0,0) | GroupsTail ], UserGroups, Requests ) :- planned( GroupsTail, UserGroups, Requests ).

% To reduce the list of requests, handle the head, and continue on the rest
planned( Groups, UserGroups, [ RequestHead | RequestTail] ) :-
    handle( Groups, UserGroups, RequestHead, UpdatedGroups ),
    planned( UpdatedGroups, UserGroups, RequestTail ).

此代码中的假设是只有严格的规则,所有请求都是相同的长度(完全重叠),并且所有用户都发出了请求。

计划([组(group1,1,0)],[用户组(用户1,组1)],[userrequest(用户1,[请求(request1,RequestAction1)]),userrequest(用户2,[请求(请求2,RequestAction2 )])])。

1 个答案:

答案 0 :(得分:2)

所以我终于找到了解决方案。 而不是所有这些中间表示我现在有两个

  1. 请求列表,其中开始日期和结束日期表示为整数偏移量(请求(用户,FirstDay,LastDay,模式))
  2. 每天代表他们可以在当天工作的用户的群组列表(群组(日,限制,[用户])
  3. 这样,我可以在批准请求时从群组用户中删除用户。如果被拒绝,就离开他吧。最后,只需检查组中是否有足够的用户符合限制。