Некоторое время боролись, надеемся найти здесь какое-нибудь предложение.Сначала матрица решений выглядит примерно так:
Условие 1 -> Условие 2 -> Решение
Yes Yes Go ahead
Yes No Go ahead
No Yes Go ahead
No No Give up
Предположение: 1. Мы рассматриваем только приведенную выше последовательность ("->").2. Все возможные варианты из условий 1 и 2 - это просто «Да» и «Нет».
Критерием упрощения является то, что если одно и то же решение принимается при всех возможных вариантах из последнего условия, то последнееусловие может быть опущено при том же последнем условии 1.т. е.
Для решения "Вперед" *,
Условие 1 -> Условие 2 -> Решение
Yes Yes => X Go ahead
Yes Yes => X Go ahead
No Yes Go ahead
Моя первоначальная идея заключается в применении решающей основы в этой части(*), тогда как другие части обрабатываются традиционным программированием, например, для цикла и рекурсии.В этом случае окончательный ответ должен быть
Условие 1 -> Условие 2 -> Решение
Yes X Go ahead
No Yes Go ahead
No No Give up
Я застрял в реализации следующей логики:
Решение и цель: Из набора * выберите наименьший индекс i (т. Е. Выберите случай, представляющий ключ для упрощения).
Ограничение: выберите случаи, условие 1 которых равно условию 1 решенного случая, изатем проверьте, присутствуют ли все возможные варианты в условии 2 во всех выбранных случаях.
Как только мы получим решение, которое равно 0, мы знаем случаи, когда условие 1 равно "Да", условие 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; }
}
}