gpt4 book ai didi

algorithm - 基于多约束算法找到最优值

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:56:32 26 4
gpt4 key购买 nike

我有以下向量(或 C 矩阵和 V 向量)和 K1、K2、K3 常量

Constraints      [c11 + c12 + c13 + ... + c1n] <= K1
[c21 + c22 + c23 + ... + c2n] <= K2
[c31 + c32 + c33 + ... + c3n] <= K3
-------------------------------------------------
Values [ v1 + v2 + v3 + ... + vn] -> Max

作为输入,我得到 C 和 V 的值,作为输出,我想提供 X 向量,它只包含 0 和 1 值, 给我

          [c11 * x1 + c12 * x2 + c13 * x3 + ... + c1n * xn <= K1
[c21 * x1 + c22 * x2 + c23 * x3 + ... + c2n * xn <= K2
[c31 * x1 + c32 * x2 + c33 * x3 + ... + c3n * xn <= K3
------------------------------------------------------
[ v1 * x1 + v2 * x2 + v3 * x3 + ... + vn * xn] -> Max

作为一个过度简化的例子:

输入:

          K1 = 15
K2 = 20
K3 = 10

c1 = [3, 6, 8] | sum(c1 * X) <= 15
c2 = [8, 9, 3] | sum(c2 * X) <= 20
c3 = [7, 5, 2] | sum(c3 * x) <= 10
v = [2, 5, 3] | sum( v * X) -> Max

提供 X 向量的输出,该向量最大化约束内的值:

           X = [0, 1, 1]

我正在寻找一种优雅的算法(也可以是 Java 或 C# 实现)根据输入提供输出。我们可以假设约束的数量始终为 3,并且提供了 C 和 V(以及 K1、K2、K3)的所有值。


另一个简单的例子可能是:你有一个房间(3D),所以你的约束是房间的宽度高度长度房间(K1K2K3)并且您有一个家具项目列表(n 项目)。所有 i 件家具都有自己的长度 (c1i)、宽度 (c2i) 和高度 (c3i) 和值 (vi)。您想要用最有值(value)的家具来装点房间,这些家具适合房间的尺寸。所以输出是一个 n 长的 X 变量,它只包含 0 和 1 值,如果 xi = 1,第 i 个元素被选为在房间里,如果 xi = 0 则第 i 个元素不会被选为在房间里。

最佳答案

这是多维 0-1 背包问题,它是 NP 难的。

可以找到解决方法的概述here ,一篇相对较新的研究论文 herepython 中的遗传算法实现 here .

取自 python 实现(上面的链接 pyeasyga)是这个例子:

from pyeasyga import pyeasyga

# setup data
data = [(821, 0.8, 118), (1144, 1, 322), (634, 0.7, 166), (701, 0.9, 195),
(291, 0.9, 100), (1702, 0.8, 142), (1633, 0.7, 100), (1086, 0.6, 145),
(124, 0.6, 100), (718, 0.9, 208), (976, 0.6, 100), (1438, 0.7, 312),
(910, 1, 198), (148, 0.7, 171), (1636, 0.9, 117), (237, 0.6, 100),
(771, 0.9, 329), (604, 0.6, 391), (1078, 0.6, 100), (640, 0.8, 120),
(1510, 1, 188), (741, 0.6, 271), (1358, 0.9, 334), (1682, 0.7, 153),
(993, 0.7, 130), (99, 0.7, 100), (1068, 0.8, 154), (1669, 1, 289)]

ga = pyeasyga.GeneticAlgorithm(data) # initialise the GA with data
ga.population_size = 200 # increase population size to 200 (default value is 50)

# define a fitness function
def fitness(individual, data):
weight, volume, price = 0, 0, 0
for (selected, item) in zip(individual, data):
if selected:
weight += item[0]
volume += item[1]
price += item[2]
if weight > 12210 or volume > 12:
price = 0
return price

ga.fitness_function = fitness # set the GA's fitness function
ga.run() # run the GA
print ga.best_individual() # print the GA's best solution

data 的最后一个维度是价格,另外两个维度是重量和体积。

您可以调整此示例,使其解决二维以上的问题。

希望对您有所帮助。

编辑:一般而言,遗传算法不能保证找到最优解。对于三个约束,它可能会找到好的解决方案,但不能保证最优。


更新:数学优化解决方案

另一种选择是使用 PuLP ,一个用于数学优化问题的开源建模框架。该框架调用求解器,即专门设计用于解决优化问题的软件。简而言之,框架的工作是将数学问题描述与解决问题时需要的形式联系起来,求解器的工作是实际解决问题。

您可以使用例如 pip (pip install pulp) 安装 pulp。

这是前面在 pulp 中建模的示例,通过修改 this示例:

import pulp as plp

# Let's keep the same data
data = [(821, 0.8, 118), (1144, 1, 322), (634, 0.7, 166), (701, 0.9, 195),
(291, 0.9, 100), (1702, 0.8, 142), (1633, 0.7, 100), (1086, 0.6, 145),
(124, 0.6, 100), (718, 0.9, 208), (976, 0.6, 100), (1438, 0.7, 312),
(910, 1, 198), (148, 0.7, 171), (1636, 0.9, 117), (237, 0.6, 100),
(771, 0.9, 329), (604, 0.6, 391), (1078, 0.6, 100), (640, 0.8, 120),
(1510, 1, 188), (741, 0.6, 271), (1358, 0.9, 334), (1682, 0.7, 153),
(993, 0.7, 130), (99, 0.7, 100), (1068, 0.8, 154), (1669, 1, 289)]

w_cap, v_cap = 12210, 12

rng_items = xrange(len(data))

# Restructure the data in dictionaries
items = ['item_{}'.format(i) for i in rng_items]
weight = {items[i]: data[i][0] for i in rng_items}
volume = {items[i]: data[i][1] for i in rng_items}
price = {items[i]: data[i][2] for i in rng_items}

# Make the problem, declare it as a maximization problem
problem_name = "3D Knapsack"
prob = plp.LpProblem(problem_name, plp.LpMaximize)

# Define the variables
plp_vars = plp.LpVariable.dicts('', items, 0, 1, plp.LpInteger)

# Objective function
prob += plp.lpSum([price[i]*plp_vars[i] for i in plp_vars])

# Constraints
prob += plp.lpSum([weight[i]*plp_vars[i] for i in plp_vars]) <= w_cap
prob += plp.lpSum([volume[i]*plp_vars[i] for i in plp_vars]) <= v_cap

# Solution
prob.solve()

# If you want to save the problem formulation in a file
# prob.writeLP(problem_name + 'lp')

# Each of the variables is printed with it's resolved optimum value
for v in prob.variables():
print v.name, "=", v.varValue

# The optimised objective function value is printed to the screen
print "Total gain = ", plp.value(prob.objective)

目标是 3,540。

如何运行的演示是 here .

关于algorithm - 基于多约束算法找到最优值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35016448/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com