我将尝试使用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 )])])。
答案 0 :(得分:2)
所以我终于找到了解决方案。 而不是所有这些中间表示我现在有两个
这样,我可以在批准请求时从群组用户中删除用户。如果被拒绝,就离开他吧。最后,只需检查组中是否有足够的用户符合限制。