当前位置: 首页 > 知识库问答 >
问题:

AMPL中的不可能推导上界

饶滨海
2023-03-14

我打算进行一个优化,在这个优化中,我希望最大化系统中的流量,使其受到一些时间约束和一些“必须满足这些路线”约束。第一个时间限制规定,每辆车不得超过24小时的工作负荷(以分钟表示)。第二个时间约束是次行程消除约束,该约束还规定,在车辆有时间行驶之前,无法激活“访问”节点的开始时间等。约束3描述了K1和N1之间的道路必须使用不超过9次,使用任一车辆k。最后一个约束规定,特定节点的所有车辆必须在一天结束时返回。

 maximize maxamount: sum{i in V, j in V, k in K} x[i,j,k];

 subject to TimeConstraint {k in K}: 
     sum{i in V, j in V} traveltime[i,j]*x[i,j,k] <= 1440; 

 subject to StartTime{i in V,j in V, k in K}:
     starttime[i] + servicetime[i] +traveltime[i,j] - 1300 * (1 - x[i,j,k]) <= starttime[j];

 subject to Constraint3:
     sum{k in K} x["K1","N1",k] <= 9;

 subject to EndNode{k in K}: 
     sum{i in V}x[i,"K1",k] - sum{j in V} x["K1",j,k]= 0;

Constraint3和EndNode具有多个相同类型的约束(仅限于其他“预定义位置”,例如K1和N2之间的道路不能超过4次访问等)。

我的问题是,我得到了错误的不可能推断边界x[K1,K1,1]的下界=0,上界=-76,我知道这是由冲突的约束引起的。然而,我的问题是:如何?几乎完全使用二进制变量,我看不出上面的代码为什么不起作用。我是否误解了我在模型中实际做的事情?

我注意到编译器只在I=j时才会抱怨,所以我检查了我的。dat文件,并注意到当i=j时,i和j之间的旅行时间非常大(因此程序不会选择这些路线)。然而,编辑它。dat文件不再自动超出时间约束限制,仍然会给我同样的错误(虽然更小,但现在上限是-1,而不是-76)。

我希望有人能解释一下

提前感谢坚德泽

共有1个答案

云慈
2023-03-14

当i=j时,i和j之间的旅行时间非常大(因此程序不会选择这些路线)

如果行程时间[i,j]=M(非常大),则i=j的开始时间

servicetime[i] + M - 1300 * (1 - x[i,j,k]) <= 0     <=>
1300 * x[i,j,k] <= 1300 - servicetime[i] - M

因此,无论何时

我建议用I为所有对定义(I,j)变量

从评论中跟进

插入AMPL联机编辑器后,以下代码段运行良好:

param n := 10;
set N:= 1..n;
set V := {i in N, j in N: i <> j};
display V;

输出:

set V :=
(1,2)    (2,3)    (3,4)    (4,5)    (5,6)    (6,7)    (7,8)    (8,9)    (9,10)
(1,3)    (2,4)    (3,5)    (4,6)    (5,7)    (6,8)    (7,9)    (8,10)   (10,1)
(1,4)    (2,5)    (3,6)    (4,7)    (5,8)    (6,9)    (7,10)   (9,1)    (10,2)
(1,5)    (2,6)    (3,7)    (4,8)    (5,9)    (6,10)   (8,1)    (9,2)    (10,3)
(1,6)    (2,7)    (3,8)    (4,9)    (5,10)   (7,1)    (8,2)    (9,3)    (10,4)
(1,7)    (2,8)    (3,9)    (4,10)   (6,1)    (7,2)    (8,3)    (9,4)    (10,5)
(1,8)    (2,9)    (3,10)   (5,1)    (6,2)    (7,3)    (8,4)    (9,5)    (10,6)
(1,9)    (2,10)   (4,1)    (5,2)    (6,3)    (7,4)    (8,5)    (9,6)    (10,7)
(1,10)   (3,1)    (4,2)    (5,3)    (6,4)    (7,5)    (8,6)    (9,7)    (10,8)
(2,1)    (3,2)    (4,3)    (5,4)    (6,5)    (7,6)    (8,7)    (9,8)    (10,9);
== 1 ==========================

将您的片段更改为

set N = {'K1', 'K2','K3','K4'};
set V := {i in N, j in N: i != j};
display V

试一试。我得到:

set V :=
(K1,K2)   (K1,K4)   (K2,K3)   (K3,K1)   (K3,K4)   (K4,K2)
(K1,K3)   (K2,K1)   (K2,K4)   (K3,K2)   (K4,K1)   (K4,K3);
== 1 ==========================

我希望这有帮助!

 类似资料:
  • null 我使用的是Protege 5.0.0、Reasoner Hermit 1.3.8和OWL API 5.0.5(尽管不同的Reasoner获得了相同的结果:Fact++、Pellet;以及不同的OWL API和Protege版本:4.x) 我会很高兴有任何评论,即使是一个简单的解释也会对我有很大帮助。

  • 问题内容: 什么会导致套接字命令出错?套接字设置为。它在大多数时间都有效,但偶尔会出现此错误。插槽的接收端似乎工作正常。 我知道这不是很详细,但我只是在寻找一般想法。谢谢! 问题答案: 是与相对应的错误消息,这意味着该操作将被阻止,但请求了非阻止操作。对于,这可能是由于以下原因之一: 显式地将文件描述符标记为非阻塞;要么 将旗帜传递给; 要么 使用套接字选项设置发送超时。

  • 我一直在尝试编写一个程序来实现任意域上的多项式,一种数学结构。我选择了Haskell作为编程语言,我使用了语言扩展。但是,我不明白为什么GHCi不能推导出的约束条件。 在我看来,保证是的实例,这意味着是的实例。所以调用就像调用一样,应该是合理的。此外,我已经编写了作为约束,并且的构造函数具有的形状,因此它还应该知道的类型是的实例。 显然,译员的想法不同。我哪里搞错了?

  • 如果需要生成一个长度为 3、内容为 0 的列表,可以使用如下的代码来完成这项任务: list = [0, 0, 0] 如果需要生成一个长度为 100、内容为 0 的列表,使用如上的方式完成,需要在括号中书写 100 个 0,既繁琐又容易出错,显然是不合适的。可以使用动态的方式完成这项任务: list = [] for i in range(100): list.append(0) 在第

  • 本文向大家介绍php在linux中可能用到的命令(推荐),包括了php在linux中可能用到的命令(推荐)的使用技巧和注意事项,需要的朋友参考一下 如下所示: php -i | grep php.ini    查找php.ini的位置 php-cgi -b 127.0.0.1:9000 &  查看php-cgi进程 以上这篇php在linux中可能用到的命令(推荐)就是小编分享给大家的全部内容了,

  • 我无法推到音频列表。重要提示:我不想将listOf更改为mutableListOf 虽然音频不是空的,但这不起作用。当我记录音频时,它给了我一个有数据的类,所以这不是问题所在。