Как использовать Solver Foundation для упрощения матрицы решений - PullRequest
3 голосов
/ 17 июля 2011

Некоторое время боролись, надеемся найти здесь какое-нибудь предложение.Сначала матрица решений выглядит примерно так:

Условие 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; }
 }
}

1 Ответ

0 голосов
/ 17 июля 2011

можно использовать, если команда подобна этой

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

, если вы можете предоставить пример кода, который поможет другим ответить ...

спасибо

...