约束式编程学习笔记[2] 优化问题示例 约束编程总体框架

约束式编程学习笔记[2] #202109272 Constraint satisfaction problems: examples2.6 Constrained optimization problems3 Constraint programming in a nutshell3.1 Equivalence of CSPs3.2 Basic framework for constraint programming3.2 (2) Constraint Propagation2 Constraint s
摘要由CSDN通过智能技术生成

2 Constraint satisfaction problems: examples

2.6 Constrained optimization problems

  1. Q: 叙述背包问题的约束和objective function
    A: 约束: ∑ a i x i ≤ v \sum a_i x_i\le v aixiv,其中 a i a_i ai是“重量”。目标函数: ∑ b i x i \sum b_ix_i bixi,其中 b i b_i bi是“价值”。
  2. Q: 为什么硬币问题中要引入600个变量?
    A: 本质是用枚举把 ∀ i ∃ x j \forall i \exists x_j ixj中的存在量词(不好求解)转化成实实在在存在的594个变量。虽然变量数量多了,但是容易求解。
    参考名词:“构造性数学”
  3. Q: Golomb Ruler问题中, x j − x i ≠ x l − x k x_j-x_i\ne x_l-x_k xjxi=xlxk for all different pairs ( i , j ) (i,j) (i,j) and ( k , l ) (k,l) (k,l)有什么冗余?为什么?
    A: 由于已经有 x i < x i + 1 , ∀ i ∈ { 1 , ⋯   , m − 1 } x_i<x_{i+1},\forall i\in\{1,\cdots, m-1\} xi<xi+1,i{ 1,,m1},因此只需考虑disjoint pairs,即 i ≠ k , j ≠ l i\ne k,j\ne l i=k,j=l.
    其实课本的“人工预剪枝”还有点太保守了,完全可以进一步剪去 i < k < l < j i<k<l<j i<k<l<j
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
再次简化代码,取消串口,直接显示结果,仍然有问题!!<br><br>疑问代码如下: <br>struct _USB_DATA_STRUCT<br>{<br>/* <br> unsigned char command_data[40];//release结果正确<br> int command_index;<br> int command_size;<br> int numofnod;<br>*/<br> int command_index;<br> int command_size;<br> int numofnod;<br> unsigned char command_data[40];//release结果错误<br><br> void SetData(unsigned char* pdata,int size)<br> {<br> if(size>40)<br> {<br> AfxMessageBox("数据太大,超范围!");<br> return;<br> }<br> memcpy(command_data,pdata,size);<br> }<br>};<br><br>void CTestprjDlg::OnButton1() <br>{<br> // TODO: Add your control notification handler code here<br> unsigned char ctem[32];//错误:32,103,104; 正确:105,110<br> <br> USB_DATA_STRUCT CommandData;//需要填写要发送的数据<br><br> ctem[0]=0xee;<br> ctem[1]=0x01;<br> memset(ctem+2,0x00,30);<br> <br> CommandData.SetData(ctem,32);<br><br> ShowTest(CommandData.command_data,32);<br>}<br><br>void CTestprjDlg::ShowTest(unsigned char* p,int nlen)<br>{<br> CString str = _T(""); <br> for(int i=0;i <32;i++) <br> { <br> CString tmp_str; <br> tmp_str.Format("0x%02X ", p[i]); <br> str += tmp_str; <br> } <br> m_textctrl.SetWindowText(str);<br>}<br><br>//VC6 <br><br>Debug版本没有问题,输出如: <br>EE 01 00 00 00...后面全0 <br>Release版本(按Maximize speed优化)有问题,输出如: <br>EE 01 00 00 00 00 00 00 00 00 00 00 EE 01 00 00 00 00 00 00 00 00 00 00 EE 01 00 00 00 00 00 00 <br><br>Release版本下,按以下修改没有问题。 <br>1.调整ctem的大小。小于等于104有问题,大于等于105没有问题。 <br>2.将ctem改为char* ctem; <br> ctem=new char[32]; <br> 没有问题。 <br><br>3.优化由Maximize speed修改为Minimize code也没问题。 <br><br>请教可能是什么原因?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值