进度计划策略
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)])]).
所以我终于找到了解决办法。
我现在有两个
而不是所有这些中间表示
- 请求列表,其中开始和结束日期表示为整数偏移量(请求(用户,第一天,最后一天,模式))
- 一个组列表,它们代表每天可以在其中工作的用户(group(Day,Limit,[Users])
通过这种方式,我可以在请求获得批准后从群组用户中删除该用户。如果被拒绝就离开他。最后根据限制检查组中是否有足够的用户。
我将尝试使用 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)])]).
所以我终于找到了解决办法。 我现在有两个
而不是所有这些中间表示- 请求列表,其中开始和结束日期表示为整数偏移量(请求(用户,第一天,最后一天,模式))
- 一个组列表,它们代表每天可以在其中工作的用户(group(Day,Limit,[Users])
通过这种方式,我可以在请求获得批准后从群组用户中删除该用户。如果被拒绝就离开他。最后根据限制检查组中是否有足够的用户。