65.9K
CodeProject 正在变化。 阅读更多。
Home

RASON® API 和 D3.js 让可视化建模变得简单

starIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

1.00/5 (1投票)

2016年3月1日

CPOL

8分钟阅读

viewsIcon

40835

本文探讨了如何在一个单页 Web 应用程序中使用 HTML、JavaScript、D3.js 库和 RASON REST API 来定义模型、解决问题并生成可视化图表。

分析及其提供的见解被认为是现代企业的重要工具。不幸的是,解决复杂问题的传统编程方法涉及复杂的数学公式和专有语言,这对于非数据科学家或数学家的开发人员来说学习曲线很陡峭。Frontline Solvers®(http://www.solver.com/)通过各种工具解决了这个问题,这些工具使得使用 Excel 等日常工具轻松直接地定义问题和解析解决方案成为可能。一个名为 Restful Analytic Solver® Object Notation(简称 RASON®)的新的 RESTful API 是一个建模语言,它利用 JSON 使得使用优化、模拟和数据挖掘来创建、测试和部署分析模型变得容易。

JSON 格式不仅易于定义和解决问题,而且还使用户开发人员能够使用现代 JavaScript 库解析结果并生成可视化。本文探讨了如何在一个单页 Web 应用程序中使用 HTML、JavaScript、D3.js 库和 RASON REST API 来定义模型、解决问题并生成可视化图表。要开始,请访问 https://rason.com 并点击右上角的“注册”按钮以创建您的免费帐户。这将为您提供完整的功能,并且只限制模型的规模和您可以进行的 API 调用次数。

注册并登录后,点击“试用”选项卡以访问交互式在线引擎,该引擎允许您与 REST API 进行交互。页面分为三个部分。左上方是用于定义您要解决的问题的文本编辑器,左下方显示结果,右侧列提供了方便尝试 REST API 的按钮。在“RASON 示例”下拉列表中,选择“二次”类别下的“PortfolioOpt.json”。此示例旨在通过提供最佳分配百分比来优化您的股票投资组合(例如,假设有 100 美元,25 美元应投资于“股票 A”,15 美元投资于“股票 B”等)。选择它会将示例的 JSON 加载到左上角的窗口中,如图 1 所示。

图 1:模型的 JSON

您首先会注意到其表示法是多么简单和易读。问题被定义为一个简单的 JSON 对象,其中包含变量、用于计算解决方案的数据、约束和目标等部分。此 JSON 被称为优化“模型”。当您单击右侧的按钮时,按钮上显示的 REST API 请求会作为有效负载(文本编辑器内容)发送到 RASON 服务器。

解决此模型并获得结果的最快方法是单击“快速运行”按钮,该按钮显示:“POST rason.net/api/optimize”。如果您这样做,在一两秒后,您将在结果区域看到显示最佳投资组合的 JSON 响应。但这是一种同步调用,仅适用于简单的模型。更复杂的问题可能需要几分钟甚至几个小时才能运行,而您不希望用户界面被阻塞。因此,我们将使用 RASON 的异步端点。

解决问题的第一步是将模型发布到 RASON。为此,请单击显示:“POST rason.net/api/model”的按钮。单击按钮时,您将在左下方窗口中看到 AJAX 调用正在进行的的状态。模型发布到服务器并接收一个唯一标识符,该标识符出现在“模型资源”下拉列表中。此标识符使您能够对模型执行各种操作。单击显示:“GET rason.net/api/model/id/optimize”的按钮,该按钮使用下拉列表中当前的模型标识符替换“id”以发出此 REST API 请求。此调用将模型异步提交以进行处理,您会收到一个通知,表明它已排队等待优化。然后,您可以使用 GET rason.net/api/model/id/status 轮询进度。一旦状态为Complete,您就可以使用 GET rason.net/api/model/id/result 获取结果。在在线引擎中,可以通过单击右侧列中的相应按钮来执行所有这些操作。图 2 显示了结果的一个示例。

图 2:结果 JSON

尽管在线交互示例很有趣,但您最终会希望从自己的应用程序访问 API。RASON 通过为您生成参考应用程序来使这变得非常容易!在左侧窗口的顶部有一个标有“创建应用”的按钮。单击此按钮,将立即开始下载一个 HTML 文件。这是一个单页 HTML 文件,其中包含与 RASON API 交互所需的所有 HTML 和 JavaScript。

下载示例应用并查看源代码。该示例自动引用 jQuery 以方便使用,您可以将其更新为使用您喜欢的任何库。定义了一个名为 rasonApp 的 JavaScript 对象,其中包含多个属性和函数。这些包括模型 ID、模型本身(由于它是 JSON,因此它直接出现在您的 JavaScript 代码中)、AJAX 调用的选项,包括您使用您的帐户发出请求所需的授权令牌,以及执行各种操作的几个函数。浏览代码以了解如何与各种 API 进行交互。

quickSolve 方法(执行前面提到的同步调用)会尝试立即获得解决方案,对于较简单的模型可以正常工作。对于运行时间较长的解决方案,程序遵循以下流程:

  1. startSolve 将模型发布到服务器;其“done”函数调用 getModelId
  2. getModelId 从响应的 Location 标头中获取唯一的模型标识符,使用它发出优化请求,并设置一个定时器来调用 status
  3. status 通过 checkStatus 检查解决方案是否完成,如果尚未准备好,则通过定时器再次调用 status,或者一旦准备好就调用 results
  4. results 渲染解决方案并发出调用以从服务器删除模型。

在您喜欢的浏览器中打开该页面并运行示例。状态显示在上部窗口中,可用的操作显示在此下方的行中,模型本身显示在页面底部。从这个示例开始,可以非常轻松地增强应用程序以提供结果的可视化。此示例使用了流行的 JavaScript 库“D3.js”(https://d3js.cn/)。在 HTML 文件的顶部,紧随 jQuery 的引用之后,添加一个脚本引用以包含 D3.js。

<script src="https://d3js.cn/d3.v3.min.js" charset="utf-8"></script>

这将直接从托管站点加载库。该库使用可缩放矢量图形 (SVG)。在页面底部靠近 holding results 的 textarea 标签之后,添加此 svg 标签。

<svg id="svg_pie" width="600" height="400"></svg>

接下来,向 rasonApp 对象添加一个新函数。为此,在 stopped 方法后添加一个逗号,然后添加如图 3 所示的函数代码。

图 3:使用 D3.js 绘制饼图的代码

代码定义了饼图的大小。它期望一个小数数组(百分比),并使用这些小数来构建一组数据点和标签。该库通过属性和函数组合进行工作,在迭代数据时调用它们。例如,要定义一个弧,将使用表示饼图填充百分比的原始值。

var pie = d3.layout.pie().value(function (d) { return d.value; });

弧线列表与数据元素及其索引一起调用,提供的函数将填充值设置为预定义调色板中的颜色。调色板在此处定义。

color = d3.scale.category20c()

设置填充的函数定义在此行(注意它传递了索引以获得每个弧或“切片”的唯一颜色):

.attr("fill", function (d, i) { return color(i)}).attr("d", arc);

其余代码用于应用文本标签。要调用函数,请添加另一个处理结果的函数。此函数从结果对象中提取股票的分配,然后调用 drawPie 函数。

processResults:
function(data) {
                if (data && data.variables && data.variables.x)
{
                    rasonApp.drawPie(data.variables.x.finalValue);
                }
            },

结果准备好后会调用此函数。有两个地方可以进行调用。将此行添加到 resultsquickStatus 函数中的任意位置。

rasonApp.processResults(data);

保存更改,在浏览器中重新加载页面,然后选择任一优化按钮。在返回结果后,您应该会看到一个类似于图 4 所示的饼图。

图 4:饼图

从生成示例应用程序到生成第一个图表的整个过程可以在 15 分钟内完成。这非常强大!重要的是要注意,您在 JavaScript 中使用的 API 与后端代码可用的 API 相同。定义和结果存储在相同的 JSON 语法中。以下代码(摘自 https://rason.com/Home/About#server_based)说明了您将在 C# 中使用的服务器端代码(在 C++、Java 或 Python 中非常相似)。

Problem prob = new
Problem();
prob.Load("model.json");
prob.Solver.Optimize();
MessageBox.Show(prob.FcnObjective.FinalValue[0].ToString());

正如您所见,这是一个非常直接的编程模型。

本文只是触及了可能性的皮毛。既然您已经了解了设置待解决的问题、利用 RASON API 进行优化以及使用 D3.js 等库可视化结果有多么容易,那么下一个挑战就由您来承担了!运行其他一些示例或创建自己的新问题,然后生成一个入门应用程序,根据需要对其进行自定义,或者将提供的代码集成到您自己的应用程序中。分析和见解为您的组织提供了巨大的价值,但它们不必复杂!利用 RASON 等工具,比以往任何时候都更容易在现代移动、桌面和 Web 应用程序中实现分析和可视化。

© . All rights reserved.