问题标签 [pareto-optimality]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
949 浏览

python - Pyomo:多目标优化

我正在使用此代码来解决多目标优化模型(电源调度)并尝试在我的代码中调整一个示例。

示例:https://stackoverflow.com/questions/50742999/multi-objective-optimization-example-pyomo。

我试图跳过“低效的帕累托前沿”部分并直接绘制“有效的帕累托前沿”。

第一个选项卡可以正常运行并生成Cost_min、Cost_max、Emission_min、Emission_max。

运行此选项卡中的代码后,未生成任何错误。但是当输出一个帕累托前沿时,这里只显示一个点。

结果如下所示。不知道为什么这不能输出正确的帕累托图。不知道代码的哪一步错了。

高效的 Pareto-front 谁能帮我处理这段代码?谢谢。维维

0 投票
1 回答
103 浏览

drools - OptaPlanner 是否有“内置”方法来执行多单元分数归一化?

目前,我的问题有四个指标。这些中的每一个都测量完全不同的东西(每个都有不同的单位,不同的范围等),并且每个都在外部加权。我正在使用 Drools 进行评分。

我只有一个分数等级 ( SimpleLongScore),我必须找到一种方法将这些指标的各个分数适当地组合到一个long值上

目前最重要的问题是指标的值范围可能大相径庭。

因此,例如,如果在移动之后,可能范围较小的指标的得分提高了 10%,那么这可能与将较大范围的得分仅提高 1% 的替代移动完全相形见绌,因为OptaPlanner 只考虑实际的分数值,而不是可能的数值范围以及变化如何按比例影响它们(据我所知)。

那么,有没有办法干净地处理这个已经是我找不到的 OptaPlanner 的一部分?

实施帕累托评分是唯一可行的解​​决方案吗?因为这似乎是一场骇人听闻的噩梦。

到目前为止,我有代码/数学来计算我从 Drools 中访问的指标的最佳可能和最差分数,然后我可以计算出在该范围内的移动将我们置于何处,但这也感觉很hack-y如果我们想在该范围内非线性扩展,则会导致增量评分问题。

我一直在思考我应该咬紧牙关并实施帕累托计分。

谢谢!

0 投票
0 回答
23 浏览

game-theory - 多个状态是帕累托最优的

假设我们是一个 2 人游戏,每个人都有 2 个选项。所以有 4 个状态,每个状态都有相同的收益。那么在这种情况下,我们怎么能说所有的状态都是帕累托最优呢?根据我的阅读,帕累托最优要求至少有一个玩家比其他人更喜欢一种结果,而这里的情况并非如此。

| (1,1) | (1,1) |

| (1,1) | (1,1) |

0 投票
1 回答
160 浏览

python - 如何从帕累托前沿获得膝点解决方案

我正在使用 python 包 DEAP 运行 NSGA_II 算法以进行多目标优化。在(目标空间和参数空间)中输出一组帕累托最优解。我的问题是:如何编写一个简单的 python 代码来自动从帕累托前沿获得拐点解决方案。帕累托从大部分是凸的。

0 投票
1 回答
184 浏览

function - Pareto 函数在 Julia 中使用 DataFrames 吗?

你知道我在哪里可以找到 Julia 中 DataFrames 的 max() min() 函数吗?数据框包括 X、Y、Z 坐标。我想找到具有最高 x & y 坐标的点的最大值。或者我应该用“for循环”和“if条件”来做吗?

1.编辑: 例如,我有不同的 X、Y、Z 坐标点,我实际上想找到 X 坐标最高的点。我已经对数据框进行了排序。但是如何找到具有最高 X 和 Y 坐标的点呢?结合......来自数据中的所有其他点。

2.编辑: 帕累托在这种情况下效果很好,也许这是我的错误解释。如何使用该原理使所有粒子围绕圆圈?目标是获得所有相关的粒子--> 封闭的圆,当然它只是一个圆的近似值。到达圆圈的示例条件:

  1. 点:X & Y 最大值
  2. 点:X & Y 最小值
  3. 点:X 最大值和 Y 最大值/2
  4. 点:X 最大值/2 和 Y 最大值
  5. ...

粒子图

谢谢!

0 投票
1 回答
112 浏览

r - 超过四个变量的帕累托最优

我有一个包含多个结果的数据框,每个结果都有五个变量,我想在 R 中进行优化。我使用过rPref,但这最多有 4 个变量需要优化。有谁知道如何用四个以上做到这一点?

0 投票
1 回答
222 浏览

r - ggplot 仅针对属于特定级别的点显示 Pareto Front

正在使用的库

mtcarsR 中的数据集为例。

为了找到帕累托边界和水平值一建立偏好

然后使用 top-all 计算水平值 wrt p

当如下创建可视化时

它将显示带有颜色的 mtcars 的 mpg 和 hp 值的图,每种颜色代表级别(接近最佳值)。如下

在此处输入图像描述

如果要为较低级别的所有点的每个区域绘制帕累托前线,可以运行

这导致

在此处输入图像描述

但是,对于一个人的情况,只有第 1 级是相关的,如何只显示第 1 级的点和特定的帕累托前沿?

更改factor(.level)factor(1)_

给出以下内容,忽略以前的级别,但其中一些不属于 1 级的似乎有特色

在此处输入图像描述

0 投票
0 回答
91 浏览

r - 多目标优化约束问题:R

我有以下代码定义了我想在我的多目标优化问题中使用的两个约束,model1 model2并且model3之前已经可以验证工作。

在以下代码中构建遗传算法多目标函数:

