1

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

  • 第一个参数是具有值的服务器类型:db、web
  • 第二个参数是服务器名称
  • 第三个参数表示备份可以开始的时间
  • 第四个参数代表备份的持续时间
  • 第五个参数表示备份所需的带宽

约束:

  • 不能同时运行 2 个 db 或 web 备份实例(可以同时运行 1 个)。
  • 总带宽不能超过 25

需要做的是写一个谓词 schedule_backups(Db_Starts,Web_Starts,ToalTime)。可以使用 ic、ic_global、branch_and_bound、ic_edge_finder 的库。

备份示例:

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).

问题是......我如何获得所有备份的带宽限制,同时必须为开始时间限制单独限制它们?我想通了并且有一段工作代码,但我认为这不是最好的方法。我会将其发布为解决方案。

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

4

1 回答 1

0
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).
于 2020-06-07T19:10:13.940 回答