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 -

我将尝试用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 - 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)]))

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

  • 开始和结束日期表示为整数偏移量的请求列表(请求(用户、第一天、最后一天、模式))
  • 组的列表,这些组表示每天可以在其中工作的用户(组(天,限制,[用户])

  • 这样,当请求被批准时,我可以将该用户从组的用户中删除。如果被拒绝,就让他离开。最后,只需检查组中是否有足够的用户达到限制。

    此时您是否有任何代码?我在明天之前没有可用的代码,因为它正在工作,但我正在尝试解决问题现在是一个“一天”的问题,但我想用一个简单的整数来表示日期,用第一次搜索的日期作为偏移量。你应该给出一个更详细的例子。现在的问题是,很难理解所有涉及的约束/规则。