最后是使用 mco 库的优化过程

主要问题是解决方案不遵守指定的约束。对此有什么想法吗?

0 投票
1 回答
67 浏览

algorithm - 帕累托边界(集):算法的顺序

我必须进行一项挑战,该挑战涉及制定算法来计算帕累托(集合)边界。声明基本上是:

给定正方形 [0,1] x [0,1] 中的 n 个点的集合 S,用算法确定 S 中包含的由 S 的非支配点组成的子集 P。

也有人说,很容易详细说明实现此目的的n*n点比较算法。好吧,我通过到处研究提出了一个算法。挑战仍然是实现n*log(n)阶的算法。我如何获得这些算法的顺序?

提前致谢!

在此处输入图像描述

0 投票
0 回答
53 浏览

algorithm - 找到帕累托边界的具体分治算法的参考实现

给定任何部分可排序元素的集合,可以将所述集合的最大值作为不小于集合中任何其他元素的所有元素。当这个集合是一组 n 维向量时会发生一种特殊情况(在 Rust 中,我们可以有类似(D1,D2,D3,...,Dn)n 维向量的类型并且Vec<(D1,D2,D3,...,Dn)>可以是 n 维向量集合的类型),其中每个维度Di是完全有序的,偏序定义为(a1,a2,a3,...,an)<=(b1,b2,b3,...,bn)iff (a1<=b1) && (a2<=b2) && (a3<=b3) && ... && (an<=bn)。在这种情况下,最大值在多个领域中是众所周知的,因为如果维度被解释为要优化的目标,它就是帕累托边界,如果维度被解释为表的列,它就是天际线查询的结果。

Bentley80和其他几篇论文中,描述了一种找到该最大值的有效算法。这是我目前对其外观的理解(所以请阅读原始描述,因为这个描述来自一个实际上并不知道它是如何工作的人!):


参数:向量的集合V:Vec<(D1,D2,D3,...,Dn)> where D1,D2,D3,...,Dn:Ord,按其第一个维度D1和多个n>=3维度排序。

结果:一个集合M恰好具有 的最大值V

脚步:

  1. 如果集合只包含一个向量或者是空的,我们就完成了;M=V. 否则,继续执行步骤 2。
  2. 选择 cross 的中值,并将集合分成两半,其中分量小于中值的V所有向量在 中,其他向量在 中。DnDnV1V2
  3. 递归计算 和 的最大值,V1分别V2得到M1M2
  4. 如果,则沿n == 3迭代,从具有最大分量的向量开始,以最小分量结束。对于本次迭代中的每个向量,如果是 in ,则将其放入,如果它是最大的,则记录其分量。否则,在; 如果它的分量不小于对向量观察到的记录,则将其放入。迭代完成后,我们也完成了;结果是。M_1.append(M_2)D1D1vvM2MD2vM1MD2M1M
  5. 如果n > 3,则递归计算 的最大值M1.append(M2),但将其n - 1作为考虑的最大维度,并跟踪哪些向量在 中,哪些向量在M1M2

不幸的是,我自己无法实现它。所以我问 StackOverflow:有人可以提供一个简单、可理解的算法实现吗?不需要特定的编程语言,实际上伪代码在这种情况下可能是最明确的选择,但我必须要求不要省略细节。在我看来,像 C 或 Rust 这样的系统语言会对此有所帮助。

当然,我自己(在 Rust 中)也尝试过这样做,但有几件事让我感到困惑:

  • 一个。您如何Dn有效地将收藏品分成两半?Rust 在其标准库中有一种查找中位数的方法,但它是不稳定的(在排序意义上),我们不能直接使用它,因为我们需要保留D1顺序。无论如何都可以浪费一堆空间/分配来做它(克隆集合,在克隆上调用标准库方法并找到中值,然后迭代原始向量,将Dn分量小于中值的元素推入V1和更大进入V2),但我想知道是否有更好的方法。
  • 湾。重复的元素很棘手。在两个地方,特别是:在第 2 步中,如果中位数有很多重复,人们会想知道是否需要特别注意将它们放在哪里(非中位数元素的数量重要吗?),这甚至可以退化为所有元素都等于中位数的情况,这意味着需要一个特殊的步骤来在发生这种情况时简单地跳过该维度。在第 4 步中,可以同时存在许多具有相同分量D1的向量。我认为在这种情况下需要做的是算法必须遍历具有该组件的所有元素,跟踪向量达到的最高记录,然后才决定是否有M1M2D1M2M1向量进行切割。
  • C。您可能已经注意到,第 5 步提到了跟踪哪些向量来自M1和哪些来自M2,但没有其他步骤使用此信息。事实证明我也不知道发生了什么。我的意思是,我读过这篇论文,我“明白了”;因为M2向量具有Dn比任何M1向量严格更大的分量,这意味着,在递归调用中,否则我们只考虑n - 1维度,我们还必须跟踪向量的来源,以便每当v2 <= v1v1v2视为-n - 1维向量,但v2来自M2v1来自M1,我们知道这样说v1v2实际上是无法比拟的。但是我们不直接在算法中比较向量!实际比较(D2向量的分量之间)在步骤 4 中完成,此时我们与其他维度相去甚远,我不知道如何将来自它们的信息整合到步骤中。我最好的猜测是用一个额外的位向量来“增强”每个向量,每个维度一个位,这样在每个降维递归之前,一个通过 and 中的每个向量M1M2翻转适当的位,但是然后呢?在第 4 步的迭代部分,我认为您必须跟踪整个D_2记录向量?在这一点上,我基本上停止了自己的尝试。