CP SAT:如何从间隔调度中排除某些时隙

问题描述

请原谅一个新手问题。使用Java / Groovy,我设法将持续时间不同(requestedSlots)的观察值(obs)安排到每小时的时段中,每24小时有10个“夜间”时段。观察不得安排在夜间范围内进行。那很好。我也有一个数组,它以每天0 ... 100的百分比保存月亮的照度(不是真的每小时需要)。我如何表达仅在光照[from]小于obs [from] .maxIllumination时才必须安排观察?非常感谢。

    public static final int NUM_NIGHTS      =  180
    public static final int SLOTS_PER_NIGHT =  10
    public static final int SLOTS_PER_DAY   =  24
    public static final int TOTAL_SLOTS     =  NUM_NIGHTS * SLOTS_PER_DAY
...
   boolean schedule(List<OB> obs) {
        // create constraint model
        CpModel model = new CpModel()

        List<Slot> slots = []
        List<IntervalVar> obIntervals = (0 ..< obs.size()).collect { int i ->
            Intvar from = model.newIntvar(0,TOTAL_SLOTS - 1,"OB $i from")
            Intvar to   = model.newIntvar(0,"OB $i to")
            // constraint: intervals and their duration
            model.newIntervalVar(from,obs[i].requestedSlots,to,"OB $i slot duration")
        }

        // constraint: exclude daytime slots 10 ... 23
        List<IntervalVar> daytimeIntervals = (0 ..< NUM_NIGHTS).collect { int night ->
            model.newFixedInterval(night * SLOTS_PER_DAY + SLOTS_PER_NIGHT,SLOTS_PER_DAY - SLOTS_PER_NIGHT,"Day $night reserved daytime")
        }
        // constraint: no slot overlap
        model.addNoOverlap((obIntervals + daytimeIntervals) as IntervalVar[])

        // solve
        cpsolverStatus status = new cpsolver().solve(model)
        status == cpsolverStatus.OPTIMAL || status == cpsolverStatus.FEASIBLE
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)