我正在尝试实现一个过程(在this paper的5.1节中进行了介绍。)
给定一个建模为有向无环图(DAG)的计算机网络,我有一些初始节点(例如,攻击者的起点)和一个称为目标节点(终点,攻击者目标)的节点,我可以为这些节点计算出被破坏的可能性(由攻击者)。
一旦有了这个概率,给定一组目标的节点后代,我想在此路径中为一个(或多个)改进节点找到最佳位置,以使目标节点的概率更低(实际上是最小化)。
所有这些都描述为极小极大问题,其中,将内部极大问题的结果(目标被攻击的概率)用于外部极小问题。后者是组合问题。
整个过程都是用Java实现的,但是这里感兴趣的部分是使用GLPK求解器在MathProg中完成的。
提供了第一部分的源代码。描述了第二部分,但是没有可用的代码。因此,我的问题变成:
您能帮我在MathProg(或GLPK的JAVA API)中建模组合最小化问题吗?
有关此问题的详细解释和我的尝试,请参阅此问题的[最小化部分]。
我对MathProg的经验为零,而对优化算法的了解却很少。我很高兴听到有关如何为求解器设置此模型的提示,最好使用MathProg for GLPK和/或将这两个部分集成在一起的Java(非专有)。
在这部分中,由于使用SLP和GLPK解决了一个最大化问题,我获得了最大化的目标节点概率(此问题的多次迭代直到一个固定点,这都是用Java完成的。)
问题描述:
max_prob
f(T,x,y)约束具有某种形式,可以产生您在示例中看到的约束(我们现在可以省略其描述)。
这里是LP建模的MathProg中的一个示例,该示例针对10个节点的图:
var x1<=1;
var x2<=1;
var x3<=1;
var x4<=1;
var x7<=1;
var x8<=1;
var x9<=1;
var x10<=1;
maximize z: x1;
s.t. c1: x1 = x2;
s.t. l1: x1>=0.0001;
s.t. c2: x2=1*x3;
s.t. l2: x2>=0.0001;
s.t. c3: x3 = x4;
s.t. l3: x3>=0.0001;
s.t. c4: x4=0.68*x7;
s.t. l4: x4>=0.0001;
s.t. c7: x7 = x8;
s.t. l7: x7>=0.0001;
s.t. c8: x8=0.64*x9;
s.t. l8: x8>=0.0001;
s.t. c9: x9 = x10;
s.t. l9: x9>=0.0001;
s.t. c10: x10=0.68;
s.t. l10: x10>=0.0001;
Result:
Objective: z = 0.295936 (MAXimum)
最小化包括通过找到位于目标节点后代集合中的一个或多个“改进节点”的组合,来最小化目标节点的折衷概率(在上一部分中已最大化)。
让Na为可改进节点的数目(j_1
问题是:
min_prob
其中x_g是
其中f(x,y)包含T。如果T的第t_j个对应元素为= 1,则“改善”目标节点后代集中的第j个节点,从而目标的节点概率为妥协程度降低了。
从cond开始的放松概括了多项改进。
var x1<=1;
var x2<=1;
var x3<=1;
var x4<=1;
var x7<=1;
var x8<=1;
var x9<=1;
var x10<=1;
var t8 binary;
maximize z: x1;
s.t. c1: x1 = x2;
s.t. l1: x1>=0.0001;
s.t. c2: x2=1*x3;
s.t. l2: x2>=0.0001;
s.t. c3: x3 = x4;
s.t. l3: x3>=0.0001;
s.t. c4: x4=0.68*x7;
s.t. l4: x4>=0.0001;
s.t. c7: x7 = x8;
s.t. l7: x7>=0.0001;
s.t. c8: x8=0.64*x9;
s.t. l8: x8>=0.0001;
s.t. c9: x9 = x10;
s.t. l9: x9>=0.0001;
s.t. c10: x10=0.68;
s.t. l10: x10>=0.0001;
#x8 is an improvable node
#t8 it the t_j_8 element of T
param t8 binary= 1;
#p8 is a given parameter (it reduces the x1 prob. in the end)
param p8 = 0.3;
minimize z2: x1;
#this is the f(T,x,y) constraint: if t8 = 0 the coeff of x8 is reduced by p8, if t8 = 0, nothig happens
s.t. ct8: x8 = (p8**t8)*x8;
#s.t. lt8: x8>=0.0001;
solve;
end;
输出:
错误:
test.m:42:t8没有值
MathProg模型处理错误