2014-02-04 2 views
4

Вот типичная формулировка оптимизации с MSF:метод как функция цели в Microsoft Solver Foundation?

using Microsoft.SolverFoundation.Services; 

SolverContext context = SolverContext.GetContext(); 
Model model = context.CreateModel(); 

//decisions 
Decision xs = new Decision(Domain.Real, "Number_of_small_chess_boards"); 
Decision xl = new Decision(Domain.Real, "Number_of_large_chess_boards"); 

model.AddDecisions(xs, xl); 

//constraints 
model.AddConstraints("limits", 0 <= xs, 0 <= xl); 
model.AddConstraint("BoxWood", 1 * xs + 3 * xl <= 200); 
model.AddConstraint("Lathe", 3 * xs + 2 * xl <= 160); 

//Goals 
model.AddGoal("Profit", GoalKind.Maximize, 5 * xs + 20 * xl); 

// This doesn't work! 
// model.AddGoal("Profit", GoalKind.Maximize, objfunc(xs, xl)); 


Solution sol = context.Solve(new SimplexDirective()); 
Report report = sol.GetReport(); 
Console.WriteLine(report); 

Можно ли использовать отдельный метод вместо заявления, как «5 * хз + 20 * х» в качестве целевой функции? Например, такой метод, как следующий? Как?

// this method doesn't work! 
static double objfunc(Decision x, Decision y) 
{ 
    return 5 * x.ToDouble() + 20 * y.ToDouble(); 
} 
+0

Похоже 'objfunc' должен возвращать' Term' - или, может быть, вам просто нужно добавить ящик явно – Gus

ответ

4

Это так же просто, как:

static Term objfunc(Decision x, Decision y) 
     { 
      return 5 * x + 20 * y; 
     } 

Вместо того, чтобы возвращать double, функция должна возвращать Term.

+0

Как использовать переменные решения в отдельном методе, если они определены как набор значений, таких как: Set setMonths = new Set (Domain.IntegerRange (1,12), «Months»); Решение dPrice = new Решение (Domain.RealNonnegative, «Price», setMonths), теперь я могу передать dPrice в качестве решения методу, но как я могу прочитать отдельные значения (например, dPrice [month])? Я еще не нашел пути. Спасибо – selmar

+0

Индексированные переменные решения объясняются здесь: http://nathanbrixius.wordpress.com/2011/07/18/getting-solution-values-using-solver-foundation-services/ –

+0

Как могу ли я получить индексированные значения перед выполнением решения()? dPrice.GetDouble (i) вызывает ошибку, если я вызываю ее перед решением(). – selmar

-1

Примечание. Функция не возвращает числовой ответ, а метод оценки ответа. Если вы должны перекодировать как Term Test = 5 * x + 20 * y; Строка strTest = Test.ToString();

Тогда strTest бы что-то вроде (Add (мульт (5, х), мульт (20, у));