博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用Microsoft.Solver.Foundation进行线性规划,为WPF应用添加智能
阅读量:7071 次
发布时间:2019-06-28

本文共 4030 字,大约阅读时间需要 13 分钟。

原文:

  在管理信息系统的开发过程中,往往会涉及到一些线性规划数学模型,例如资源配置优化。微软的Microsoft.Solver.Foundation是一个数学库,可以很好的对线性规划问题进行求解。关于它的细节,可以自行百度,话不多说,以例题来学习如何用Microsoft.Solver.Foundation进行线性规划:

  题目(来自网络),如下图:

  

  为了解决上述线性规划问题,先要下载并安装Microsoft.Solver.Foundation库,关于安装细节这里不赘述。

1、VS2012建立一个WPF应用程序WpfLPDemo(WinForm也是可以的),新建一个libs文件夹和images文件夹,并将Microsoft.Solver.Foundation.dll拷贝到libs(注意添加dll引用),如下图:

images下放的图片为题目截图。

2、编辑MainWindow.xaml文件,在设计界面上放一个Image展示例题截图、TextBlock用于显示优化结果、Button用于触发计算事件,代码如下:

1 
5
6
7
8
9 10
11

3、编辑MainWindow.xaml.cs文件,注意添加using Microsoft.SolverFoundation.Services; using Microsoft.SolverFoundation.Solvers;代码如下(核心代码已经做了注释,可了解一下用法):

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Windows; 7 using System.Windows.Controls; 8 using System.Windows.Data; 9 using System.Windows.Documents;10 using System.Windows.Input;11 using System.Windows.Media;12 using System.Windows.Media.Imaging;13 using System.Windows.Navigation;14 using System.Windows.Shapes;15 using Microsoft.SolverFoundation;16 namespace WpfLPDemo17 {18     using Microsoft.SolverFoundation.Services;19     using Microsoft.SolverFoundation.Solvers;20     /// 21     /// MainWindow.xaml 的交互逻辑22     /// 23     public partial class MainWindow : Window24     {25         public MainWindow()26         {27             InitializeComponent();         28         }29         public object OPT()30         {31             SolverContext context = SolverContext.GetContext();32             //创建模型33             Model model = context.CreateModel();34             //优化决策因子,变量为实数,Domain.Integer|Domain.IntegerNonnegative为整数优化35             Decision x = new Decision(Domain.Real, "x");   36             Decision y = new Decision(Domain.Real, "y");37             //添加38             model.AddDecisions(x, y);39             //x,y变量范围40            // model.AddConstraints("变量范围",41            // double.NegativeInfinity < x <= double.PositiveInfinity,42            //double.NegativeInfinity < y <= double.PositiveInfinity);43 44             model.AddConstraints("约束",45             double.NegativeInfinity < x <= double.PositiveInfinity,46            double.NegativeInfinity < y <= double.PositiveInfinity,47             2*x +  y     - 2    >=0,48             x     -  2*y  + 4   >=0,49            3*x -   y      -3    <= 0);50             //目标函数 min z=x * x + y * y , GoalKind.Minimize最小值51            Goal gmin= model.AddGoal("zmin", GoalKind.Minimize, x * x + y * y);52         53             //优化54             Solution solution = context.Solve();55             //优化报告56            // Report report = solution.GetReport();57 58             string s = string.Format("min [ x={0:N2},y={1:N2}", x.ToDouble().ToString("0.00"), y.ToDouble().ToString("0.00"));59             s += string.Format(",min={0} ] " ,solution.Goals.First
().ToDouble().ToString("0.00"));60 61 //=================================================================62 model.RemoveGoal(gmin);63 Goal gmax = model.AddGoal("zmax", GoalKind.Maximize, x * x + y * y);64 //优化65 solution = context.Solve();66 s += string.Format("| max[ x={0:N2},y={1:N2}", x.ToDouble().ToString("0.00"), y.ToDouble().ToString("0.00"));67 s += string.Format(",max={0} ] " ,solution.Goals.First
().ToDouble().ToString("0.00"));68 //--------------------------------------------------------------------------------------------------------------------------------69 70 context.ClearModel();71 return s;72 73 }74 private void Button_Click_calc(object sender, RoutedEventArgs e)75 {76 this.answer.Text = OPT().ToString();77 }78 79 80 }81 }

4、保存并运行程序,成功的话应该如下图:

5、单击计算按钮,即可输出结构,如下图:

可见计算的答案和例题给出的答案是一致的。为了构建根据通用的程序,可以从UI上动态传入模型以及模型的值进行优化求解,从而更好的具有实用性。

 

转载地址:http://lfell.baihongyu.com/

你可能感兴趣的文章
在vmware里面免费安装纯净的xp虚拟机
查看>>
什么是RESTfull?理解RESTfull架构【转】
查看>>
linux lsof命令详解
查看>>
MySQL中concat函数
查看>>
代理模式
查看>>
Linux命令 cat命令
查看>>
poj1007 逆序数 排序
查看>>
周末轻松话卷积(上)
查看>>
【转】对C# 中堆栈,堆,值类型,引用类型的理解
查看>>
perl脚本调用
查看>>
gcc 0长数组学习
查看>>
经方时方接轨之――茵陈蒿汤合甘露饮
查看>>
MATLAB中取整函数(fix, floor, ceil, round)的使用
查看>>
10Mybatis_mybatis和hibernate本质区别和应用场景
查看>>
C语言 线性表 顺序表结构 实现
查看>>
SQLLoader7(只导入数据文件的其中几行记录)
查看>>
iOS编程修改系统音量
查看>>
当 iOS 游戏开发像做份沙拉那么简单
查看>>
HDOJ2028 ( Lowest Common Multiple Plus ) 【水题,lcm】
查看>>
css--水平居中,垂直居中,自适应宽度
查看>>