【问题标题】:Permutation of binary vectors二元向量的排列
【发布时间】:2014-11-16 10:16:41
【问题描述】:

我正在尝试解决特定的切割库存问题。这一切都归结为解决以下任务,至少在我的解决方案中: 我想找到一个长度为 n 的向量的所有排列,其中填充了 m 个。 例如:

(11100) 在这种情况下:n=5 和 m=3

解决方案:

11100 11010 11001 10110 10101 10011 01110 01101 01011 00111

我知道如何计算可能性的数量,但不知道如何以一种智能有效的方式获取实际向量。

我正在使用 Vb.Net,并且在编程方面不是很有经验。是否有针对该问题的 .Net 解决方案?如果不是,我将感谢您帮助开发自定义解决方案。

谢谢。

【问题讨论】:

  • VB.Net 并不是一种天生以数学为中心的语言,因此也许您可以更具体地了解问题背后的逻辑。就逻辑而言,也许this previous question 可以帮助您开始编写代码。
  • 另外,here的逻辑似乎有很好的解释。
  • 谢谢贾斯汀,这看起来很有希望。我会在接下来的几天里仔细看看。

标签: vb.net binary permutation


【解决方案1】:

我已经为你编写了一个可以做到这一点的函数。

这是示例输出:

00111
01011
01101
01110
10011
10101
10110
11001
11010
11100

代码如下:

Option Strict On
Option Explicit On
Option Infer Off
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim sb As New System.Text.StringBuilder
        For Each s As String In getPermutations(5, 3).ToArray
            sb.AppendLine(s)
        Next
        Clipboard.SetText(sb.ToString)
        MsgBox(sb.ToString)
    End Sub
    Public Iterator Function getPermutations(m As Integer, n As Integer) As IEnumerable(Of String)
        Dim highest As Integer = CInt(2 ^ m)
        For I As Integer = 0 To highest - 1
            Dim s As String = Convert.ToString(I, 2).PadLeft(m, "0"c)
            If oneCount(s) = n Then
                Yield s
            End If
        Next
    End Function
    Function oneCount(ref As String) As Integer
        Dim result As Integer = 0
        For Each ch As Char In ref
            If ch = "1" Then result += 1
        Next
        Return result
    End Function
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        getPermutations(3, 1)
    End Sub
End Class

【讨论】:

  • 非常感谢!为了理解你的代码的每一个细节,我必须查阅很多东西。我有一个问题,首先计算“正确”排列而不是创建所有二进制文件并选择我需要的那些可能会更好吗?
  • 说实话我不知道。也许您可以研究位模式并从中推断出一个公式?我承认,当您查看顺序列表中的结果时,似乎存在关于位的可见模式。但是确定这种模式需要更多的工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
相关资源
最近更新 更多