Prolog 进度计划策略
我将尝试用Prolog解决一个调度问题。 我有一组来自以下格式的人的请求Prolog 进度计划策略,prolog,scheduling,clpfd,Prolog,Scheduling,Clpfd,我将尝试用Prolog解决一个调度问题。 我有一组来自以下格式的人的请求 req_id, user_id, start_date, end_date, state 这些人中的每一个人都属于一个或多个群体 group_id, user_id 每个组的定义如下: group_id, loose, strict 其中loose和strict是大于等于0的整数 每个请求的初始状态未知,可以更改为“已拒绝”或“已批准” P>解释松散和严格的团体考虑下面的例子 Group A - Loose 1 -
req_id, user_id, start_date, end_date, state
这些人中的每一个人都属于一个或多个群体
group_id, user_id
每个组的定义如下:
group_id, loose, strict
其中loose和strict是大于等于0的整数
每个请求的初始状态未知,可以更改为“已拒绝”或“已批准”
<> P>解释松散和严格的团体考虑下面的例子
Group A - Loose 1 - Strict 1
Group B - Loose 1 - Strict 0
Group C - Loose 0 - Strict 1
根据任何给定时间的这些数据,我们需要3个人工作,因为1个人可以解决A和B两个松散问题(假设他同时在这两个组中),1个人需要解决A严格问题,1个人需要解决C严格问题
日期跨度将限制在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 ).
本代码中的假设是,只有严格的规则,所有请求的长度相同(完全重叠),并且所有用户都提出了请求
计划([组(组1,1,0)],[用户组(用户1,组1)],[用户请求(用户1,[请求(请求1,请求操作1)]),用户请求(用户2,[请求(请求2,请求操作2)])) 所以我终于找到了解决办法。 我现在有两个中间表示,而不是所有这些中间表示
这样,当请求被批准时,我可以将该用户从组的用户中删除。如果被拒绝,就让他离开。最后,只需检查组中是否有足够的用户达到限制。此时您是否有任何代码?我在明天之前没有可用的代码,因为它正在工作,但我正在尝试解决问题现在是一个“一天”的问题,但我想用一个简单的整数来表示日期,用第一次搜索的日期作为偏移量。你应该给出一个更详细的例子。现在的问题是,很难理解所有涉及的约束/规则。