Prolog 序言:使用附加约束安排开始时间

Prolog 序言:使用附加约束安排开始时间,prolog,clp,Prolog,Clp,在uni的一个作业中,我被要求为谓词backup/5表示的假设备份创建一个时间表 第一个参数是服务器类型,其值为:db,web 第二个参数是服务器名称 第三个参数表示备份可以开始的时间 第四个参数表示备份的持续时间 第五个参数表示备份所需的带宽 限制条件: 无法同时运行2个db或web备份实例(每个实例中有1个) 可以这样做) 总带宽不能超过25 需要做的是编写一个谓词调度备份(Db\u启动、Web\u启动、ToalTime)。 可用于ic、ic_全局、分支和绑定、ic_边缘查找器的库

在uni的一个作业中,我被要求为谓词backup/5表示的假设备份创建一个时间表

  • 第一个参数是服务器类型,其值为:db,web
  • 第二个参数是服务器名称
  • 第三个参数表示备份可以开始的时间
  • 第四个参数表示备份的持续时间
  • 第五个参数表示备份所需的带宽
限制条件:

  • 无法同时运行2个db或web备份实例(每个实例中有1个) 可以这样做)
  • 总带宽不能超过25
需要做的是编写一个谓词调度备份(Db\u启动、Web\u启动、ToalTime)。 可用于ic、ic_全局、分支和绑定、ic_边缘查找器的库

备份示例:

backup(db,srv_d1,0,5,10).
backup(db,srv_d2,2,8,18).
backup(db,srv_d3,0,4,11).
backup(web,srv_w1,0,7,8).
backup(web,srv_w2,3,11,10).
问题是。。。我如何在所有备份上获得带宽约束,同时又必须针对开始时间约束分别对它们进行约束?我找到了它,并且有了一段工作代码,但我不认为这是最好的方法。我将把它作为解决方案发布


如果有人有更好的建议,请随时发布。

您的代码是?您好,您的问题不包含任何实际问题。你被困在哪里?你试过什么?试着制定一个你想要回答的具体问题(“你能帮我写作业吗?”不算数:))。另请参阅上的一些问题。感谢您指出,在我发布时,我的大脑是从prolog中炸出来的。我实际上已经完成了任务,我将更新问题并发布我所做的。您的代码是?您好,您的问题不包含任何实际问题。你被困在哪里?你试过什么?试着制定一个你想要回答的具体问题(“你能帮我写作业吗?”不算数:))。另请参阅上的一些问题。感谢您指出,在我发布时,我的大脑是从prolog中炸出来的。我实际上已经完成了任务,我将更新问题并发布我所做的。
schedule_backups(DStarts,WStarts,Total):-
    findall(Server,backup(Server,_,_,_,_),Types),
    findall(PossibleStart,backup(db,_,PossilbleStart,_,_),Posiible_DB_Starts),
    findall(PossibleStart,backup(web,_,PossilbleStart,_,_),Possible_WEB_Starts),
    findall(Duration,backup(db,_,_,Duration,_),DB_Durations),
    findall(Duration,backup(web,_,_,Duration,_),WEB_Durations),
    findall(Bandwidth,backup(_,_,_,_,Bandwidth),Bandwidths),

    constraint_Starts_Ends(DBStarts,DbEnds,Possilble_DB_Starts,DB_Durations,-1),
    constraint_Starts_Ends(WEBStarts,WebEnds,Possilble_WEB_Starts,WEB_Durations,-1),
    append(DBStarts,WEBStarts,Starts),
    append(DbEnds,WebEnds,Ends),
    append(DB_Durations,WEB_Durations,Durations),

    cumulative(Starts, Durations,Bandwidths, 25),
    ic_global:maxlist(Ends,Total),
    bb_min(labeling(Starts),Total,bb_options{strategy:restart}),
    link(Types,Starts,WStarts,DStarts).



constraint_Starts_Ends([],[],[],[],_).
constraint_Starts_Ends([S|RestS],[E|RestE],[P|RestP],[Dur|RestDur],Prev):-
    S #:: 0..inf,
    S #>= P,
    S #>= Prev,
    E #:: 0..inf,
    E #= Dur + S,
    constraint_Starts_Ends(RestS,RestE,RestP,RestDur,E).

link([],[],[],[]).
link([T|TRest],[St|StRest],[WStarts|WRest],Db):-
    T == web,
    WStarts = St,
    link(TRest,StRest,WRest,Db).
link([T|TRest],[St|StRest],Wb,[D|DRest]):-
    T == db,
    D = St,
    link(TRest,StRest,Wb,DRest).