cplex - 为什么我的代数表达式没有给出错误并且没有在决策变量中获得值?
问题描述
我目前正致力于在旨在处理关键信息的通信基础设施中实施 SLRG(共享风险链接组)。为此,我正在实施最小成本 SRLG 多样化路由问题算法。算法如下:
最小c*(x1+x2)
这样
A*xi=u, i=1,2 (1)
H*xi <= 41*zi, i=1,2 (2)
z1+z2 <=1 (3)
A是一个30x41的矩阵;
xi是一个决策变量和一个41x1向量;
H是一个2x41矩阵;
z是一个决策变量和一个2x1向量;
c是一个41x1向量;
u是一个30x1向量。
所有变量都是二元的,包括决策变量
我所做的基本上是尝试实现编译良好的代码,但最终决策变量没有任何价值。
dvar boolean x1[1..41]; //decision variable of path 1
dvar boolean x2[1..41]; //decision variable of path 2
dvar boolean z1[1..2]; //risk path 1
dvar boolean z2[1..2]; //risk path 2
int A[1..30][1..41] =...; //incidence matrix
int u[1..30]=...; //source and destiny nodes
int H[1..2][1..41] =...; //risk links
int c[1..41] =...; // cost
dexpr int total = sum (p in 1..41) (x1[p]+x2[p]); //x1+x2
int cs = sum (p in 1..41) c[p]; // c
minimize (cs * (total) ); // c*(x1+x2)
subject to {
forall (i in 1..30)
sum (j in 1..41)
A[i][j]*x1[j] == u[i]; //A*x1=u
forall (i in 1..30)
sum (j in 1..41)
A[i][j]*x2[j] == u[i]; //A*x2=u
forall (i in 1..2)
sum (j in 1..41)
H[i][j]*x1[j] - 41*z1[i] <= 0; //H*x1=41*z1
forall (i in 1..2)
sum (j in 1..41)
H[i][j]*x2[j] - 41*z2[i] <= 0; //H*x2=41*z2
forall (i in 1..2)
z1[i]+z2[i] <= 1; //z1+z2<=1
}
我预计决策变量为 0 和 1,显示正确的路线,但输出为“无值”
谢谢你。
引擎日志
Warning: Non-integral bounds for integer variables rounded.
Row 'c1' infeasible, all entries at implied bounds.
Presolve time = 0,00 sec. (0,04 ticks)
Root node processing (before b&c):
Real time = 0,00 sec. (0,07 ticks)
Parallel b&c, 4 threads:
Real time = 0,00 sec. (0,00 ticks)
Sync time (average) = 0,00 sec.
Wait time (average) = 0,00 sec.
Total (root+branch&cut) = 0,00 sec. (0,07 ticks)
解决方案
一个可能的线索在输出行: Row 'c1' infeasible 告诉你你的模型是不可行的。因此,CPLEX 无法为您的决策变量找到值也就不足为奇了。尝试找出您的模型在哪里/为什么不可行。
推荐阅读
- javascript - 将状态列表下拉 HTML 链接到特定页面
- verilog - 案例变量是否应该以原子方式递增?
- swift - 使用 swift 使 DispatchQueue 异步崩溃
- javascript - 如何根据值更改@html 对象属性
- python - 如何将串行数据从数字倾角仪转换为 Python 中的可读格式?
- jmeter - 在另一个测试计划中引用在 Jmeter 中有一组采样器的线程组?
- ms-access - 访问来自不同行的合并文本
- javascript - 从文件中读取 Int 值,全部在一行中
- python - 从键列表中获取字典的值
- android - Android 资源链接失败:id/null