小编ang*_*son的帖子

可能的NP完全问题?

我只是想让某人验证以下问题是NP完全还是实际上有一个比简单的强力组合检查更好/更容易的解决方案.

我们的软件中存在一种资源分配问题,我将用一个例子来解释它.

假设我们需要4个人在白班工作.这个数字以及它是"白班"的事实记录在我们的数据库中.

但是,我们并不需要任何人填写这些地点,需要填写一些要求才能满足要求.

在这4个中,让我们说其中2个必须是护士,其中1个必须是医生.

其中一名医生也必须作为特定团队的一员工作.

所以我们有这套信息:

白班:4名
   1名医生
   1名医生,需要在A组
   1名护士工作

以上不是问题.当我们开始挑选人们白天工作并试图弄清楚到目前为止我们选择的人是否能够真正满足标准时,问题就出现了.

例如,假设我们选择James,John,Ursula和Mary来工作,其中James和Ursula是医生,John和Mary是护士.

厄秀拉也在A队工作.

现在,根据我们试图适应账单的顺序,我们最终可能会推断出我们是否拥有合适的人,除非我们开始尝试不同的组合.

例如,如果在列表中首先选择Ursula,我们可以将她与"1医生"标准相匹配.然后我们到了詹姆斯,我们注意到,由于他不在A队工作,所以关于"1位医生,需要在A队工作"的其他标准,不能用他来填补.由于其他两个人都是护士,他们也不符合这个标准.

因此,我们首先回溯并尝试詹姆斯,他也可以符合第一个标准,然后厄秀拉可以满足需要该团队的标准.

所以问题在我们看来,因为我们需要尝试不同的组合,直到我们要么全部尝试,在这种情况下我们有一些尚未填充的标准,即使工作头的总数与总数相同需要的头数,或者我们发现了一个有效的组合.

这是唯一的解决方案,任何人都可以想到更好的解决方案吗?


编辑:一些澄清.

对这个问题的评论提到,对于这几个人,我们应该蛮力,我同意,这可能是我们可以做的,我们甚至可以做到这一点,在某些优化看待大小的同一条道路上如果数据量很小,数据并选择不同的排序算法,初始开销较小.

但问题在于,这是一个名册规划系统的一部分,你可能会涉及很多人,"我们在白天需要X人"以及"我们有这个Y人群"这将是",以及一个大的潜力"我们有这个X人的Z标准列表,将不得不以某种方式与这些Y人匹配",然后你补充说我们将有在领导者调整名单的同时,实时进行相同计算的天数,然后需要快速解决方案.

基本上,领导者会在屏幕上看到一个实时信息,说明有多少人仍在失踪,无论是在整个日班,还是有多少人符合各种标准,以及我们实际有多少人除了我们拥有的那些之外.这个显示器必须更新半实时,而领导者调整名单时"如果詹姆斯采取白天而不是厄秀拉,而厄秀拉需要夜班".

但是非常感谢到目前为止已经回答过这个问题的人,约束满足问题听起来像我们需要的方式,但我们肯定会在这里仔细查看所有的链接和算法名称.

这就是为什么我喜欢StackOverflow :)

algorithm allocation np-complete constraint-satisfaction

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

C#中的IEnumerable <T>

