用python3.7调用cplex12.9解决一个简单的tsp问题报错CPLEX Error 1217: No solution exists.
大家好,本人最近做了一个**四城市的TSP问题**练手。问题像下面
城市之间是**双连通**的。
解决问题的模型为(MTZ模型):
目标函数和约束条件我应该是都定义对了,但是最后有**No solution exists**错误。请大神么赐教。
下面是代码
第一次问问题。如果问的有不恰当的地方请大佬们包含
"""
1.这次解决的是四城市数量的旅行商问题
2.使用线性规划模型
3.调用cplex包
"""
import cplex
from cplex.exceptions import CplexError
# 将城市节点数量与他们之间的距离表示出来
number = 4
nodes = 3
my_obj = [0, 2, 5, 7, 2, 0, 3, 8, 5, 3, 0, 10, 7, 8, 10, 0, 0, 0, 0, 0]
# 变量的名称
b_var = ["x11", "x12", "x13", "x14", "x21", "x22", "x23", "x24", "x31", "x32", "x33", "x34",
"x41", "x42", "x43", "x44"]
b_var_ind_format = [["x11", "x12", "x13", "x14"], ["x21", "x22", "x23", "x24"], ["x31", "x32", "x33", "x34"],
["x41", "x42", "x43", "x44"]]
c_var = ["u1", "u2", "u3", "u4"]
my_sense_b = "E" * 12 # 限流变量约束条件类型定义
my_sense_c = "L" * 12 # 连续变量约束条件类型定义
my_rownames_b = ["r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"] # 约束条件的名称
my_rownames_c = []
list_c = [] # 存储约束条件中变量和他们系数的小列表
rows_c = []
# 下面是一个构建连续变量约束条件系数矩阵的循环程序
k = 0
for i in range(4):
for j in range(4):
if i != j:
list_c.append([c_var[i], c_var[j], b_var_ind_format[i][j]])
# 上面是完成了一个变量的小组合
list_c.append([1, -1, number])
rows_c.append([list_c[k], list_c[k + 1]])
k += 2
rhs_n = len(rows_c)
# print(rhs_n)
print("定义连续变量的约束条件矩阵为:",rows_c)
# rhs = [float(nodes)] * int(rhs_n)
# print(len(rhs)),这些都是找错误用的
# 下面构建连续约束条件的名字大概就是c1,c2,c3这么个意思
for i in range(int(rhs_n)):
my_rownames_c.append("c" + str(i + 1))
def tsp_method(prob):
"""
:param prob:代表建立起的cplex实例
:return: 无返回值
实现变量的添加,设置好约束条件了。针对旅行商问题我们设置的变量为0-1变量,约束条件为MZT模型
"""
prob.objective.set_sense(prob.objective.sense.minimize) # 目标函数的意义
prob.variables.add(names=b_var + c_var, types="B" * 16 + "C" * 4, obj=my_obj) # 定义变量名,定义0-1类型,定义目标函数系数
# prob.variables.add(names=c_var, types="C" * 4) # 定义连续变量,消除子环
rows = [[["x21", "x31", "x41"], [1.0, 1.0, 1.0]],
[["x12", "x32", "x42"], [1.0, 1.0, 1.0]],
[["x13", "x23", "x43"], [1.0, 1.0, 1.0]],
[["x14", "x24", "x34"], [1.0, 1.0, 1.0]],
[["x12", "x13", "x14"], [1.0, 1.0, 1.0]],
[["x21", "x23", "x24"], [1.0, 1.0, 1.0]],
[["x31", "x32", "x34"], [1.0, 1.0, 1.0]],
[["x41", "x42", "x43"], [1.0, 1.0, 1.0]],
[["x11"], [1.0]],
[["x22"], [1.0]],
[["x33"], [1.0]],
[["x44"], [1.0]]] # 这个是定义限制流量的约束条件的系数
rhs = [float(nodes)] * int(rhs_n)
prob.linear_constraints.add(lin_expr=rows + rows_c, senses=my_sense_b + my_sense_c,
rhs=[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0] + rhs,
names=my_rownames_b + my_rownames_c) # 建立好约束条件
# prob.linear_constraints.add(lin_expr=rows_c, senses=my_sense_c,
# rhs=[float(nodes)] * int(rhs_n),
# names=my_rownames_c)
my_prob = cplex.Cplex()
handle = tsp_method(my_prob)
my_prob.solve()
# solution.get_status() returns an integer code
print("Solution status = ", my_prob.solution.get_status(), ":", end='')
# the following line prints the corresponding string
print(my_prob.solution.status[my_prob.solution.get_status()])
# print("Solution value = ", my_prob.solution.get_objective_value()) # 这个函数是返回目标函数值
numcols = my_prob.variables.get_num()
numrows = my_prob.linear_constraints.get_num()
x = my_prob.solution.get_values()
print("x: ")
print(x)
下面是**错误信息**:
CPLEX Error 1217: No solution exists.
Traceback (most recent call last):
File "E:/software_location/pycharm_2020.2/pycharm2020.2/ran/TSP.py", line 102, in
x = my_prob.solution.get_values()
File "E:\software_location\pycharm_2020.2\pycharm2020.2\ran\cplex_internal_subinterfaces.py", line 7612, in get_values
getx, self._cplex.variables._conv, args)
File "E:\software_location\pycharm_2020.2\pycharm2020.2\ran\cplex_internal_aux_functions.py", line 148, in apply_freeform_two_args
return fn(0)
File "E:\software_location\pycharm_2020.2\pycharm2020.2\ran\cplex_internal_subinterfaces.py", line 7610, in getx
return CPX_PROC.getx(self._env._e, self._cplex._lp, a, b)
File "E:\software_location\pycharm_2020.2\pycharm2020.2\ran\cplex_internal_procedural.py", line 2043, in getx
check_status(env, status)
File "E:\software_location\pycharm_2020.2\pycharm2020.2\ran\cplex_internal_procedural.py", line 303, in call
raise CplexSolverError(error_string, env, status)
cplex.exceptions.errors.CplexSolverError: CPLEX Error 1217: No solution exists.
Process finished with exit code 1
- 点赞
- 写回答
- 关注问题
- 收藏
- 复制链接分享
- 邀请回答
为你推荐
- 如何用python调用cplex?
- python
- 32个回答
- Model.ExportModel("SCM.LP")什么意思
- cplex
- c#
- 1个回答
- c#调用cplex中的问题,scalprod是什么意思怎么用
- cplex
- c#
- 1个回答
- c#调用cplex求解时INumVar[][]var=new INumVar[1][]
- cplex
- c#
- 1个回答
- 请教大神这个程序为什么运行时无输出?
- c
- printf
- 4个回答
- 分段函数的单一函数数学近似
- 逼近
- 数学
- 分段
- 2个回答
- 用包含变量x的一个表达式实现:x>0时结果为1,x=0结果为0,不要条件判断
- 表达式
- 变量
- 条件判断
- 22个回答