我建立了一个NBA阵容生成器,可以根据每个球员的预测,优化9个位置的阵容(2个控球后卫,2个得分后卫,2个小前锋,2个大前锋,1个中锋)。
最初,为了处理可以打两个位置的球员,我设置了一个限制,阻止同一名球员在一个阵容中被选中两次,这是正确的。我遇到的问题是,偶尔当我构建多个阵容时,其中两个将是重复的,但程序认为它们是不同的。
Generator的版本1
例如,玩家a和玩家B都被选中,但他们都是双位置球员,他们共享相同的双位置(例如,他们都可以是PG或SG),因为生成器将交换他们,在阵容1中,玩家a被选为PG和B作为SG,在阵容2中,玩家a被选为SG和B作为PG。
我在第一个版本中约束位置的代码如下:
prob += (pulp.lpSum(self.positions['PG'][i] * players_lineup[i] for i in range(self.num_players)) == 2)
prob += (pulp.lpSum(self.positions['SG'][i] * players_lineup[i] for i in range(self.num_players)) == 2)
prob += (pulp.lpSum(self.positions['SF'][i] * players_lineup[i] for i in range(self.num_players)) == 2)
prob += (pulp.lpSum(self.positions['PF'][i] * players_lineup[i] for i in range(self.num_players)) == 2)
prob += (pulp.lpSum(self.positions['C'][i] * players_lineup[i] for i in range(self.num_players)) == 1)
因为程序将PG版本的玩家A和SG版本的玩家A视为独立的实体,它实际上已经改变了结果(尽管功能相同)。
生成器版本2
所以我创建了一个更新的版本,每个玩家都有一个位置1和一个位置2(如果玩家没有第二个位置,可以没有)。我在这里遇到的问题是,我现在可以生成一个符合以下示例约束的阵容,但该阵容在技术上是不正确的。首先,我将提供我的新约束,然后我将解释我的问题。
#Ensures that the lineup has at least 2 potential suitors for PG
prob += (pulp.lpSum(self.positions['PG'][i] * players_lineup[i] for i in range(self.num_players)) >= 2)
# Ensures that the lineup has no more than 2 players who can only play PG
prob += (pulp.lpSum(
self.positions['PG'][i] * self.dualPosition[i] * players_lineup[i] for i in range(self.num_players)) <=2)
#Ensures that the lineup has at least 2 potential suitors for SG
prob += (pulp.lpSum(self.positions['SG'][i] * players_lineup[i] for i in range(self.num_players)) >= 2)
# Ensures that the lineup has no more than 2 players who can only play SG
prob += (pulp.lpSum(
self.positions['SG'][i] * self.dualPosition[i] * players_lineup[i] for i in range(self.num_players)) <= 2)
#Ensures that the lineup has at least 2 potential suitors for SF
prob += (pulp.lpSum(self.positions['SF'][i] * players_lineup[i] for i in range(self.num_players)) >= 2)
# Ensures that the lineup has no more than 2 players who can only play SF
prob += (pulp.lpSum(
self.positions['SF'][i] * self.dualPosition[i] * players_lineup[i] for i in range(self.num_players)) <= 2)
#Ensures that the lineup has at least 2 potential suitors for PF
prob += (pulp.lpSum(self.positions['PF'][i] * players_lineup[i] for i in range(self.num_players)) >= 2)
# Ensures that the lineup has no more than 2 players who can only play PF
prob += (pulp.lpSum(
self.positions['PF'][i] * self.dualPosition[i] * players_lineup[i] for i in range(self.num_players)) <= 2)
#Ensures that the lineup has at least 1 potential suitor for C
prob += (pulp.lpSum(self.positions['C'][i] * players_lineup[i] for i in range(self.num_players)) >= 1)
# Ensures that the lineup has no more than 1 player who can only play C
prob += (pulp.lpSum(
self.positions['C'][i] * self.dualPosition[i] * players_lineup[i] for i in range(self.num_players)) <= 1)
我在这里面临的问题是,约束条件得到满足,但他们显然没有达到我想要他们哈哈!我发现正在构建如下的队列:
我认为如果你重新表述你的问题,你会快乐得多。对于一个整数程序来说,用一组球员和一组位置对它进行双索引是很自然的。在你的约束条件中,事情会变得更加清晰,因为你可以将玩家或位置相加,从而更清楚地表达你的问题。我真的不清楚你们的许多模型项目是什么,比如positions[i]
和dualPositions[i]
。这里有一个玩具模型,可以帮助你思考如何对这个坏男孩进行双索引…
注意,有几种方法可以处理"法律转让";一部分原因。下面是如何做到这一点的一个概念。
# hoops dream team
from pulp import *
salaries = {'bob' : 100,
'steve' : 110,
'bernie': 105,
'eugene': 120,
'biff' : 115,
'reggie': 99,
'mike' : 102}
positions = {'PG','FWD', 'CTR'}
legal_assignments = { 'bob' : {'PG'},
'steve' : {'PG', 'FWD'},
'bernie': {'FWD', 'CTR'},
'eugene': {'FWD', 'PG'},
'biff' : {'PG'},
'reggie': {'CTR', 'FWD'},
'mike' : {'FWD'}}
legal_assignments_set = { (k,v) for k in legal_assignments.keys() for v in legal_assignments[k]}
prob = LpProblem("Team", LpMinimize)
assign = LpVariable.dicts("assignment", legal_assignments_set, cat="Binary")
#minimize cost of team
prob += sum(assign[player, pos] * salaries[player] for (player, pos) in legal_assignments_set)
# constraints...
# only assign each player once
for player in salaries.keys():
prob += sum(assign[player, pos] for pos in positions if (player, pos) in legal_assignments_set) <=1
# fill each position to 2 PG, 2 FWD, 1 CTR
prob += sum(assign[player, 'PG'] for player in salaries.keys() if (player, 'PG') in legal_assignments_set) == 2
prob += sum(assign[player, 'FWD'] for player in salaries.keys() if (player, 'FWD') in legal_assignments_set) == 2
prob += sum(assign[player, 'CTR'] for player in salaries.keys() if (player, 'CTR') in legal_assignments_set) == 1
prob.solve()
print('Status:', LpStatus[prob.status])
for v in prob.variables():
print(v.name, '=', v.varValue)
相关内容
- Python PULP -阵容生成器的位置约束
- 与位置相关的线性规划约束设置
- UILabel的位置没有更新,即使改变了按钮点击的约束
- 错误:googleapi: Error 400:指定的位置约束无效.,无效
- 如何在kotlin android中更改按钮位置向下(约束布局)?单击按钮后,我需要显示消息的空间
- AWS预签名的URLS位置约束与此请求发送到的特定于区域的终结点不兼容
- 当我们设置框架或更改受自动布局约束的视图的位置时会发生什么
- Amazon s3Exception Hadoops s3a 中的错误请求和位置约束
- 无效位置约束错误,当使用的命令是时,创建 S3 存储桶
- 多行标签因位置约束而中断
- 机器人手臂的位置约束目标:无法构建目标表示
- 如何在搅拌机中添加对象的位置约束
- iOS快速动画位置 约束
- 如何使CNN学习位置约束
- 位置约束上的 C# 泛型类型
- Docker-Compose组合的位置约束是否在Docker-Compose.yml中
- XCode中错位标签 /错误的位置约束
- 由于位置约束而引起的空白空白
- X位置约束未以编程方式更新-Xcode中的Swift
- Xcode 6:在所有设备上,按钮是否停留在图像视图的特定位置?约束
最新更新
- yii2查询具有多个非和或的数据提供程序
- Libgdx:渲染方法
- Pycharm 错误:预期类型 [类名] 改为"str"
- 运行我的代码时出现错误:未知的自定义元素
- 在Selenium 4中使用Behat和Mink Selenium2驱动程序为Microsoft Edge浏览器运行测试
- 宽度未知的可变列数
- 我必须在.env文件中存储哨兵公钥吗?
- Mongodb子文档没有自动生成对象id Typegoose/ mongoose
- 类型中构造函数的参数 0 需要找不到类型为"org.hibernate.SessionFactory"的 Bean
- 根据r中的日期和小时每隔15分钟聚合数据
- 如何解决关于Optuna存储的错误?
- c语言中OO继承的混叠问题
- launchWebAuthFlow窗口在chrome扩展关闭后保持打开
- 使用非初始结构变量作为参数调用函数不会产生警告
- Pytorch - mat1和mat2形状不能相乘(3328x13和9216x4096)
- 我如何得到一个节点超时的内部id使用符号没有硬编码查找索引?
- spring引导应用程序读取另一个jar的应用程序配置值吗?
- 如何在main.js中导入javascript库以在整个vue应用程序中获得全局可用性?
- 使段落出现,并使其在点击显示下一个段落时消失
- GROUP_CONCAT(DISTINCT xxx)将连接值的顺序颠倒
- r语言 - 循环遍历列表的列表
- 如何使用Pandas数据框架将R代码语法转换为Python语法?
- 当我运行服务器我得到这个错误:Django 405错误
- 如何将列表中的每个数字与另一个列表中的每个数字相乘
- 用其他字典中的值替换字典中值列表中的元素
- super() 不能递增父类的类变量,但它会更新父类的类字典
- Java中的冗余赋值vs赋值前检查
- 输入数据量变化;需要的建议
- 根据键合并两个数组,并使用mongo聚合添加新字段
- 显示头表,从数组的子列- Angular
热门标签:
javascript python java c# php android html jquery c++ css ios sql mysql arrays asp.net json python-3.x ruby-on-rails .net sql-server django objective-c excel regex ruby linux ajax iphone xml vba spring asp.net-mvc database wordpress string postgresql wpf windows xcode bash git oracle list vb.net multithreading eclipse algorithm macos powershell visual-studio image forms numpy scala function api selenium