我试图让以下代码编译,但在VS2008中遇到错误.谁能告诉我哪里出错了?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace dummy
{
    public class NaturalNumbersSequence : IEnumerable<int>
    {
        public IEnumerator<int> GetEnumerator()
        {
            for (int i = 1; i <= 1000; i++)
                yield return i;
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            for (int i = 1; i <= 1000; i++)
                yield return i;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            foreach (int i in new NaturalNumbersSequence())
                Console.WriteLine(i);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c# ienumerable

8
推荐指数
2
解决办法
2万
查看次数

Win32/Induc.A,"Delphi" - 病毒,感染SysConst.pas,有没有人有一个代码样本可供搜索?

我刚刚注意到最近升级的Take Command被报告为感染了这种病毒,并且在过去几个小时内对NOD的更新增加了检测该病毒的能力,这就是我意识到这一点的原因.在这种情况下,根据我接受的答案中链接的文章的内容来判断,它看起来像是误报.

不过...

显然,这种病毒只在受感染的程序运行时运行,但它会尝试找到Delphi安装,找到SysConst.pas文件,并在其中添加必要的代码,以使Delphi编译带有病毒的新程序.

我没有在这台机器上安装Delphi,所以至少应该把这个问题变成一个小问题,但是在工作中我们有一些安装了Delphi的机器.幸运的是,我没有更新形式的Take Command我的工作机器,但是说其中没有很多其他程序用Delphi编写,人们最近更新了......

所以,我想我会问.有没有人看过一个活的受感染的SysConst.pas文件,并且可以提供一些不应该在那里的示例代码?这样我们就可以通过机器运行并确保我们没有问题?

delphi virus

8
推荐指数
2
解决办法
1877
查看次数

在.NET中获取泛型类型的基本名称的正确方法是通过Substring?

如果我有这个:

Type t = typeof(Dictionary<String, String>);
Run Code Online (Sandbox Code Playgroud)

我怎么得到"System.Collections.Generic.Dictionary"一个字符串?这是最好/唯一的方法:

String n = t.FullName.Substring(0, t.FullName.IndexOf("`"));
Run Code Online (Sandbox Code Playgroud)

虽然看起来有点像哈希.

我想要这个的原因是我想要一个Type对象,并产生类似于C#源代码文件中的代码.我正在制作一些文本模板,我需要将类型作为字符串添加到源代码中,并且FullName属性产生如下内容:

System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089]]
Run Code Online (Sandbox Code Playgroud)

而不是我想要的:

System.Collections.Generic.Dictionary<System.String, System.String>
Run Code Online (Sandbox Code Playgroud)

编辑:好的,这是最终的代码,对我来说似乎有点像黑客,但它有效:

/// <summary>
/// This method takes a type and produces a proper full type name for it, expanding generics properly.
/// </summary>
/// <param name="type">
/// The type to produce the full type name for.
/// </param>
/// <returns>
/// The type name for <paramref name="type"/> …
Run Code Online (Sandbox Code Playgroud)

.net c# reflection types

8
推荐指数
2
解决办法
2541
查看次数

生成的C#代码是否有#pragma或类似指令将模板代码行号与C#行号匹配?

我有一个看起来类似于旧式ASP代码的模板系统.我通过一个类来运行它,该类将整个事物重写为C#源代码,编译并最终执行它.

我想知道的是,如果有某种类似#pragma的指令,我可以将生成的C#代码撒上,这会使编译错误与我的模板文件中的行号相匹配?

例如,假设我的模板代码中有第一行也是唯一一行:

Object o = datta; // should be data, compiler error
Run Code Online (Sandbox Code Playgroud)

但是为了编译它,我必须添加一个命名空间,一个类,一个方法和一些样板代码,所以上面的这一行,我的模板文件中的第一行,实际上最终是#17行(C#代码中的随机数,仅用于说明目的).编译器错误自然会将我的错误标记为第17行,而不是第1行.

我记得我之前使用的另一种编程语言(虽然我记不起哪一种)它有一个我可以添加的指令,这会使错误行号排成一行.

在C#3.5中有没有这样的东西?

c# code-generation pragma line-numbers

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

写出更好的自然类型(比我的)

我在这里添加了对这个问题的答案:在C#中进行排序List<String>,它需要一个自然排序顺序,一个处理嵌入数字的顺序.

然而,我的实现是天真的,并且代替所有关于应用程序如何通过假设(土耳其测试任何人?)正确处理Unicode的帖子,我想我会请求帮助编写更好的实现.或者,如果有.NET的内置方法,请告诉我:)

我对该问题中答案的实现只是通过字符串,逐个字符地进行比较,直到遇到两个数字.然后它从两个字符串中提取连续的数字,这可能导致长度变化,用前导零填充最短的数字,然后进行比较.

但是,它存在问题.

例如,如果你在字符串x中有两个代码点,它们共同构成字符È,但在另一个字符串中你只有一个代码点,即那个字符.

我的算法会失败,因为它会将变音符号码视为单个字符,并将其与其他字符串中的È进行比较.

任何人都可以指导我如何妥善处理这个问题?我希望支持指定一个CultureInfo处理语言问题的对象,例如在德国比较"ss"和"ß",以及类似的东西.

我想我需要让我的代码枚举"真实字符"(我不知道真正的术语)而不是单个代码点.

什么是正确的方法?

此外,如果"自然"意味着"人类期望它的工作方式",我会在思考时添加以下内容:

  • 日期和时间怎么样?
  • 浮点值怎么样?
  • 还有其他被认为是"自然"的序列吗?
    • 这应该延伸多远?(Eeny,meeny,miny,moe)

.net unicode natural-sort codepoint

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

Mercurial合并真棒 - 我错过了什么?

我已经使用Mercurial一段时间了,并且有一个"事实"被多次给出.

事实上,昨天观看由Fogcreek制作的视频时,它让我感到震惊,这段视频:Fog Creek Kiln:为您的公司解锁DVCS的力量,似乎有些东西对我来说不起作用.

在该视频及其后的1:39左右,它表明当其他版本控制系统跟踪修订版(即快照)时,DVCS'就像Mercurial跟踪更改集(即快照之间发生的事情).

这使它们在合并场景中具有优势,然后它显示了一个示例.如果您在一个分支中移动一个函数,并在另一个分支中更改相同的函数,Mercurial可以合并它.

虽然我现在找不到任何直接链接,但我已经在其他地方看到了这一点.

这对我来说似乎不起作用.


编辑:这是TortoiseHg的默认"beyondcompare3"合并工具配置的问题.我将下面的配置添加到我的Mercurial.ini文件中,现在它按预期工作.当然,如果它不能自动充电,它会向GUI工具发挥作用,但现在这个问题中描述的合并在没有任何提示的情况下运行,并且开箱即可做正确的事情

[ui]
merge = bc3

[merge-tools]
bc3.executable = C:\Program Files (x86)\Beyond Compare 3\bcomp.exe
bc3.args = $local $other $base $output /automerge /reviewconflicts /closescript
bc3.priority = 1
bc3.premerge = True
bc3.gui = True
Run Code Online (Sandbox Code Playgroud)

