小编alb*_*ins的帖子

MiniZinc:在列表中压缩非零元素对

我有一种情况,我正在建模一个数组S,其中包含来自预定义域的一组值(一个计划)1..t,加上0,这是"不存在/不使用"的特殊值.

我现在想要发布一个约束来C对列表中的成本函数求和,表示为2D数组,以相同的顺序S'保存每个非零元素S,如下所示:

constraint x = sum([C[S'[d], S'[d + 1]] | d in 1..max - 1])

但是,这不容易做到.我尝试过的事情:

  • 使用函数形式roots获取S其数据非零的索引集.该解决方案的问题是:
    • 结果是一个集合,因此不能压缩成对或容易地转换为列表,即使我从提供的实例数据中知道它们的数量.
    • root似乎要求所有值都参与数组,而我希望只有0以外的完整域.
  • 使用列表推导(例如[S[i] | i in 1..max where S[i] != 0])仅选择值为非零的元素:这也不起作用,因为where列表推导上的子句导致列表属于类型opt,并且元素数量也是错误的(我假设其中一些将是<>),基本上减少了使用<>:s 再次将零过滤到同一问题的问题.
  • 将成本函数作为DFA处理,将0值作为自循环处理:这不会(以任何方式我可以识别)允许计数; 只验证转换,我不关心.

我真正想要的是filter或者zip,这既可以轻松解决我的问题,但我认为有一些我缺少的标准解决方案.否则,我将不得不重新设计模型.

arrays minizinc

2
推荐指数
1
解决办法
401
查看次数

在短路操作中将空列表/Seq 视为失败的惯用(且快速)方法是什么?

我遇到一种情况,我使用函数来模拟规则应用程序,每个函数返回应用时将采取的操作,或者,如果无法应用规则,则返回空列表。我有很多规则想按顺序和短路进行尝试。在我习惯的其他语言中,我会将空序列视为 false/None 并将它们与 链接起来orElse,如下所示:


def ruleOne(): Seq[Action] = ???
def ruleTwo(): Seq[Action] = ???
def ruleThree(): Seq[Action] = ???

def applyRules(): Seq[Action] = ruleOne().orElse(ruleTwo).orElse(ruleThree)

Run Code Online (Sandbox Code Playgroud)

然而,据我了解,这不会起作用,事实上,它会做一些超出我预期的事情

我可以使用returnwhich 让我感觉不好,或者更糟糕的是,嵌套if语句。if let在这里本来会很棒,但 AFAICT Scala 没有。

这里惯用的方法是什么?

monads scala list option-type

1
推荐指数
1
解决办法
185
查看次数

标签 统计

arrays ×1

list ×1

minizinc ×1

monads ×1

option-type ×1

scala ×1