我有一个优化问题,我有一个“BoolVar”对象列表的列表。所以像这样:
[[BoolVar1,BoolVar2],[BoolVar3, BoolVar4],[BoolVar5,BoolVar6]]
Run Code Online (Sandbox Code Playgroud)
我需要评估以下内容:
(BoolVar1 && BoolVar2) || (BoolVar3 && BoolVar4) || (BoolVar5 && BoolVar6)
Run Code Online (Sandbox Code Playgroud)
我是否必须按如下方式执行此操作:
and12 = model.NewBoolVar("and12")
model.Add(and12 == True).OnlyEnforceIf([BoolVar1,BoolVar2])
and34 = model.NewBoolVar("and34")
model.Add(and34 == True).OnlyEnforceIf([BoolVar3,BoolVar4])
and56 = model.NewBoolVar("and56")
model.Add(and56 == True).OnlyEnforceIf([BoolVar5,BoolVar6])
model.AddBoolOr([and12,and34,and56])
Run Code Online (Sandbox Code Playgroud)
我已经尝试过这段代码,它似乎有效,但由于“OnlyEnforceIf”功能,我对此表示怀疑。如果不强制执行会怎样?那么 and12 是否设置为 False,或者可以是 False 或 True,因为此后该等式不再强制执行?我根据这篇文章找到了这段代码。
想象一下我有两个(python)列表(具有有限的)3D 点数量。如何找到一个刚性变换来尽可能紧密地匹配这些点。对于每个列表的每个点,已知该点对应于哪个其他点。有这方面的算法/库吗?
我找到了迭代最近点算法,但这假设没有已知的对应关系,并且它似乎是针对大型点云而设计的。我说的是 3 到 8 点的有限组。
可能的点集(根据列表中的索引对应)
a = [[0,0,0], [1,0,0],[0,1,0]]
b = [[0,0,0.5], [1,0,1],[0,0,2]]
Run Code Online (Sandbox Code Playgroud) 设置
我使用 google OR 工具作为约束编程求解器:
from ortools.sat.python import cp_model
Run Code Online (Sandbox Code Playgroud)
我定义了以下 BoolVars
model = cp_model.CpModel()
a = model.NewBoolVar("a")
b = model.NewBoolVar("b")
c = model.NewBoolVar("c")
d = model.NewBoolVar("d")
e = model.NewBoolVar("e")
f = model.NewBoolVar("f")
g = model.NewBoolVar("g")
Run Code Online (Sandbox Code Playgroud)
问题
我需要向模型添加复杂的布尔约束。就像是
(a || b) && (d || e) == g
Run Code Online (Sandbox Code Playgroud)
如何将这样的复杂布尔约束添加到模型中?
PS:我无法立即在网上找到此信息,但根据我在此处的相关问题和此处另一个人的另一个相关问题上得到的答案找到了解决方案。我以问答的形式总结了我的发现,希望它们对某人有用。
我正在尝试将一个 numpy 数组转换为一个MemoryView对象,因为我必须在两个程序之间进行通信。一个只能处理 NumPy 数组,另一个只能处理 MemoryView 对象。
从 MemoryView 转换为 numpy 数组很容易通过以下方式完成:
import numpy as np
MyNumpyArray=np.array(MyMemoryView)
Run Code Online (Sandbox Code Playgroud)
但是如何将 numpy 数组转换为 MemoryView?
我在这里找到:https : //docs.python.org/3/c-api/memoryview.html 有一个 PyMemoryView_FromObject(PyObject *obj) 函数,但我不知道如何在没有示例的情况下调用它。
谢谢!