为了测试这个,我将此文件提交到存储库:

void Main()
{
    Function1();
    Function2();
}

public void Function1()
{
    Debug.WriteLine("Function 1");
    for (int index = 0; index < 10; index++)
        Debug.WriteLine("f1: " + index);
}

public void Function2()
{
    Debug.WriteLine("Function 1");
}
Run Code Online (Sandbox Code Playgroud)

然后在从这一个分支出来的两个不同的并行更改集中,我做了以下两个更改:

  1. 我将Function1函数移动到文件的底部
  2. 我更改了Function1中的消息

然后我尝试合并,Mercurial给了我一个合并冲突窗口,试图弄清楚我做了什么.

基本上,它尝试更改Function2中的文本,该文本现在处于Function1移动之前的位置. …

merge mercurial merge-conflict-resolution

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

Mercurial,"用书签分支"

我阅读了本文档:Mercurial分支指南,特别是标题为使用书签分支的部分.

它说:

现在,您在当前变更集中有两个分支(基本上是标记).

要切换到其中一个分支,您可以使用hg update feature更新到该分支的tip变更集,并将自己标记为在该分支上工作.提交时,它会将书签移动到新创建的变更集.

我尝试了这个,但它最终同时移动了两个书签.

该指南是错误的,过时的,还是我做错了什么?请注意,我知道在单独的分支上设置书签只会移动与我当前正在处理的分支相关的书签,但是该指南(很多人说这是明确的指南)具体说明上述文本,表明它应该通过"告诉"Mercurial我正在研究哪个书签(分支)来工作.

但测试显示不然.

有任何想法吗?

例:

> hg init
> echo 1 >test.txt
> hg commit -m "initial" --addremove
adding test.txt

> hg bookmark main
> hg bookmark feature
> hg log
changeset:   0:c56ceb49ee20
tag:         feature
tag:         main
tag:         tip
user:        Lasse V. Karlsen <lasse@vkarlsen.no>
date:        Tue Nov 30 23:06:16 2010 +0100
summary:     initial

> hg update feature
0 files updated, 0 files merged, 0 files removed, 0 files …

mercurial branch bookmarks

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

通过OmniKey的非接触式卡,如何获得"UID"?

我正在尝试使用非接触式OmniKey 5321读卡器读取智能卡信息.

编辑:添加了赏金.

我正在.NET 3.5程序中编写C#3,所以这是一个Windows应用程序.

该卡上印有一些信息,我会假设,卡片数据中存在某些信息(下面有卡片和读卡器的照片.)

该卡上印有以下信息:

1* 00447   21091328-32

使用OmniKey读卡器附带的诊断应用程序时,我会收到以下信息:

Smart Card Name: iCLASS 16KS UID:EE 74 0E 00 FB FF 12 E0
ATR            : 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0A 00 1A 00 00 00 00 78
Protocol       : ISO 15693 (Part 2)

现在,我已经考虑了一些转换:

  • 447十进制= 1BF十六进制(未找到)
  • 447八进制= 295十进制(未找到BCD类型编码)
  • 447八进制= 127十六进制(未找到)
  • 找不到447十六进制

这是我的问题:

  • "UID"号码是否是我可以依赖的唯一号码?我并不真正关心447号码,我需要知道的是,我从这张卡片中挑选的信息将在以后唯一识别它,以便我可以将其链接到卡片的所有者
  • 我如何阅读UID号码?在Windows中使用WINSCARD.DLL我可以看到每个字节都得到"ATR"数据,但UID显然不存在于该部分中.

这是照片,如果它给你任何信息.

OmniKey读卡器带卡

uniqueidentifier smartcard smartcard-reader winscard iso-15693

8
推荐指数
3
解决办法
2万
查看次数

代表们的GC,我错过了什么?(我的代表没有收集)

我有一个持有代表的课程,以便稍后懒洋洋地评估一些事情.

一旦我评估了它,通过调用委托,我清除了对委托的引用,希望它有资格收集.毕竟,如果将它构造为匿名方法,它可能会保留一个局部变量的世界.

我尝试构建一个单元测试来验证这一点,但它似乎没有按照我计划的方式运行,而是看起来我的假设WeakReference(我在这里用于测试目的),或者其他一些假设,都没有.拿水.

看看这段代码,你可以在LINQPad中运行它

void Main()
{
    WeakReference wr;
    Lazy<int> l;
    CreateTestData(out wr, out l);

    wr.IsAlive.Dump();                  // should be alive here

    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();

    wr.IsAlive.Dump();                  // and alive here as well
    l.Value.Dump();                     // but now we clear the reference

    GC.Collect();                       // so one of these should collect it
    GC.WaitForPendingFinalizers();
    GC.Collect();

    wr.IsAlive.Dump();                  // and then it should be gone here
    GC.KeepAlive(l);
}

void CreateTestData(out WeakReference wr, out Lazy<int> l)
{
    Func<int> f = () => 10;
    wr …
Run Code Online (Sandbox Code Playgroud)

.net c# delegates garbage-collection

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