如何生成满足某些限制的整数?

时间:2010-01-20 11:00:12

标签: integer constraints

任何人都可以帮我提供生成满足某些限制的整数的技巧。

例如,假设我需要生成整数x和y,以便

      100 > x
and   y < x + 5

我并不是指这个特殊的例子,而是一些通用技术来生成满足某些条件的整数。

6 个答案:

答案 0 :(得分:6)

嗯,那并不难:

  1. 选择一个整数,可能是随机的。
  2. 检查您的条件
  3. 如果一个条件失败,请返回步骤1.
  4. 如果您的示例中有多个整数,例如 x y ,请将“整数”替换为“整数”。

    此技术也称为拒绝采样

    例如,您可以使用一系列链式迭代器来实现它。并且一些约束作为生成器很好地工作,例如“小于100的正整数”,所以在过滤所有其他约束之前,你可能会开始使用其中一个。

    我认为适用于一般限制的唯一其他选项是分析您的约束并生成数字而不猜测但知道如何生成它们。对于诸如“0&lt; 0的约束”这是微不足道的。 x&lt; 100“但除此之外,它与实施计算机代数系统密切相关。还要记住,你必须同时满足每个约束......长时间拒绝抽样会使这种方法成为实施的噩梦。

答案 1 :(得分:4)

如果所有约束都可以写成一组线性方程式,则可以使用linear programming找到最大化'c1 * x + c2 * y'的解法。对于c1和c2,您可以绘制随机值。特别是如果你有很多约束和变量可能比仅仅尝试x和y的随机值更快。

答案 2 :(得分:1)

如果它是一种脚本语言,您可以将最小和最大x和y值以及一组测试传递给函数,然后使用rand生成您范围内的初始值。

接下来,您只需使用'eval'的某个变体遍历数组,以测试您的健身值。

这将是解决您问题的通用解决方案。

答案 3 :(得分:1)

您想要查看基于约束的语言。例如,CLIP将允许您指定约束,然后将返回满足所有约束的区间集。

答案 4 :(得分:1)

这种问题是Prolog的设计目标。您还可以查看更新的语言,例如Mozart,以获得更现代化的内容。声明性编程模型是宣布输出的约束,然后获得满足指定约束的答案。

引用Prolog的维基百科页面:

Prolog源于形式逻辑,与许多其他编程语言不同,Prolog是声明性的:程序逻辑用关系表示,表示为事实和规则。通过对这些关系运行查询来触发执行。

答案 5 :(得分:0)

如果您感觉LINQ-y,那么您可以从列出所有可能的x,y对开始,然后为每个条件应用where子句。 无论剩下什么,你都可以随机挑选物品。

Dim everything As List(Of Point) = generate_pairs()
Dim rest As List(Of Point) = everything.Where(Function(pp) pp.X > 100).ToList
rest = rest.Where(Function(pp) pp.Y < pp.X + 5).ToList
Dim rnd As New Random()
Dim r As Integer = rnd.Next(rest.Count)
Dim p As Point = rest.Skip(r).Take(1).SingleOrDefault
System.Console.WriteLine("x: " & p.X & " y: " & p.Y)