gpt4 book ai didi

c# - 如何使用 Solver Foundation 来简化决策矩阵

转载 作者:行者123 更新时间:2023-11-30 18:47:08 25 4
gpt4 key购买 nike

一直在苦苦挣扎,希望在这里寻求一些建议。首先,决策矩阵是这样的:

条件 1 -> 条件 2 -> 决定

 Yes           Yes          Go ahead
Yes No Go ahead
No Yes Go ahead
No No Give up

假设:1.我们只考虑上面的顺序(“->”)。2. 条件 1 和 2 的所有可能选项都只是"is"和“否”。

简化的准则是,如果从最后一个条件开始在所有可能的选项下做出相同的决定,那么在相同的last-1条件下可以省略最后一个条件。即

决定“继续”*,

条件 1 -> 条件 2 -> 决定

 Yes        Yes =>  X       Go ahead
Yes Yes => X Go ahead
No Yes Go ahead

我最初的想法是在这部分应用求解器基础(*),而其他部分由传统编程处理,例如 for 循环和递归。在这种情况下,最终答案应该是

条件 1 -> 条件 2 -> 决定

 Yes             X          Go ahead
No Yes Go ahead
No No Give up

我卡的是下面逻辑的实现:

决定与目标:从集合 * 中选择最小的索引 i(即选择一个代表要简化的关键的案例)。

约束:选择条件 1 等于已判定案例的条件 1 的案例,然后检查在所有选择的案例中是否所有可能的选项都出现在条件 2 中。

一旦我们得到决定,即 0,我们就知道条件 1 为"is"的情况可以省略条件 2。

看到任何人都可以提供帮助。谢谢。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SolverFoundation.Common;
using Microsoft.SolverFoundation.Services;
using Microsoft.SolverFoundation.Solvers;

namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
SolverContext context = SolverContext.GetContext();
Model model = context.CreateModel();

Segment[] segmentData = new Segment[] {
new Segment { id = 0, col1 = 0, col2 = 0 },
new Segment { id = 1, col1 = 0, col2 = 1 },//answer = 0, since this row's col1 and col2 = row 0's, thus can be omitted (simplified).
new Segment { id = 2, col1 = 1, col2 = 0 } //answer = 0, since this row's col1 not = row 0's, thus remain unchanged.
};

//set
Set items = new Set(Domain.Integer, "items");

//decision
Decision i = new Decision(Domain.IntegerRange(0,1), "index");
model.AddDecisions(i);

//parameter
Parameter col1 = new Parameter(Domain.Integer, "col1", items);
col1.SetBinding(segmentData, "col1", "id");
Parameter col2 = new Parameter(Domain.Integer, "col2", items);
col2.SetBinding(segmentData, "col2", "id");
model.AddParameters(col1, col2);

//constraint
//sum of all possible col2 should be 0 + 1 = 1
model.AddConstraint("cases",
1 == Model.Sum(
Model.ForEachWhere(
items,
s => col2[s],
s => col1[s] == i
)
)
);

model.AddGoal("goal", GoalKind.Minimize, i);

//problem: no suitable directive found.
HybridLocalSearchDirective directive = new HybridLocalSearchDirective();
directive.TimeLimit = 10000;
Solution solution = context.Solve(directive);

Report report = solution.GetReport();
Console.WriteLine("{0}", i);
Console.Write("{0}", report);
Console.ReadLine();
}
}

class Segment
{
public int id { get; set; }
public int col1 { get; set; }
public int col2 { get; set; }
}
}

最佳答案

是否可以像这样使用if命令

if (Condition_One || Condition_Two)
{
//Go ahead command
}
else
{
//Give up code
}

如果你能提供一个示例代码来帮助其他人回答......

谢谢

关于c# - 如何使用 Solver Foundation 来简化决策矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6723829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com