进度计划策略

Schedule planning strategy

我将尝试使用 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 个人,而 A 需要 1 个人C严格。

日期跨度将限制在 5-6 周内 - 从不开放式搜索。

问题 1:如何在任何给定时间代表可用人员,以免违反组规则

问题 2:我如何 "force" 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 ).

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

计划([组(组1,1,0)],[用户组(用户1,组1)],[用户请求(用户1,[请求(请求1,RequestAction1)]),用户请求(用户2,[请求(请求2 ,RequestAction2)])]).

所以我终于找到了解决办法。 我现在有两个

而不是所有这些中间表示
  1. 请求列表,其中开始和结束日期表示为整数偏移量(请求(用户,第一天,最后一天,模式))
  2. 一个组列表,它们代表每天可以在其中工作的用户(group(Day,Limit,[Users])

通过这种方式,我可以在请求获得批准后从群组用户中删除该用户。如果被拒绝就离开他。最后根据限制检查组中是否有足够的用户。