计划目的:整合.我正在实现高维度(高达100)的自适应正交(又称数值积分)算法.该想法是通过使用与该点处的误差估计成比例的采样密度来评估点来随机地将体积分成更小的部分.在早期我"老化"一个统一的样本,然后根据估计误差的高斯分布随机选择点.以类似于模拟退火的方式,I"降低温度"并随着时间的推移降低高斯的标准偏差,因此低误差点最初有很大的选择机会,但后来选择稳定下降可能性.这使程序能够偶然发现由于错误功能的缺陷而可能错过的尖峰.(我的算法在精神上类似于马尔可夫链蒙特卡罗积分.)
功能特征.要整合的功能是由于自然灾害导致的多个建筑物的保险政策损失估计.政策功能并不顺利:有免赔额,最高限额,分层数(例如,零赔偿支出高达100万美元,100%支付从1-2百万美元,然后零支付超过200万美元)和其他奇怪的政策条款.这引入了非线性行为和在许多平面中没有衍生物的函数.在政策功能之上是损坏功能,它根据建筑类型和飓风强度而变化,绝对不是钟形.
问题上下文:错误功能.困难在于选择一个好的错误功能.对于每个点,我记录对此有用的度量:函数的大小,由于先前的度量(一阶导数的代理)而改变了多少,该点占据的区域的体积(更大的体积可以更好地隐藏错误),以及与区域形状相关的几何因子.我的误差函数将是这些度量的线性组合,其中每个度量被赋予不同的权重.(如果我得到的结果很差,我会考虑非线性函数.)为了帮助我完成这项工作,我决定对每个权重的各种可能值进行优化,因此微软解决方案基金会.
要优化的内容:错误等级.我的测量标准化,从零到一.随着集成的进行以反映函数值,变化等的近期平均值,这些错误值会逐步修改.因此,我不是要创建一个产生实际错误值的函数,而是生成一个对其进行排序的数字.真正的错误,即如果所有采样点都按此估计误差值排序,则它们应该接收与按真实误差排序时所接收的等级相似的等级.
并非所有点都相同.如果#1真正错误的点区域排名#1000(反之亦然),我非常在意,但如果#500点排名#1000,则非常小心.我衡量成功的标准是在算法执行的中途将许多区域的以下总和最小化:
ABS(Log2(trueErrorRank) - Log2(estimatedErrorRank))
对于Log2,我使用的函数返回小于或等于数字的最大2的幂.从这个定义来看,得到有用的结果.交换#1和#2需要花费一分,但交换#2和#3不需要任何费用.这具有将点分为两个范围的幂的效果.在范围内交换的点不会添加到该函数中.
我如何评估.我已经构建了一个名为Rank的类来执行此操作:
按真实误差对所有地区排名一次.
对于每组独立的参数化权重,它计算该区域的试验(估计)误差.
按试验错误对区域进行排序.
计算每个地区的试验等级.
添加两个等级的日志的绝对差异,并将其称为参数化的值,因此要最小化的值.
C#代码.完成所有这些后,我只需要一种方法来设置Microsoft Solver Foundation以找到最佳参数.语法让我难过.这是我到目前为止的C#代码.在其中,您将看到我已经确定的三个问题的评论.也许你可以发现更多!任何想法如何使这项工作?
public void Optimize()
{
// Get the parameters from the GUI and figures out the low and high values for each weight.
ParseParameters();
// Computes the true rank for each region according to true error.
var myRanker = new Rank(ErrorData, false);
// Obtain Microsoft Solver Foundation's core solver object. …Run Code Online (Sandbox Code Playgroud) 我正在研究线性和非线性编程(优化)框架的选项.
要求是:
支持线性和非线性编程问题约.100-1000个变量和最多约1000个约束(我收集的很简单).非线性问题具有涉及多个变量的乘法或除法的约束 - 没有比这更复杂的了.
与MS环境(SQL Server,MS Access,.NET,Excel)很好地集成
很高兴支持临时问题定义(即某种脚本语言或支持在Excel前端定义和解决问题)
我会单独使用Excel,但我还需要能够以编程方式(.NET环境)与解决方案接口以解决更大的问题.
对于程序化访问,我打算为求解器开发一个抽象接口(因此我们可以根据需要更改求解器).然后我偶然发现了已经有这个界面的MS Solver Foundation(http://code.msdn.microsoft.com/solverfoundation).我想知道它是否符合我们的其他要求以及用户对它的看法.
我正在尝试将Solver Foundation添加到我正在Visual Studio 2012中工作的项目中,但我无法在列表中找到它.
我打开了一个示例项目,引用的是Microsoft.Solver.Foundation但是我尝试在我的项目中的所有可用列表上搜索Microsoft.S并且它没有出现.
如何将Solver Foundation纳入我的项目?
我有两个自变量,GSH和Gls.使用这两个变量,我试图预测结果,prob.使用以下形式的函数:
prob=a*Gls^2+b*GSH^2+c*Gls+d*GSH+e // (where a,b,c,d,e are coefficients)
Run Code Online (Sandbox Code Playgroud)
数据样本:
Gls( 2.3 2.3 2.5 2.5 2.5 2.5 2.7 2.7 2.7 2.7 2.7 2.9 2.9 2.9 2.9 2.9 3.1 3.1 3.1 3.1 3.1 3.1 3.3 3.3 3.3 3.3 3.3 3.3 3.5 3.5 3.5 3.5 3.5)
GSH( 0.475 0.525 0.425 0.475 0.525 0.575 0.425 0.475 0.525 0.575 0.625 0.425 0.475 0.525 0.575 0.625 0.375 0.425 0.475 0.525 0.575 0.625 0.375 0.425 0.475 0.525 0.575 0.625 0.425 0.475 0.525 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用微软解算器基础,这样我就可以从一组位置中选择3个最分散的位置.我为我的模型添加了两个目标,一个确保选择3个位置,另一个确保它们是3个最分散的位置.
static void Main(string[] args)
{
Location candidate1 = new Location(0, 43.432, -79.432);
Location candidate2 = new Location(1, 43.0, -79.0);
Location candidate3 = new Location(2, 23.0, 29.0);
Location candidate4 = new Location(3, 43.0, -79.0);
Location candidate5 = new Location(4, 43.0, -79.0);
Location[] candidates = {candidate1, candidate2, candidate3, candidate4, candidate5};
SolverContext solver = new SolverContext();
Model model = solver.CreateModel();
model.Name = "LocationModel";
Set items = new Set(Domain.Any, "candidates");
Decision take = new Decision(Domain.Boolean, "candidate", items);
model.AddDecision(take);
Parameter locations = new Parameter(Domain.RealNonnegative, …Run Code Online (Sandbox Code Playgroud) 我正在尝试在VS2010 Ultimate的C#应用程序中使用Microsoft Solver Foundation.我已经安装了MSF(64位版本),据我所知,我应该能够在声明之后使用这些服务:
using Microsoft.SolverFoundation;
Run Code Online (Sandbox Code Playgroud)
但是,我收到错误"类型或命名空间名称'SolverFoundation'在命名空间'Microsoft'中不存在".
我看到Microsoft.Solver.Foundation.dll位于C:\ Program Files(x86)\ Reference Assemblies\Microsoft\Framework.NETFramework\v4.0
最初我认为64位版本可能是问题所以我卸载并切换到32位版本.但也没有成功.
如何将MSF集成到我的C#应用程序中?
我目前正在编写自己的CLR存储过程,我需要使用Microsoft Solver Foundation的解算器.
为了能够在我的CLR项目中添加对Microsft Solver Foundation的引用,我需要将该程序集添加到我的SQL Server实例(源).所以我安装了MS Solver Foundation Redistributable,并使用以下脚本作为服务器管理员在SQL Server中注册它:
USE MYDB
ALTER DATABASE MYDB SET TRUSTWORTHY ON WITH ROLLBACK IMMEDIATE
ALTER DATABASE MYDB SET TRUSTWORTHY ON
CREATE ASSEMBLY MicrosoftSolverFoundation
AUTHORIZATION dbo
FROM 'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Microsoft.Solver.Foundation.dll'
WITH PERMISSION_SET = UNSAFE
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
Assembly 'MicrosoftSolverFoundation' could not be installed because existing policy would keep it from being used.
Run Code Online (Sandbox Code Playgroud)
附加信息
CLR版本:
directory C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
version v4.0.30319
state CLR is initialized
Run Code Online (Sandbox Code Playgroud)
SQL Server版本:
Microsoft SQL Server 2012 (SP1) - …Run Code Online (Sandbox Code Playgroud) 我在下面的代码中得到了一个异常"无法隐式转换类型'Microsoft.SolverFoundation.Services.Term'到'bool'",我该如何解决?
Term a=null;
if(a==null)//<--this line exception
{
}
Run Code Online (Sandbox Code Playgroud)
以下是快照

我正在做一个简单的求解器练习,我正在努力使用Math.Pow.
为什么我不能使用Math.Pow(error1, 2)以下几行?
error1 = error1 * error1;
error2 = error2 * error2;
Run Code Online (Sandbox Code Playgroud)
它给出了一个错误:
错误3参数1:无法从'Microsoft.SolverFoundation.Services.Term'转换为'double'
相关代码:
using Microsoft.SolverFoundation.Common;
using Microsoft.SolverFoundation.Services;
...
private void Form1_Load(object sender, EventArgs e)
{
var solver = SolverContext.GetContext();
var model = solver.CreateModel();
Decision R = new Decision(Domain.Real, "R");
Decision T = new Decision(Domain.Real, "T");
model.AddDecisions(R);
model.AddDecisions(T);
var xr1=5;
var xr2=4;
var xp1 = 6;
var xp2=8;
var error1 = xr1 * R + T - xp1;
var error2 = xr2 * R …Run Code Online (Sandbox Code Playgroud) 我有一个最大化EE + FF的线性优化目标,其中EE和FF各自由一些C和D组成.
用我编写的代码,我可以找到求解器:
EE_quantity: 0, FF_quantity: 7
Run Code Online (Sandbox Code Playgroud)
...但我知道还有另一种解决方案:
EE_quantity: 1, FF_quantity: 6
Run Code Online (Sandbox Code Playgroud)
为了验证其他有效解决方案的用户输入,我为EE和FF添加了约束.所以我EE_quantity == 0, FF_quantity == 7在下面的代码中添加了一个可运行的例子:
SolverContext c2 = SolverContext.GetContext();
Model m2 = c2.CreateModel();
p.elements = elements_multilevel_productmix();
Decision C_quantity = new Decision(Domain.IntegerNonnegative, "C_quantity");
Decision D_quantity = new Decision(Domain.IntegerNonnegative, "D_quantity");
Decision EE_quantity = new Decision(Domain.IntegerNonnegative, "EE_quantity");
Decision FF_quantity = new Decision(Domain.IntegerNonnegative, "FF_quantity");
m2.AddDecisions(C_quantity, D_quantity, EE_quantity, FF_quantity);
m2.AddConstraints("production",
6 * C_quantity + 4 * D_quantity <= 100,
1 * C_quantity + 2 * D_quantity <= 200,
2 …Run Code Online (Sandbox Code Playgroud)